অন্যান্য প্রোগ্রামগুলি জিপিআরফ হিসাবে একই জিনিস করে?
অন্যান্য প্রোগ্রামগুলি জিপিআরফ হিসাবে একই জিনিস করে?
উত্তর:
Valgrind- র একটি খুব সুন্দর ভিজুয়ালাইজার নামক সঙ্গে একটি নির্দেশ গোনা প্রোফাইলার হয়েছে KCacheGrind । মাইক ডুনলাভে যেমন সুপারিশ করেছেন, ভালগ্র্যান্ড নির্দেশাবলীর যে অংশের জন্য স্ট্যাকের উপরে লাইভ রয়েছে তা গণনা করেছেন, যদিও আমি দু: খ প্রকাশ করে বলছি যে এটি পারস্পরিক পুনর্বিবেচনার উপস্থিতিতে বিভ্রান্ত হয়ে গেছে বলে মনে হচ্ছে। তবে ভিজ্যুয়ালাইজারটি খুব সুন্দর এবং হালকা বছর আগে gprof
।
gprof (কাগজ পড়ুন) historical তিহাসিক কারণে বিদ্যমান। আপনি যদি মনে করেন এটি পারফরম্যান্সের সমস্যাগুলি খুঁজতে আপনাকে সহায়তা করবে, এটি এর আগে কখনও বিজ্ঞাপন দেওয়া হয়নি। কাগজটি যা বলেছে তা এখানে:
প্রোপেলটি বিভিন্ন বাস্তবায়নের ব্যয়ের তুলনা এবং মূল্যায়ন করতে ব্যবহার করা যেতে পারে।
এটি বলে না যে এটি মূল্যায়ন করার জন্য বিভিন্ন বাস্তবায়ন সনাক্ত করতে ব্যবহার করা যেতে পারে, যদিও এটি বোঝায় যে এটি বিশেষ পরিস্থিতিতে, এটি করতে পারে:
বিশেষত যদি প্রোগ্রামটির ছোট্ট অংশগুলি এটির প্রয়োগের সময়টিকে প্রাধান্য দেয়।
এত সমস্যাযুক্ত যে সমস্যা নেই? তাদের কি কিছু আসে যায় না? জিপিআরএফ- তে এমন প্রত্যাশা রাখবেন না যা এর জন্য কখনও দাবি করা হয়নি। এটি কেবলমাত্র পরিমাপের সরঞ্জাম এবং কেবলমাত্র সিপিইউ-ভিত্তিক অপারেশন।
পরিবর্তে এটি চেষ্টা করুন।
এখানে 44x গতির একটি উদাহরণ রয়েছে।
এখানে একটি 730x স্পিডআপ।
এখানে একটি 8 মিনিটের ভিডিও প্রদর্শন রয়েছে।
এখানে পরিসংখ্যান একটি ব্যাখ্যা।
সমালোচনার একটি উত্তর এখানে।
প্রোগ্রাম সম্পর্কে একটি সাধারণ পর্যবেক্ষণ আছে। প্রদত্ত নির্বাহের ক্ষেত্রে প্রতিটি নির্দেশ সামগ্রিক সময়ের কিছু অংশের (বিশেষত call
নির্দেশাবলীর) জন্য দায়ী , এই অর্থে যে এটি যদি না থাকে তবে সময় ব্যয় হত না। সেই সময়ের মধ্যে, নির্দেশটি স্ট্যাকের উপরে রয়েছে **। যখন এটি বোঝা যাবে, আপনি এটি দেখতে পারেন -
জি.আর.পি.ফ কর্মক্ষমতা সম্পর্কে কিছু মিথকথাকে মূর্ত করে তোলে যেমন:
প্রোগ্রামের কাউন্টার স্যাম্পলিং দরকারী।
এটি কেবলমাত্র তখনই কার্যকর যখন আপনার একটি অপ্রয়োজনীয় হটস্পট বাধা যেমন যেমন স্কেলারের মানগুলির একটি বৃহত অ্যারের বুদ্বুদ সাজান। উদাহরণস্বরূপ, আপনি যত তাড়াতাড়ি স্ট্রিং-তুলনা ব্যবহার করে এটিকে সাজানোর ক্ষেত্রে পরিবর্তন করুন, এটি এখনও একটি বাধা but অন্যদিকে যদি এটি প্রসারিত প্রোগ্রামের কাউন্টার (কল স্ট্যাক) কে নমুনা দেয় তবে স্ট্রিং-তুলনা বলা হয় এমন বিন্দুটি সাজানোর লুপটি স্পষ্টভাবে প্রদর্শিত হয়। প্রকৃতপক্ষে, gprof ছিল কেবলমাত্র পিসি-স্যাম্পলিংয়ের সীমাবদ্ধতার প্রতিকার করার একটি প্রচেষ্টা।
সময় গ্রহণের কোডগুলি সময় গ্রহণের চেয়ে সময় নির্ধারণের কাজগুলি আরও গুরুত্বপূর্ণ।
এই পৌরাণিক কাহিনীর কারণ হ'ল gprof স্ট্যাক নমুনাগুলি ক্যাপচার করতে সক্ষম ছিল না, সুতরাং পরিবর্তে এটি কার্য সম্পাদন করে, তাদের প্রার্থনার গণনা করে এবং কল গ্রাফ ক্যাপচার করার চেষ্টা করে। যাইহোক, একবার কোনও ব্যয়বহুল ফাংশন শনাক্ত হয়ে গেলে, আপনার এখনও সময়ের জন্য দায়ী রেখাগুলির জন্য এটির ভিতরে নজর রাখা দরকার। যদি সেখানে স্ট্যাক স্যাম্পল থাকে তবে আপনাকে দেখার দরকার নেই, সেই লাইনগুলি নমুনাগুলিতে থাকবে। (একটি সাধারণ ফাংশনটিতে 100 - 1000 নির্দেশাবলী থাকতে পারে A একটি ফাংশন কল 1 নির্দেশনা, যাতে ব্যয়বহুল কলগুলি সনাক্ত করে এমন কোনও কিছু 2-3 মাত্রার মাত্রা আরও সুনির্দিষ্ট হয়))
যে কল গ্রাফ গুরুত্বপূর্ণ।
কোন প্রোগ্রাম সম্পর্কে আপনার যা জানা দরকার তা এটি যেখানে সময় ব্যয় করে তা নয় but why। যখন এটি কোনও ফাংশনে সময় ব্যয় করে, স্ট্যাকের কোডের প্রতিটি লাইন এটি কেন আছে তা নিয়ে যুক্তির শৃঙ্খলে একটি লিঙ্ক দেয়। যদি আপনি কেবল স্ট্যাকের কিছু অংশ দেখতে পান তবে আপনি কেবল কারণটির কিছু অংশ দেখতে পাচ্ছেন, সুতরাং সেই সময়টি আসলে প্রয়োজনীয় কিনা তা আপনি নিশ্চিতভাবে বলতে পারবেন না। কল গ্রাফ আপনাকে কী বলে? প্রতিটি চাপ আপনাকে বলে যে কিছু ফাংশন এ সময়ের কিছু অংশের জন্য কিছু ফাংশন বি কল করার প্রক্রিয়াধীন ছিল। এমনকি বি এর কাছে কল করার কোডের এ জাতীয় একটি মাত্র লাইন থাকলেও, এই লাইনটি কারণের একটি ছোট্ট অংশ দেয়। আপনি যদি যথেষ্ট ভাগ্যবান হন তবে সেই লাইনের কোনও দুর্বল কারণ থাকতে পারে। সাধারণত, দুর্বল কারণ খুঁজে পেতে আপনাকে একযোগে একাধিক লাইন দেখতে হবে। যদি A একাধিক স্থানে বি কে কল করে তবে এটি আপনাকে আরও কম বলে।
পুনরাবৃত্তি একটি জটিল বিভ্রান্তিমূলক বিষয়।
এটি কেবলমাত্র কারণ জিপিআরএফ এবং অন্যান্য প্রোফাইলাররা একটি কল-গ্রাফ তৈরি করার প্রয়োজনীয়তা অনুধাবন করে এবং তারপরে নোডগুলিতে গুণিত করে। যদি কারও কাছে স্ট্যাকের নমুনা থাকে, স্যাম্পলগুলিতে প্রদর্শিত প্রতিটি কোডের লাইনটির সময় ব্যয় একটি খুব সাধারণ সংখ্যা - এটি স্যাম্পলগুলির ভগ্নাংশ। যদি পুনরাবৃত্তি হয়, তবে একটি প্রদত্ত রেখা একটি নমুনায় একাধিকবার উপস্থিত হতে পারে।
কোনো ব্যাপার না. ধরুন নমুনাগুলি প্রতিটি এনএস এমএস নেওয়া হয় এবং লাইনটি তাদের এফ% তে প্রদর্শিত হয় (এককভাবে বা না) যদি সেই লাইনটি কোনও সময় না নেওয়ার জন্য তৈরি করা যায় (যেমন এটি মুছে ফেলা বা তার চারপাশে শাখা করে), তবে সেই নমুনাগুলি অদৃশ্য হয়ে যাবে এবং সময়টি F% দ্বারা হ্রাস পাবে।
সময় পরিমাপের সঠিকতা (এবং সেইজন্য প্রচুর নমুনা) গুরুত্বপূর্ণ important
এক সেকেন্ডের জন্য এটি সম্পর্কে চিন্তা করুন। কোডের একটি লাইন যদি পাঁচটির মধ্যে 3 টি নমুনায় থাকে তবে আপনি যদি এটি একটি হালকা বাল্বের মতো গুলি করতে পারেন তবে এটি প্রায় 60% কম সময় ব্যবহৃত হবে। এখন, আপনি জানেন যে আপনি যদি অন্য 5 টি নমুনা নিয়ে থাকেন তবে আপনি এটি কেবল 2 বার বা 4 টির মতো দেখতে পেয়েছেন So সুতরাং 60% পরিমাপ 40% থেকে 80% পর্যন্ত সাধারণ পরিসরের মতো। যদি এটি কেবল 40% হত, আপনি কি বলবেন যে সমস্যাটি ঠিক করার মতো নয়? সুতরাং সময়ের যথার্থতার বিন্দুটি কী, যখন আপনি সত্যিকার অর্থেই সমস্যাগুলি অনুসন্ধান করতে চান ? 500 বা 5000 নমুনাগুলি আরও বৃহত্তর নির্ভুলতার সাথে সমস্যাটি পরিমাপ করত তবে আরও সঠিকভাবে এটি খুঁজে পেত না।
বিবৃতি বা ফাংশন আমন্ত্রণের গণনা কার্যকর।
মনে করুন আপনি জানেন যে কোনও ফাংশন 1000 বার বলা হয়েছে। আপনি কি বলতে পারেন যে এটির কতটা সময় ব্যয় হয়? আপনার এটিও জানতে হবে যে এটি চালাতে কত সময় লাগে, গড় হিসাবে, এটি গণনা দ্বারা গুণ করে এবং মোট সময় দ্বারা ভাগ করে নেওয়া। গড় প্রার্থনার সময় ন্যানোসেকেন্ড থেকে সেকেন্ডে আলাদা হতে পারে, তাই একা গণনা খুব বেশি কিছু বলে না। যদি স্ট্যাকের নমুনা থাকে তবে একটি রুটিন বা কোনও বিবৃতি ব্যয় হ'ল এটি স্যাম্পলগুলির ভগ্নাংশ। সময়ের সেই ভগ্নাংশটি হ'ল নীতিগতভাবে সামগ্রিকভাবে কীভাবে সংরক্ষণ করা যেতে পারে যদি রুটিন বা বিবৃতিতে কোনও সময় না নেওয়া যায়, সুতরাং পারফরম্যান্সের সাথে এটিই সর্বাধিক প্রত্যক্ষ সম্পর্ক।
অবরুদ্ধ অবস্থায় নমুনাগুলি নেওয়া প্রয়োজন হবে না
এই কল্পকাহিনীর কারণগুলি দ্বিগুণ: 1) প্রোগ্রামের অপেক্ষায় থাকা পিসি স্যাম্পলিং অর্থহীন এবং 2) সময়ের যথার্থতার সাথে ব্যস্ততা। তবে, (1) এর জন্য প্রোগ্রামটি খুব ভালভাবে অপেক্ষা করছে এমন কোনও কিছুর জন্য অপেক্ষা করছে, যেমন ফাইল I / O, যা আপনার জানা দরকার এবং কোন স্ট্যাকের নমুনাগুলি প্রকাশিত হয় be (স্পষ্টতই আপনি ব্যবহারকারীর ইনপুটটির জন্য অপেক্ষা করার সময় নমুনাগুলি বাদ দিতে চান)) (2) যদি প্রোগ্রামটি কেবল অন্য প্রক্রিয়াগুলির সাথে প্রতিযোগিতার কারণে অপেক্ষা করে থাকে, সম্ভবত এটি চলমান অবস্থায় মোটামুটি এলোমেলোভাবে ঘটে। সুতরাং যখন প্রোগ্রামটি আরও বেশি সময় নিচ্ছে, তবে এটি পরিসংখ্যানগুলির ক্ষেত্রে বড় প্রভাব ফেলবে না, বিবৃতি স্ট্যাকের যে শতাংশে রয়েছে তার কত শতাংশ।
এই "স্ব-সময়" বিষয়গুলি
স্ব-সময় কেবল তখনই বোধগম্য হয় যদি আপনি লাইন স্তরের নয়, ফাংশন স্তরে পরিমাপ করছেন এবং যদি আপনি মনে করেন যে ফাংশন সময়টি খালি রুটিনগুলির তুলনায় খাঁটি স্থানীয় গণনাতে চলে যায় তবে তা বুঝতে আপনাকে সহায়তা করতে হবে। লাইন স্তরে সংক্ষিপ্তসার হিসাবে, স্ট্যাকের শেষে থাকলে একটি লাইন স্ব-সময়কে উপস্থাপন করে, অন্যথায় এটি অন্তর্ভুক্তিক সময়কে উপস্থাপন করে। যেভাবেই হোক, এটির ব্যয়টি হ'ল এটি যে পরিমাণ স্ট্যাক নমুনাগুলি রয়েছে তার শতাংশ, যাতে এটি উভয় ক্ষেত্রেই এটি আপনার জন্য চিহ্নিত করে।
নমুনাগুলি উচ্চ ফ্রিকোয়েন্সিতে নিতে হবে
এটি এই ধারণা থেকে আসে যে কোনও পারফরম্যান্স সমস্যা দ্রুত-অভিনয় হতে পারে এবং নমুনাগুলি আঘাত করার জন্য ঘন ঘন থাকতে হয়। তবে, যদি সমস্যাটির ব্যয় হয়, 20%, বলুন, মোট চলমান 10 সেকেন্ডের (বা যাই হোক না কেন) এর মধ্যে, তবে মোট সময়টিতে প্রতিটি নমুনায় এটি মারার 20% সম্ভাবনা থাকবে, সমস্যাটি দেখা দেয় না কেন এই জাতীয় একক টুকরোতে
.....XXXXXXXX...........................
.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^
(২০ টি নমুনা, ৪ টি হিট)
বা অনেকগুলি ছোট ছোট টুকরোতে
X...X...X.X..X.........X.....X....X.....
.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^
(২০ টি নমুনা, ৩ টি হিট)
যেভাবেই হোক, হিটগুলির সংখ্যা গড়ে 5 হিসাবে 1 হবে, যতই নমুনা নেওয়া হয় না, বা কত কম। (গড় = 20 * 0.2 = 4. স্ট্যান্ডার্ড বিচ্যুতি = +/- স্কয়ার্ট (20 * 0.2 * 0.8) = 1.8।)
আপনি খোঁজার চেষ্টা করছেন বোতলের
যেন ছিল কেবল এক। নিম্নলিখিত কার্যনির্বাহনের সময়রেখা বিবেচনা করুন: vxvWvzvWvxvWvYvWvxvWv.vWvxvWvYvW
এতে প্রকৃত উপকারী কাজ থাকে যা প্রতিনিধিত্ব করে .
। vWxYz
যথাক্রমে 1/2, 1/4, 1/8, 1/16, 1/32 সময় নেওয়ার ক্ষেত্রে পারফরম্যান্স সমস্যা রয়েছে । নমুনা v
সহজেই খুঁজে পায় । এটি মুছে ফেলা হয়েছে,
xWzWxWYWxW.WxWYW
এখন ছেড়ে প্রোগ্রামটি চালাতে W
আধ ঘন্টা সময় নেয় এবং এখন অর্ধেক সময় নেয় এবং সহজেই পাওয়া যায়। এটি মুছে ফেলা হয়, রেখে
xzxYx.xY
এই প্রক্রিয়াটি চলতে থাকে, প্রতিবারের চেয়ে বড় সরিয়ে, পারফরম্যান্স সমস্যা, যতক্ষণ না অপসারণ করার মতো কিছু পাওয়া যায় না। এখন কেবলমাত্র মৃত্যুদন্ড কার্যকর করা হ'ল .
, যা মূল প্রোগ্রাম দ্বারা ব্যবহৃত 1/332 সময় কার্যকর করে। এই ম্যাগনিফিকেশন প্রভাব, যার দ্বারা যেকোন সমস্যা অপসারণ করলে বাকী শতাংশকে আরও বড় করে তোলে, কারণ হরক হ্রাস পেয়েছে।
আর একটি গুরুত্বপূর্ণ বিষয়টি হ'ল প্রতিটি একক সমস্যা অবশ্যই খুঁজে পেতে হবে - ৫ টির মধ্যে একটিও অনুপস্থিত Any কিছু খুঁজে পাওয়া, তবে সবগুলিই "যথেষ্ট ভাল" নয়।
সংযুক্ত: আমি জিপিআরএফ জনপ্রিয় হবার একটি কারণ উল্লেখ করতে চাই - সম্ভবত এটি নিখরচায়, শেখানো সহজ কারণ এটি শেখানো হচ্ছে, এবং এটি দীর্ঘ সময় ধরে চলেছে । একটি দ্রুত গুগল অনুসন্ধান এমন একাডেমিক প্রতিষ্ঠানকে সনাক্ত করে যা এটি শেখায় (বা প্রদর্শিত হবে):
বার্কলে বু প্লিমসন কলোরাডো ডিউক এয়ারলহাম ফসু ইন্ডিয়ানা মিট এম এস এস এনসিএসএইলিনয়েস এনসিএসু নিউ ইউ ইউ প্রিন্সটন পিএসইউ স্ট্যানফোর্ড ইউসিএসডি ইউএমডি ইউমিচ ইউটিএইচ ইউটিএক্স ইউটেক্স ওয়াস্টল
** কাজ করার অনুরোধ করার অন্যান্য উপায়গুলি বাদ দিয়ে, কেন বার্তা পোস্ট করে যেমন বলা হচ্ছে তা খুঁজে বের করবেন না ।
যেহেতু আমি এখানে কিছু দেখিনি perf
লিনাক্সে কার্নেল এবং ব্যবহারকারী অ্যাপ্লিকেশনগুলির প্রোফাইলের তুলনামূলকভাবে নতুন সরঞ্জাম হিসাবে এমন আমি এই তথ্যটি যুক্ত করার সিদ্ধান্ত নিয়েছি।
প্রথমত - এটি লিনাক্স প্রোফাইলিং সম্পর্কিত একটি টিউটোরিয়ালperf
perf
আপনার লিনাক্স কার্নেলটি ২.6.৩২ এর চেয়ে বেশি বা এটির চেয়ে বেশি হলে আপনি ব্যবহার করতে পারেন oprofile
। উভয় প্রোগ্রাম আপনার কাছ থেকে আপনার প্রোগ্রাম ইনস্ট্রুমেন্ট (যেমন gprof
প্রয়োজন) প্রয়োজন হয় না। তবে কল গ্রাফটি সঠিকভাবে perf
পাওয়ার জন্য আপনাকে নিজের সাথে প্রোগ্রাম তৈরি করতে হবে -fno-omit-frame-pointer
। উদাহরণ স্বরূপ:g++ -fno-omit-frame-pointer -O2 main.cpp
।
আপনি এর সাথে আপনার অ্যাপ্লিকেশনটির "লাইভ" বিশ্লেষণ দেখতে পাবেন perf top
:
sudo perf top -p `pidof a.out` -K
অথবা আপনি কোনও চলমান অ্যাপ্লিকেশনটির পারফরম্যান্স ডেটা রেকর্ড করতে পারেন এবং তার পরে তাদের বিশ্লেষণ করতে পারেন:
1) পারফরম্যান্স ডেটা রেকর্ড করতে:
perf record -p `pidof a.out`
বা 10 সেকেন্ডের জন্য রেকর্ড করতে:
perf record -p `pidof a.out` sleep 10
বা কল গ্রাফ দিয়ে রেকর্ড করতে ()
perf record -g -p `pidof a.out`
2) রেকর্ড করা তথ্য বিশ্লেষণ
perf report --stdio
perf report --stdio --sort=dso -g none
perf report --stdio -g none
perf report --stdio -g
অথবা আপনি কোনও অ্যাপ্লিকেশনটির পারফরম্যান্স ডেটা রেকর্ড করতে পারেন এবং কেবল তার পরে বিশ্লেষণ করতে পারেন কেবল অ্যাপ্লিকেশনটি এইভাবে চালু করে এবং এটি বেরিয়ে যাওয়ার জন্য অপেক্ষা করে:
perf record ./a.out
এটি একটি পরীক্ষা প্রোগ্রামের প্রোফাইল দেওয়ার একটি উদাহরণ
পরীক্ষার প্রোগ্রামটি ফাইল মেইন সিপিপি-তে রয়েছে (আমি বার্তাটির নীচে মেইন সিপিপি রাখব):
আমি এটি এইভাবে সংকলন:
g++ -m64 -fno-omit-frame-pointer -g main.cpp -L. -ltcmalloc_minimal -o my_test
আমি libmalloc_minimial.so
এটি ব্যবহার করি যেহেতু এটি সংকলিত হয় -fno-omit-frame-pointer
যখন libc malloc এই বিকল্পটি ব্যতীত সংকলিত বলে মনে হয়। তারপরে আমি আমার পরীক্ষার প্রোগ্রামটি চালাই
./my_test 100000000
তারপরে আমি একটি চলমান প্রক্রিয়াটির পারফরম্যান্স ডেটা রেকর্ড করি:
perf record -g -p `pidof my_test` -o ./my_test.perf.data sleep 30
তারপরে আমি প্রতি মডিউল লোড বিশ্লেষণ করি:
পারফেক্ট রিপোর্ট --stdio -g কিছুই নয় - সোর্ট কম, ডিএসও-আই ./my_test.perf.data
# Overhead Command Shared Object
# ........ ....... ............................
#
70.06% my_test my_test
28.33% my_test libtcmalloc_minimal.so.0.1.0
1.61% my_test [kernel.kallsyms]
তারপরে ফাংশন অনুযায়ী লোড বিশ্লেষণ করা হয়:
পারফ রিপোর্ট --stdio -g কিছুই না -i ./my_test.perf.data | C ++ filt
# Overhead Command Shared Object Symbol
# ........ ....... ............................ ...........................
#
29.30% my_test my_test [.] f2(long)
29.14% my_test my_test [.] f1(long)
15.17% my_test libtcmalloc_minimal.so.0.1.0 [.] operator new(unsigned long)
13.16% my_test libtcmalloc_minimal.so.0.1.0 [.] operator delete(void*)
9.44% my_test my_test [.] process_request(long)
1.01% my_test my_test [.] operator delete(void*)@plt
0.97% my_test my_test [.] operator new(unsigned long)@plt
0.20% my_test my_test [.] main
0.19% my_test [kernel.kallsyms] [k] apic_timer_interrupt
0.16% my_test [kernel.kallsyms] [k] _spin_lock
0.13% my_test [kernel.kallsyms] [k] native_write_msr_safe
and so on ...
তারপরে কল চেইনগুলি বিশ্লেষণ করা হয়:
পারফ রিপোর্ট --stdio -g গ্রাফ -i ./my_test.perf.data | C ++ filt
# Overhead Command Shared Object Symbol
# ........ ....... ............................ ...........................
#
29.30% my_test my_test [.] f2(long)
|
--- f2(long)
|
--29.01%-- process_request(long)
main
__libc_start_main
29.14% my_test my_test [.] f1(long)
|
--- f1(long)
|
|--15.05%-- process_request(long)
| main
| __libc_start_main
|
--13.79%-- f2(long)
process_request(long)
main
__libc_start_main
15.17% my_test libtcmalloc_minimal.so.0.1.0 [.] operator new(unsigned long)
|
--- operator new(unsigned long)
|
|--11.44%-- f1(long)
| |
| |--5.75%-- process_request(long)
| | main
| | __libc_start_main
| |
| --5.69%-- f2(long)
| process_request(long)
| main
| __libc_start_main
|
--3.01%-- process_request(long)
main
__libc_start_main
13.16% my_test libtcmalloc_minimal.so.0.1.0 [.] operator delete(void*)
|
--- operator delete(void*)
|
|--9.13%-- f1(long)
| |
| |--4.63%-- f2(long)
| | process_request(long)
| | main
| | __libc_start_main
| |
| --4.51%-- process_request(long)
| main
| __libc_start_main
|
|--3.05%-- process_request(long)
| main
| __libc_start_main
|
--0.80%-- f2(long)
process_request(long)
main
__libc_start_main
9.44% my_test my_test [.] process_request(long)
|
--- process_request(long)
|
--9.39%-- main
__libc_start_main
1.01% my_test my_test [.] operator delete(void*)@plt
|
--- operator delete(void*)@plt
0.97% my_test my_test [.] operator new(unsigned long)@plt
|
--- operator new(unsigned long)@plt
0.20% my_test my_test [.] main
0.19% my_test [kernel.kallsyms] [k] apic_timer_interrupt
0.16% my_test [kernel.kallsyms] [k] _spin_lock
and so on ...
সুতরাং এই মুহুর্তে আপনি জানেন যে আপনার প্রোগ্রামটি কোথায় ব্যয় করে।
এবং এটি পরীক্ষার জন্য মূল কোড:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
time_t f1(time_t time_value)
{
for (int j =0; j < 10; ++j) {
++time_value;
if (j%5 == 0) {
double *p = new double;
delete p;
}
}
return time_value;
}
time_t f2(time_t time_value)
{
for (int j =0; j < 40; ++j) {
++time_value;
}
time_value=f1(time_value);
return time_value;
}
time_t process_request(time_t time_value)
{
for (int j =0; j < 10; ++j) {
int *p = new int;
delete p;
for (int m =0; m < 10; ++m) {
++time_value;
}
}
for (int i =0; i < 10; ++i) {
time_value=f1(time_value);
time_value=f2(time_value);
}
return time_value;
}
int main(int argc, char* argv2[])
{
int number_loops = argc > 1 ? atoi(argv2[1]) : 1;
time_t time_value = time(0);
printf("number loops %d\n", number_loops);
printf("time_value: %d\n", time_value );
for (int i =0; i < number_loops; ++i) {
time_value = process_request(time_value);
}
printf("time_value: %ld\n", time_value );
return 0;
}
f1
কল করেছিল delete
। 40% (মোটামুটি) সময় process_request
কল করছিল delete
। বাকী অংশের একটি ভাল অংশ ব্যয় করা হয়েছিল new
। পরিমাপগুলি মোটামুটি, তবে হটস্পটগুলি পিনপাইনড।
As in my answer, you run it under a debugger and hit ^C at a random time and capture the stack trace
। 1) আমি মনে করি যে আপনার গ্রাহকের সার্ভারে চলমান কোনও প্রোগ্রামের জন্য পারফরম্যান্স সমস্যার বিশ্লেষণ করার প্রয়োজন হলে আপনার কৌশলটি কার্যকর নয়। 2) আমি নিশ্চিত নই যে আপনি বিভিন্ন অনুরোধগুলি পরিচালনা করে এমন প্রচুর থ্রেডযুক্ত একটি প্রোগ্রামের তথ্য পেতে আপনি এই কৌশলটি কীভাবে প্রয়োগ করেন। মানে যখন সাধারণ ছবিটি বেশ জটিল।
the problem is outside your code
, পারেন? যেহেতু আপনার পয়েন্টটি সমর্থন করার জন্য আপনার কিছু তথ্য প্রয়োজন হতে পারে। এই পরিস্থিতিতে আপনার কোনও সময় আপনার অ্যাপ্লিকেশনটির প্রোফাইল প্রয়োজন হতে পারে। আপনি কেবল আপনার গ্রাহককে জিডিবি শুরু করতে এবং সেন্টিগ্রেড চাপতে এবং কল স্ট্যাকগুলি পেতে বলতে পারবেন না। এটা আমার বক্তব্য ছিল। এটি spielwiese.fontein.de/2012/01/22/… উদাহরণ । আমার এই সমস্যা ছিল এবং প্রোফাইলিংটি অনেক সাহায্য করেছিল।
অপ্রোফাইল চেষ্টা করুন । আপনার কোডটি প্রোফাইল করার জন্য এটি একটি আরও ভাল সরঞ্জাম। আমি ইন্টেল ভিটিউনকেও পরামর্শ দেব ।
উপরের দুটি সরঞ্জাম কোডের একটি নির্দিষ্ট লাইনে ব্যয় করা সময়কে কমিয়ে দিতে পারে, আপনার কোডটি বর্নিত করতে পারে, সমাবেশ দেখায় এবং নির্দিষ্ট নির্দেশিকা কতটা লাগে। টাইম মেট্রিকের পাশাপাশি আপনি নির্দিষ্ট কাউন্টারগুলি, যেমন ক্যাশে হিট ইত্যাদিও জিজ্ঞাসা করতে পারেন
জি.আর.পি.ফ. এর বিপরীতে, আপনি দু'এর একটিও ব্যবহার করে আপনার সিস্টেমে চলমান কোনও প্রক্রিয়া / বাইনারি প্রোফাইল করতে পারেন।
গুগল পারফরম্যান্স সরঞ্জামগুলিতে প্রোফাইলার ব্যবহার করার জন্য একটি সাধারণ অন্তর্ভুক্ত। সিপিইউ পাশাপাশি হিপ প্রোফাইলার উপলব্ধ।
http://lttng.org/ আপনি যদি উচ্চ পারফরম্যান্স ট্রেসার চান want