আমি লিনাক্সে চলমান সি ++ কোডটি কীভাবে প্রোফাইল করব?


1815

আমার লিনাক্সে চলমান একটি সি ++ অ্যাপ্লিকেশন রয়েছে, যা আমি অনুকূলকরণের প্রক্রিয়াধীন। আমার কোডের কোন অঞ্চলগুলি ধীরে চলছে তা আমি কীভাবে চিহ্নিত করতে পারি?


27
আপনি যদি আপনার বিকাশের স্ট্যাক সম্পর্কে আরও তথ্য সরবরাহ করেন তবে আপনি আরও ভাল উত্তর পেতে পারেন। ইন্টেল এবং সান থেকে প্রোফাইলার রয়েছে তবে আপনাকে তাদের সংকলকগুলি ব্যবহার করতে হবে। এটি কি বিকল্প?
নাজগোব

2
এটি ইতিমধ্যে নীচের লিঙ্কটিতে উত্তর দেওয়া হয়েছে: স্ট্যাকওভারফ্লো.com/
কপিল গুপ্ত

4
উত্তরগুলির বেশিরভাগই codeপ্রোফাইলার। তবে, অগ্রাধিকার বিপরীতকরণ, ক্যাশে আলিয়াজিং, সংস্থান বিষয়বস্তু ইত্যাদি সবই অনুকূলিতকরণ এবং কার্য সম্পাদনের কারণ হতে পারে। আমি মনে করি লোকেরা আমার ধীর কোডটিতে তথ্য পড়ে । প্রায়শই জিজ্ঞাসিত প্রশ্নাগুলি এই থ্রেডটি উল্লেখ করছে।
নির্মম আওয়াজ


3
আমি এলোমেলোভাবে pstack ব্যবহার করতাম, বেশিরভাগ সময় প্রোগ্রামটি বেশিরভাগ সময় সর্বাধিক সাধারণ স্ট্যাকটি মুদ্রণ করে, সুতরাং বাধাটির দিকে ইঙ্গিত করে।
হোসে ম্যানুয়েল গোমেজ আলভারেজ

উত্তর:


1404

আপনার লক্ষ্য যদি কোনও প্রোফাইলার ব্যবহার করা হয় তবে প্রস্তাবিতগুলির মধ্যে একটি ব্যবহার করুন।

তবে, আপনি যদি তাড়াহুড়োয় হন এবং আপনার প্রোগ্রামটি সাবজেক্টিভালি ধীরে ধীরে চলার সময় আপনি নিজেই ডিবাগারের নিচে ম্যানুয়ালি বাধা দিতে পারেন, পারফরম্যান্স সমস্যাগুলি খুঁজে পাওয়ার সহজ উপায় রয়েছে।

এটি বেশ কয়েকবার বন্ধ করুন এবং প্রতিবার কল স্ট্যাকের দিকে তাকান। যদি এমন কিছু কোড থাকে যা কিছু শতাংশ সময় নষ্ট করে, 20% বা 50% বা যাই হোক না কেন, সম্ভাবনা হ'ল প্রতিটি নমুনায় আপনি এটি কার্যকর করবেন। সুতরাং, এটি প্রায় নমুনার শতাংশ যা আপনি এটি দেখতে পাবেন। এখানে কোন শিক্ষিত অনুমানের প্রয়োজন নেই। সমস্যাটি কী তা সম্পর্কে যদি আপনার যদি ধারণা থাকে তবে এটি এটি প্রমাণিত বা অস্বীকার করবে।

আপনার বিভিন্ন আকারের একাধিক কর্মক্ষমতা সমস্যা হতে পারে। আপনি যদি এর মধ্যে কোনও একটি পরিষ্কার করে ফেলেন, অবশিষ্টগুলি পরবর্তী পাসগুলিতে আরও বড় শতাংশ নেবে এবং স্পট করা সহজ হবে। এই ম্যাগনিফিকেশন প্রভাবটি যখন একাধিক সমস্যার উপরে সংশ্লেষ ঘটে তখন সত্যিকারের বিশাল গতিবেগের কারণ হতে পারে।

ক্যাভেট : প্রোগ্রামাররা তাদের নিজেরাই এটি ব্যবহার না করা পর্যন্ত এই কৌশল সম্পর্কে সন্দেহবাদী বলে মনে করেন। তারা বলবেন যে প্রোফাইলাররা আপনাকে এই তথ্য দেয়, তবে এটি কেবলমাত্র সত্য যদি তারা সম্পূর্ণ কল স্ট্যাকের নমুনা দেয় এবং তারপরে আপনাকে নমুনার একটি এলোমেলো সেট পরীক্ষা করতে দেয়। (সংক্ষিপ্তসারগুলি যেখানে অন্তর্দৃষ্টি হারিয়েছে।) কল গ্রাফগুলি আপনাকে একই তথ্য দেয় না, কারণ

  1. তারা নির্দেশ পর্যায়ে সংক্ষিপ্তসার দেয় না, এবং
  2. পুনরাবৃত্তির উপস্থিতিতে তারা বিভ্রান্তিকর সংক্ষিপ্তসার দেয়।

তারা আরও বলবে এটি কেবল খেলনা প্রোগ্রামগুলিতে কাজ করে, যখন এটি কোনও প্রোগ্রামে কাজ করে এবং বড় প্রোগ্রামগুলিতে এটি আরও ভালভাবে কাজ করে বলে মনে হয়, কারণ তাদের সন্ধানে আরও সমস্যা রয়েছে। তারা বলবে এটি কখনও কখনও এমন জিনিসগুলি খুঁজে পায় যা সমস্যা নয়, তবে আপনি যদি একবার কিছু দেখেন তবে এটি সত্য । আপনি যদি একাধিক নমুনায় সমস্যা দেখেন তবে তা আসল।

পিএস এটি জাভাতে যেমন আছে ঠিক তেমন একটি সময় থ্রেড পুলের কল-স্ট্যাক নমুনা সংগ্রহ করার উপায় থাকে তবে মাল্টি-থ্রেড প্রোগ্রামগুলিতেও এটি করা যেতে পারে।

পিপিএস মোটামুটি সাধারণতা হিসাবে, আপনার সফ্টওয়্যারটিতে বিমূর্ততার যত বেশি স্তর রয়েছে, ততই আপনি খুঁজে পেতে পারেন যে এটি পারফরম্যান্স সমস্যার কারণ (এবং স্পিডআপ পাওয়ার সুযোগ)।

যোগ করা হয়েছে : এটি সুস্পষ্ট নাও হতে পারে তবে পুনরাবৃত্তির উপস্থিতিতে স্ট্যাক স্যাম্পলিং কৌশলটি সমানভাবে ভাল কাজ করে। কারণটি হ'ল কোনও নির্দেশিকা অপসারণের মাধ্যমে যে সময়টি বাঁচানো হত তা নমুনার মধ্যে থাকা স্যাম্পলগুলির ভগ্নাংশ দ্বারা প্রায় সময় নির্ধারণ করা হয়, এটি কোনও নমুনার মধ্যে যতবার ঘটতে পারে তা নির্বিশেষে।

আমি প্রায়শই শুনি আরেকটি আপত্তি হ'ল: " এটি কোথাও এলোমেলোভাবে থামবে, এবং এটি আসল সমস্যাটি মিস করবে "। আসল সমস্যাটি কী তা সম্পর্কে পূর্ব ধারণা থাকা থেকেই এটি আসে। পারফরম্যান্স সমস্যার একটি মূল সম্পত্তি হ'ল তারা প্রত্যাশা অস্বীকার করে। স্যাম্পলিং আপনাকে কিছু সমস্যা বলে এবং আপনার প্রথম প্রতিক্রিয়া হ'ল অবিশ্বাস। এটি প্রাকৃতিক, তবে আপনি নিশ্চিত হতে পারেন যে এটি যদি সমস্যা খুঁজে পায় তবে এটি বাস্তব এবং তদ্বিপরীত।

যোগ করা হয়েছে : আমাকে কীভাবে এটি কাজ করে তার একটি বায়সিয়ান ব্যাখ্যা করতে দিন। ধরা যাক যে কিছু নির্দেশ আছে I(কল বা অন্যথায়) যা কল স্টকে fরয়েছে সেই সময়ের কিছু ভগ্নাংশ (এবং এইভাবে এটির জন্য ব্যয় হয়)। সরলতার জন্য, ধরুন আমরা কী তা জানি না fতবে ধরে নিই এটি হয় 0.1, 0.2, 0.3, ... 0.9, 1.0, এবং এই সম্ভাবনার প্রতিটিটির পূর্ব সম্ভাবনা 0.1, সুতরাং এই সমস্ত ব্যয়ের সমান সম্ভাবনা রয়েছে অবরোহী.

তারপরে ধরুন আমরা মাত্র ২ টি স্ট্যাকের নমুনা নিই এবং আমরা Iউভয় নমুনার উপর নির্দেশিকা নির্ধারিত পর্যবেক্ষণ দেখতে পাই o=2/2। এটি আমাদের ফ্রিকোয়েন্সি fসম্পর্কে নতুন অনুমান দেয়I অনুসারে এর :

Prior                                    
P(f=x) x  P(o=2/2|f=x) P(o=2/2&&f=x)  P(o=2/2&&f >= x)  P(f >= x | o=2/2)

0.1    1     1             0.1          0.1            0.25974026
0.1    0.9   0.81          0.081        0.181          0.47012987
0.1    0.8   0.64          0.064        0.245          0.636363636
0.1    0.7   0.49          0.049        0.294          0.763636364
0.1    0.6   0.36          0.036        0.33           0.857142857
0.1    0.5   0.25          0.025        0.355          0.922077922
0.1    0.4   0.16          0.016        0.371          0.963636364
0.1    0.3   0.09          0.009        0.38           0.987012987
0.1    0.2   0.04          0.004        0.384          0.997402597
0.1    0.1   0.01          0.001        0.385          1

                  P(o=2/2) 0.385                

শেষ কলামটি বলেছে যে, উদাহরণস্বরূপ, সম্ভাব্যতা f> = 0.5% 92%, পূর্বের 60% অনুমানের চেয়ে বেশি।

মনে করুন পূর্বের অনুমানগুলি আলাদা। ধরুন আমরা অনুমান করি P(f=0.1).991 (প্রায় নির্দিষ্ট), এবং অন্যান্য সমস্ত সম্ভাবনা প্রায় অসম্ভব (0.001)। অন্য কথায়, আমাদের পূর্বের নিশ্চিততা Iএটি সস্তা। তারপরে আমরা পাই:

Prior                                    
P(f=x) x  P(o=2/2|f=x) P(o=2/2&& f=x)  P(o=2/2&&f >= x)  P(f >= x | o=2/2)

0.001  1    1              0.001        0.001          0.072727273
0.001  0.9  0.81           0.00081      0.00181        0.131636364
0.001  0.8  0.64           0.00064      0.00245        0.178181818
0.001  0.7  0.49           0.00049      0.00294        0.213818182
0.001  0.6  0.36           0.00036      0.0033         0.24
0.001  0.5  0.25           0.00025      0.00355        0.258181818
0.001  0.4  0.16           0.00016      0.00371        0.269818182
0.001  0.3  0.09           0.00009      0.0038         0.276363636
0.001  0.2  0.04           0.00004      0.00384        0.279272727
0.991  0.1  0.01           0.00991      0.01375        1

                  P(o=2/2) 0.01375                

এখন এটি বলছে P(f >= 0.5)26%, পূর্ববর্তী 0.6% অনুমানের থেকে বেশি। সুতরাং বেয়েস আমাদের সম্ভাব্য ব্যয়ের আমাদের অনুমানটি আপডেট করার অনুমতি দেয়I । যদি ডেটার পরিমাণ কম হয় তবে এটি ব্যয়টি কী তা আমাদের সঠিকভাবে জানায় না, কেবলমাত্র এটি স্থির করার উপযুক্ত big

তবুও এটি দেখার আরও একটি উপায় যাকে বলা হয় উত্তরাধিকারের নিয়ম । যদি আপনি একটি মুদ্রা 2 বার ফ্লিপ করেন, এবং এটি উভয় বার শীর্ষে আসে, তবে মুদ্রার সম্ভাব্য ওজন সম্পর্কে এটি আপনাকে কী বলে? উত্তর দেওয়ার সম্মানজনক উপায়টি হল এটি একটি বিটা বিতরণ, গড় মূল্য সহ(number of hits + 1) / (number of tries + 2) = (2+1)/(2+2) = 75%

(মূলটি হ'ল আমরা Iএকাধিকবার দেখতে পাই we আমরা যদি কেবল একবার এটি দেখি, তবে তা ছাড়া আমাদের তেমন কিছু বলা যায় নাf ০> ০ ))

সুতরাং, এমনকি একটি খুব অল্প সংখ্যক নমুনা এটির যে নির্দেশাবলীর মূল্য দেখেছে সে সম্পর্কে আমাদের অনেক কিছু বলতে পারে। (এবং এটা গড়, তাদের খরচ সমানুপাতিক উপর একটি ফ্রিকোয়েন্সি সঙ্গে তাদের দেখতে হবে। তাহলে nনমুনা নেওয়া হয় এবং fখরচ হয়, তাহলে Iদেখা যাবে nf+/-sqrt(nf(1-f))নমুনা। উদাহরণ, n=10, f=0.3, যে 3+/-1.4নমুনা।)


যোগ করা হয়েছে : পরিমাপ এবং এলোমেলো স্ট্যাকের নমুনার মধ্যে পার্থক্যের জন্য একটি স্বজ্ঞাত অনুভূতি দেওয়ার জন্য:
এখন এমন প্রোফাইলার রয়েছে যেগুলি স্ট্যাকের নমুনা দেয়াল-ঘড়ির সময় এমনকি, তবে যা প্রকাশ পায় তা হল পরিমাপ (বা গরম পথ, বা হট স্পট, যা থেকে একটি "বাধা" সহজেই আড়াল করতে পারে)। তারা আপনাকে যা দেখায় না (এবং তারা সহজেই পারে) তা হ'ল প্রকৃত নমুনা themselves এবং যদি আপনার লক্ষ্যটি বাধা খুঁজে পাওয়া যায়, তবে তাদের আপনাকে দেখতে হবে এমন সংখ্যা গড়ে গড়ে , 2 সময় লাগে তার বিভাজন দ্বারা বিভক্ত করে 2 টি। সুতরাং যদি এটি 30% সময় নেয় তবে 2 / .3 = 6.7 নমুনা, গড়ে এটি দেখায় এবং 20 টি নমুনা এটি 99.2% দেখানোর সুযোগ দেয়।

পরিমাপ পরীক্ষা করা এবং স্ট্যাকের নমুনাগুলি পরীক্ষার মধ্যে পার্থক্যের একটি অফ-দ্য-কফ চিত্রণ দেওয়া হল। বাধাটি এটির মতো একটি বড় অঙ্কুর হতে পারে বা অসংখ্য ছোট ছোট আকারের হতে পারে, এতে কোনও পার্থক্য নেই।

এখানে চিত্র বর্ণনা লিখুন

পরিমাপ অনুভূমিক; এটি আপনাকে নির্দিষ্ট সময়সীমার কতটা ভগ্নাংশ গ্রহণ করে তা বলে দেয়। নমুনা উল্লম্ব হয়। সেই মুহূর্তে পুরো প্রোগ্রামটি কী করছে তা এড়াতে যদি কোনও উপায় থাকে এবং আপনি যদি এটি দ্বিতীয় নমুনায় দেখেন তবে আপনি বাধা পেয়েছেন। এটিই পার্থক্য করে - সময় ব্যয় করার পুরো কারণটি দেখে, কেবল কতটা নয়।


292
এটি মূলত একটি দরিদ্র লোকের স্যাম্পলিং প্রোফাইলার, এটি দুর্দান্ত, তবে আপনি খুব সামান্য নমুনার আকারের ঝুঁকি চালান যা সম্ভবত আপনাকে সম্পূর্ণ উত্সাহী ফলাফল দেবে।
ক্র্যাশ ওয়ার্কস

100
@ ক্র্যাশ: আমি "দরিদ্র মানুষ" অংশটি নিয়ে বিতর্ক করব না :-) এটি সত্য যে পরিসংখ্যান পরিমাপের নির্ভুলতার জন্য অনেকগুলি নমুনা প্রয়োজন, তবে দুটি বিবাদী লক্ষ্য রয়েছে - পরিমাপ এবং সমস্যার অবস্থান। আমি পরের দিকে মনোনিবেশ করছি, যার জন্য আপনার অবস্থানের নির্ভুলতা প্রয়োজন, পরিমাপের নির্ভুলতা নয়। উদাহরণস্বরূপ, মিড স্ট্যাক, একক ফাংশন কল এ () থাকতে পারে; যা সময়ের ৫০% অবদান রাখে, তবে এটি ব্যয়বহুল নয় এমন এ () এর আরও অনেক কলগুলির পাশাপাশি অন্য একটি বৃহত ফাংশন বিতেও হতে পারে। ফাংশন সময়গুলির যথাযথ সংক্ষিপ্তসারগুলি একটি সূত্র হতে পারে তবে অন্যান্য স্ট্যাকের নমুনাটি সমস্যাটিকে নির্দেশ করবে।
মাইক ডুনলাভে

41
... বিশ্বকে মনে হচ্ছে কল কলম এবং / অথবা গড় সময় দিয়ে কল করা একটি কল-গ্রাফ যথেষ্ট ভাল। এইটা না. এবং দুঃখের বিষয় হ'ল, কল স্ট্যাকের নমুনা দেওয়ার জন্য, সবচেয়ে দরকারী তথ্য তাদের সামনে ঠিক আছে, তবে তারা "পরিসংখ্যান" এর স্বার্থে এটিকে ফেলে দেয়।
মাইক ডুনলাভে

30
আপনার কৌশলটির সাথে একমত হওয়ার অর্থ আমার নেই। স্পষ্টতই আমি স্ট্যাক-ওয়াকিং স্যাম্পলিং প্রোফাইলারদের উপর যথেষ্ট ভারী নির্ভর করি। আমি কেবল ইঙ্গিত করছি যে এমন কিছু সরঞ্জাম রয়েছে যা এটি এখন একটি স্বয়ংক্রিয় পদ্ধতিতে এটি করে, এটি গুরুত্বপূর্ণ যখন আপনি যখন 25% থেকে 15% পর্যন্ত কোনও ফাংশন পাওয়ার বিন্দুটি পেরিয়ে যান এবং এটি 1.2% থেকে নীচে নেমে যায় 0.6%।
ক্র্যাশওয়ার্কস

13
-1: ঝরঝরে ধারণা, তবে আপনি যদি একটি পরিমিত কর্মক্ষমতা কেন্দ্রিক পরিবেশে কাজ করার জন্য অর্থ প্রদান করছেন তবে এটি প্রত্যেকের সময় নষ্ট। প্রকৃত প্রোফাইলার ব্যবহার করুন যাতে আমাদের আপনার পিছনে আসতে হবে না এবং আসল সমস্যাগুলি সমাধান করতে হবে না।
স্যাম হারওয়েল

583

আপনি নিম্নলিখিত বিকল্পগুলির সাথে ভালগ্রাইন্ড ব্যবহার করতে পারেন

valgrind --tool=callgrind ./(Your binary)

এটি একটি ফাইল তৈরি করবে callgrind.out.x। তারপরে আপনি kcachegrindএই ফাইলটি পড়ার জন্য সরঞ্জামটি ব্যবহার করতে পারেন । কোন লাইনে কত খরচ হয় তার ফলাফল সহ এটি আপনাকে জিনিসগুলির একটি গ্রাফিকাল বিশ্লেষণ দেবে।


51
Valgrind মহান, কিন্তু সতর্ক করা এটি আপনার প্রোগ্রাম অভিশাপ ধীর করতে হবে
Neves

30
আউটপুটটি ভিজ্যুয়ালাইজ করার জন্য আশ্চর্যজনক বিকল্প পদ্ধতির জন্য জিপিআরফ 2 ডটও দেখুন । ./gprof2dot.py -f callgrind callgrind.out.x | dot -Tsvg -o output.svg
সেবাস্তিয়ান

2
@ নবীন হ্যাঁ ভ্যালগ্রিন্ড রিয়েল-টাইম "জিস্ট্রিমার" এবং "ওপেনসিভি" অ্যাপ্লিকেশনগুলির প্রোফাইল দেওয়ার জন্য গতির দিক দিয়ে খুব কার্যকর নয়।
উত্সাহী

1
stackoverflow.com/questions/375913/... গতি সমস্যার জন্য আংশিক soluton হয়।
টানু শমূয়েল

3
@ সেবাস্তিয়ান: gprof2dotএখন এখানে: github.com/jrfonseca/gprof2dot
জন জুইনক

347

আমি ধরে নিচ্ছি আপনি জিসিসি ব্যবহার করছেন। মানক সমাধানটি জিআরফফের সাথে প্রোফাইল করা হবে

-pgপ্রোফাইলিংয়ের পূর্বে সংকলনে যোগ করতে ভুলবেন না :

cc -o myprog myprog.c utils.c -g -pg

আমি এটি এখনও চেষ্টা করি নি তবে গুগল-পারফিউল সম্পর্কে ভাল জিনিস শুনেছি । এটি অবশ্যই চেষ্টা করার মতো।

সম্পর্কিত প্রশ্ন এখানে

অন্যান্য আরও কয়েকটি বাজওয়ার্ড যদি gprofআপনার জন্য কাজ করে না: Valgrind- র , ইনটেল VTune সূর্য DTrace


3
আমি সম্মত হই যে জিপিআরফ বর্তমান মান। কেবল একটি নোট, যদিও, ভ্যালগ্রাইন্ডটি গতি অপ্টিমাইজেশনের জন্য নয়, আপনার প্রোগ্রামগুলির মেমরি ফাঁস এবং অন্যান্য মেমরি-সম্পর্কিত দিকগুলি প্রোফাইল হিসাবে ব্যবহার করা হয়।
বিলটি

68
বিল, ভ্যাবল্রিন্ড স্যুটে আপনি কলগ্রান্ড এবং ম্যাসিফ খুঁজে পেতে পারেন। উভয়ই প্রোফাইল অ্যাপ্লিকেশনগুলিতে বেশ কার্যকর
ডারিও মিনিননে

7
@ বিল-টিকটিকি: কিছু মন্তব্য gprof : stackoverflow.com/questions/1777556/alternatives-to-gprof/...
মাইক Dunlavey

6
gprof -pg হ'ল কলস্ট্যাক প্রোফাইলিংয়ের একটি অনুমান মাত্র। এটি কোন ফাংশনগুলিতে কল করে যা অন্য কোন ফাংশনগুলি কল করে তা ট্র্যাক করতে এমকাউন্ট কলগুলি সন্নিবেশ করায়। এটি উহ, সময়ের জন্য মানক সময় ভিত্তিক নমুনা ব্যবহার করে। তারপরে এটি কলগুলির সংখ্যা অনুসারে ফু () এর কলকারীদের কাছে ফাংশন foo () এ নমুনা বার বার সংযোজন করে। সুতরাং এটি বিভিন্ন ব্যয়ের কলগুলির মধ্যে পার্থক্য করে না।
ক্র্যাজি গ্লিউ

1
ঝনঝন / ঝাঁকুনি ++ দিয়ে, কেউ গ্পেরফটুলসের সিপিইউ প্রোফাইলার ব্যবহার বিবেচনা করতে পারে । ক্যাভেট: নিজে নিজে করিনি।
einpoklum

257

আরও নতুন কার্নেলগুলি (যেমন সর্বশেষ উবুন্টু কার্নেলগুলি) নতুন 'পারফ' সরঞ্জাম ( apt-get install linux-tools) একে একে পারফেক্ট_সেসেন্টস নিয়ে আসে

এগুলি ক্লাসিক স্যাম্পলিং প্রোফাইলারগুলি ( ম্যান-পৃষ্ঠা ) এবং দুর্দান্ত টাইমচার্টের সাথে আসে !

গুরুত্বপূর্ণ বিষয় হ'ল এই সরঞ্জামগুলি সিস্টেম প্রোফাইলিং হতে পারে এবং কেবল প্রোফাইলিং প্রক্রিয়া করতে পারে না - তারা থ্রেড, প্রসেস এবং কার্নেলের মধ্যে মিথস্ক্রিয়া প্রদর্শন করতে পারে এবং প্রক্রিয়াগুলির মধ্যে সময়সূচী এবং I / O নির্ভরতা বুঝতে দেয়।

বিকল্প পাঠ


12
দুর্দান্ত সরঞ্জাম! "মূল-> ফানক 1-> ফান 2" স্টাইল থেকে শুরু করে একটি সাধারণ "প্রজাপতি" ভিউ পাওয়া আমার পক্ষে কি আছে? আমি বুঝতে পারছি না ... perf reportকল পিতামাতার সাথে আমাকে ফাংশনটির নাম দিয়েছে ... (তাই এটি একটি উল্টানো প্রজাপতির দৃশ্যের মতো)
কিজএক্স 2

উইল, পারফ থ্রেড ক্রিয়াকলাপের টাইমচার্ট প্রদর্শন করতে পারে; সিপিইউ নম্বর তথ্য যুক্ত হয়েছে? আমি দেখতে চাই যে প্রতিটি সিপিইউতে কখন এবং কোন থ্রেড চলছিল।
osgx

2
@ kizzx2 - আপনি gprof2dotএবং ব্যবহার করতে পারেন perf script। খুব সুন্দর সরঞ্জাম!
ছদ্মবেশী

2
এমনকি 4.13 এর মতো নতুন কার্নেলগুলিতে প্রোফাইলিংয়ের জন্য ইবিপিএফ রয়েছে। দেখুন brendangregg.com/blog/2015-05-15/ebpf-one-small-step.html এবং brendangregg.com/ebpf.html
অ্যান্ড্রু স্টার্ন

আরেকটি চমৎকার ভূমিকা perfএ বিদ্যমান archive.li/9r927#selection-767.126-767.271 (কেন তবে দেবতারা তাই জ্ঞান বেস থেকে যে পৃষ্ঠাটি মুছে করার সিদ্ধান্ত নিয়েছে আমাকে পরলোক হল ....)
ragerdl

75

আমি আমার প্রোফাইলিং সরঞ্জাম স্যুটটির ভিত্তি হিসাবে ভালগ্র্যান্ড এবং কলগ্রিন্ড ব্যবহার করব। যেটি জেনে রাখা গুরুত্বপূর্ণ তা হ'ল ভালগ্রিন্ড মূলত একটি ভার্চুয়াল মেশিন:

(উইকিপিডিয়া) ভ্যালগ্রিন্ড মূলত ডাইনামিক রিকম্পিলেশন সহ জাস্ট-ইন-টাইম (জেআইটি) সংকলন কৌশল ব্যবহার করে একটি ভার্চুয়াল মেশিন। আসল প্রোগ্রাম থেকে কোনও কিছুই সরাসরি হোস্ট প্রসেসরে সরাসরি চালিত হয় না। পরিবর্তে, ভালগ্রাইন্ড প্রথমে ইন্টারমিডিয়েট রিপ্রেজেন্টেশন (আইআর) নামে একটি অস্থায়ী, সহজ ফর্ম হিসাবে প্রোগ্রামটি অনুবাদ করেন, এটি প্রসেসর-নিরপেক্ষ, এসএসএ ভিত্তিক ফর্ম। রূপান্তরিত হওয়ার পরে, একটি সরঞ্জাম (নীচে দেখুন) আইআর-তে যা কিছু রূপান্তর করতে চান তা করতে বিনামূল্যে, ভ্যালগ্রিন্ড আইআরটিকে মেশিন কোডে ফিরে অনুবাদ করার পরে এবং হোস্ট প্রসেসরটিকে এটিকে চালিত করার আগে।

কলগ্রাইন্ড এটির উপরে একটি প্রোফাইলার বিল্ড। প্রধান সুবিধা হ'ল নির্ভরযোগ্য ফলাফল পেতে আপনাকে আপনার আবেদনটি কয়েক ঘন্টা চালাতে হবে না। এমনকি এক সেকেন্ড রানও রক-সলিড, নির্ভরযোগ্য ফলাফল পাওয়ার জন্য যথেষ্ট, কারণ কলগ্রিন্ড একটি প্রোব- প্রোফিং প্রোফাইল নয়।

ভালগ্রিডের উপর আরেকটি সরঞ্জাম তৈরি হ'ল ম্যাসিফ। আমি এটি হিপ মেমরির ব্যবহার প্রোফাইল করতে ব্যবহার করি। এটি দুর্দান্ত কাজ করে। এটি যা করে তা হ'ল এটি আপনাকে মেমরির ব্যবহারের স্ন্যাপশট দেয় - বিশদ তথ্য যা মেমরির কত শতাংশ রাখে এবং WHO এটি সেখানে রেখেছিল। অ্যাপ্লিকেশন চালনার সময় বিভিন্ন পয়েন্টে এই জাতীয় তথ্য উপলব্ধ।


70

valgrind --tool=callgrindকিছু বিকল্প ছাড়াই দৌড়ানোর উত্তর পুরোপুরি সম্পূর্ণ নয়। আমরা সাধারণত ভালগ্রাইন্ডের অধীনে 10 মিনিটের ধীর সূচনার সময়টিকে প্রোফাইল করতে চাই না এবং যখন আমাদের প্রোগ্রামটি কোনও কাজ করছে তখন এটি প্রোফাইল করতে চাই।

সুতরাং এই আমি সুপারিশ। প্রথমে প্রোগ্রাম চালান:

valgrind --tool=callgrind --dump-instr=yes -v --instr-atstart=no ./binary > tmp

এখন যখন এটি কাজ করে এবং আমরা প্রোফাইলিং শুরু করতে চাই আমাদের অন্য উইন্ডোতে চালানো উচিত:

callgrind_control -i on

এটি প্রোফাইলিং চালু করে। এটি বন্ধ করতে এবং পুরো টাস্কটি বন্ধ করতে আমরা ব্যবহার করতে পারি:

callgrind_control -k

বর্তমান ডিরেক্টরিতে আমাদের কাছে কলগ্রিনড.আউট। * নামে কিছু ফাইল রয়েছে। প্রোফাইলিং ফলাফলগুলি দেখতে ব্যবহার করুন:

kcachegrind callgrind.out.*

আমি "উইন্ডো" কলামের শিরোনামটিতে ক্লিক করার জন্য পরবর্তী উইন্ডোতে প্রস্তাব দিই, অন্যথায় এটি দেখায় যে "মূল ()" বেশিরভাগ সময় ব্যয়কারী কাজ। "স্ব" দেখায় যে প্রতিটি ফাংশন নিজেই সময় নিয়েছিল, নির্ভরকারীদের সাথে একত্রিত হয় না।


9
এখন কোনও কারণে কলগ্রান্ড.আউট। * ফাইলগুলি সর্বদা খালি ছিল। কলgrind_control -d সম্পাদন করা ডেটা ডিস্কে ডাম্প জোর করতে কার্যকর ছিল।
টানু শমূয়েল

3
করতে পারবে না। আমার স্বাভাবিক প্রসঙ্গগুলি পুরো মাইএসকিউএল বা পিএইচপি বা কিছু অনুরূপ বড় জিনিসের মতো। প্রায়শই এমনকি জানি না আমি প্রথমে কী আলাদা করতে চাই।
টানু শমূয়েল

2
অথবা আমার ক্ষেত্রে আমার প্রোগ্রামটি আসলে একটি এলআরইউ ক্যাশে প্রচুর ডেটা লোড করে, এবং আমি এটির প্রোফাইল দিতে চাই না। সুতরাং আমি শুরুতে ক্যাশের একটি সাবসেটটি জোর করে লোড করি এবং কেবলমাত্র সেই ডেটা ব্যবহার করে কোডটি প্রোফাইল করি (ওএস + সিপিইউকে আমার ক্যাশে মেমরির ব্যবহার পরিচালনা করতে দেওয়া হয়)। এটি কাজ করে, তবে ক্যাশে লোড করা কোডটি ধীরে ধীরে এবং সিপিইউ নিবিড় যা আমি একটি অন্য প্রসঙ্গে প্রোফাইল করার চেষ্টা করছি, তাই কলগ্রাইন্ড খারাপভাবে দূষিত ফলাফল তৈরি করে।
কোড বিদ্বেষক

2
CALLGRIND_TOGGLE_COLLECTপ্রোগ্রামোগ্রাফিকভাবে সংগ্রহকে সক্ষম / অক্ষম করার জন্যও রয়েছে ; দেখতে stackoverflow.com/a/13700817/288875
আন্দ্রে Holzner

1
বাহ, আমি জানি না এটি বিদ্যমান, ধন্যবাদ!
ভিনসেন্ট ফোরমন্ড

59

এটি নাজগোবের জিপ্রফ জবাবের প্রতিক্রিয়া ।

আমি গত কয়েক দিন জিপ্রফ ব্যবহার করেছি এবং ইতিমধ্যে তিনটি উল্লেখযোগ্য সীমাবদ্ধতা পেয়েছি, যার মধ্যে একটি আমি অন্য কোথাও নথিভুক্ত দেখিনি (এখনও):

  1. এটা তোলে বহু-থ্রেডেড কোড সঠিকভাবে কাজ করে না, যদি না আপনি একটি ব্যবহার কার্যসংক্রান্ত

  2. কল গ্রাফ ফাংশন পয়েন্টার দ্বারা বিভ্রান্ত হয়। উদাহরণ: আমার কাছে একটি ফাংশন রয়েছে multithread()যা একটি নির্দিষ্ট অ্যারে (তর্ক হিসাবে উভয়কেই পাস করা হয়েছে) উপর একটি নির্দিষ্ট ফাংশনটি আমাকে বহু-থ্রেড করতে সক্ষম করে। জি.আর.আর.ফ., সমস্ত কলকে multithread()বাচ্চাদের জন্য সময় কাটানোর উদ্দেশ্যে সমান হিসাবে দেখেছে । কিছু ফাংশন যেহেতু আমি multithread()অন্যদের তুলনায় অনেক বেশি সময় নিতে পাস করি আমার কল গ্রাফগুলি বেশিরভাগ অকেজো। (যারা থ্রেডিংয়ের বিষয়টি এখানে সমস্যা তা নিয়ে ভাবছেন: না, allyচ্ছিকভাবে multithread()করতে পারেন এবং এই ক্ষেত্রে, কেবল কলিং থ্রেডে ক্রমানুসারে সমস্ত কিছু চালানো যেতে পারে)।

  3. এটি এখানে বলেছে যে "... কল-নাম্বার পরিসংখ্যানগুলি নমুনা নয়, গণনা দ্বারা উদ্ভূত হয়েছে They এগুলি সম্পূর্ণ নির্ভুল ..."। তবুও আমি খুঁজে পেয়েছি যে আমার কল গ্রাফটি আমাকে আমার সর্বাধিক-কথিত ফাংশনে কল স্ট্যাটাস হিসাবে 5345859132 + 784984078 দিচ্ছে, যেখানে প্রথম নম্বরটি সরাসরি কল হওয়ার কথা, এবং দ্বিতীয় পুনরাবৃত্ত কল (যা সমস্ত নিজের থেকেই হয়)। যেহেতু এটি বোঝানো হয়েছে আমার একটি ত্রুটি ছিল, তাই আমি কোডটিতে দীর্ঘ (-৪-বিট) কাউন্টার রেখেছি এবং আবার একই রান করলাম। আমার গণনা: 5345859132 সরাসরি, এবং 78094395406 স্ব-পুনরাবৃত্ত কল। সেখানে প্রচুর অঙ্ক রয়েছে, তাই আমি জিপিআরফ থেকে 784m বনাম, আমার পরিমাপ করা পুনরাবৃত্ত কলগুলি উল্লেখ করব: 100 এর একটি ফ্যাক্টর different উভয় রানই একক থ্রেডেড এবং অপরিশোধিত কোড ছিল, একটি সংকলিত -gএবং অন্যটি -pg

এটি GNU জিপ্রোফ ( দেবিয়ানদের জন্য জিএনইউ বিন্টিলস ) ২.১18.০.২০০০০১০৩৩ ছিল 64৪-বিট দেবিয়ান লেনির অধীনে, এটি যদি কাউকে সহায়তা করে।


হ্যাঁ, এটি নমুনা দেয় তবে কল-এর সংখ্যাগুলির জন্য নয়। মজার বিষয় হল, আপনার লিঙ্কটি শেষ পর্যন্ত আমাকে আমার পোস্টে লিঙ্কিত ম্যানুয়াল পৃষ্ঠার একটি আপডেট সংস্করণে নিয়ে গেছে, নতুন ইউআরএল: উত্সওয়ার.অর্গ / বিনিটিলস / ডোকস / জিআরপি / This এটি আমার উত্তরের অংশে (iii) উদ্ধৃতিটি পুনরাবৃত্তি করে, তবে এও বলেছে যে "মাল্টি-থ্রেডেড অ্যাপ্লিকেশনগুলিতে, বা একক থ্রেডেড অ্যাপ্লিকেশনগুলিতে যেগুলি মাল্টি-থ্রেড লাইব্রেরির সাথে সংযুক্ত রয়েছে, গণনা ফাংশন থ্রেড-সেফ থাকলে গণনাগুলি কেবলমাত্র নির্বিচারক হয় Note -safe)। "
রব_ফরফ_এডিট

এটি আমার ফলাফলটি ব্যাখ্যা করে কিনা তা আমার কাছে পরিষ্কার নয় (iii)। আমার কোড -pthread -lm লিঙ্কযুক্ত ছিল এবং একক থ্রেড চলমান থাকা সত্ত্বেও "pthread_t * thr" এবং "pthread_mutex_t nextLock = PTHREAD_MUTEX_INITIALIZER" স্ট্যাটিক ভেরিয়েবল উভয়ই ঘোষণা করে। আমি সাধারণত ধরে নেব যে "মাল্টি-থ্রেডেড লাইব্রেরিগুলির সাথে লিঙ্ক" মানে আসলে সেই লাইব্রেরিগুলি ব্যবহার করা এবং এর চেয়েও বড় পরিমাণে, তবে আমি ভুল হতে পারি!
রব_ফরফ_এডিটস

23

ভালগ্র্যান্ড, কলগ্রিন্ড এবং কেচেগ্রিড ব্যবহার করুন:

valgrind --tool=callgrind ./(Your binary)

কলগ্র্যান্ড.আউট.এক্স উত্পন্ন করে। কেচেগ্রাইন্ড ব্যবহার করে এটি পড়ুন।

জিআরফোফ (অ্যাড-পিজি) ব্যবহার করুন:

cc -o myprog myprog.c utils.c -g -pg 

(মাল্টি-থ্রেড, ফাংশন পয়েন্টারগুলির জন্য এতটা ভাল নয়)

গুগল-পারফিউল ব্যবহার করুন:

সময় নমুনা ব্যবহার করে, I / O এবং সিপিইউ বাধাগুলি প্রকাশিত হয়।

ইন্টেল ভিটিউন সেরা (শিক্ষাগত উদ্দেশ্যে বিনামূল্যে)।

অন্যগুলি: এএমডি কোডানালিস্ট (যেহেতু এএমডি কোডএক্সএলএল দ্বারা প্রতিস্থাপিত হয়েছে), অপ্রোফিল, 'পারফ' সরঞ্জামগুলি (অ্যাপ্লিকেশন লিনাক্স-সরঞ্জাম ইনস্টল করুন)


10

সি ++ প্রোফাইলিংয়ের কৌশলগুলির সমীক্ষা

এই উত্তরে, আমি কয়েকটি খুব সাধারণ পরীক্ষা প্রোগ্রাম বিশ্লেষণ করতে বিভিন্ন সরঞ্জাম ব্যবহার করব, যাতে সেই সরঞ্জামগুলি কীভাবে কাজ করে তা তুলনামূলকভাবে তুলনা করতে পারি।

নিম্নলিখিত পরীক্ষার প্রোগ্রামটি খুব সাধারণ এবং নিম্নলিখিতটি করে:

  • mainকল fastএবং maybe_slow3 বার, maybe_slowকলগুলির মধ্যে একটি ধীর হচ্ছে

    ধীর কলটি maybe_slow10x দীর্ঘ, এবং আমরা যদি শিশু ফাংশনটিতে কল বিবেচনা করি তবে রানটাইমকে প্রাধান্য দেয় common। আদর্শভাবে, প্রোফাইলিং সরঞ্জামটি নির্দিষ্ট ধীর কলকে আমাদের নির্দেশ করতে সক্ষম হবে।

  • উভয় fastএবং maybe_slowকল common, যা প্রোগ্রামের প্রচুর পরিমাণে কার্যকর করে

  • প্রোগ্রাম ইন্টারফেসটি হ'ল:

    ./main.out [n [seed]]

    এবং প্রোগ্রাম O(n^2)মোট লুপ করে না। seedরানটাইমকে প্রভাবিত না করেই কেবল ভিন্ন আউটপুট পেতে হয়।

main.c

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

uint64_t __attribute__ ((noinline)) common(uint64_t n, uint64_t seed) {
    for (uint64_t i = 0; i < n; ++i) {
        seed = (seed * seed) - (3 * seed) + 1;
    }
    return seed;
}

uint64_t __attribute__ ((noinline)) fast(uint64_t n, uint64_t seed) {
    uint64_t max = (n / 10) + 1;
    for (uint64_t i = 0; i < max; ++i) {
        seed = common(n, (seed * seed) - (3 * seed) + 1);
    }
    return seed;
}

uint64_t __attribute__ ((noinline)) maybe_slow(uint64_t n, uint64_t seed, int is_slow) {
    uint64_t max = n;
    if (is_slow) {
        max *= 10;
    }
    for (uint64_t i = 0; i < max; ++i) {
        seed = common(n, (seed * seed) - (3 * seed) + 1);
    }
    return seed;
}

int main(int argc, char **argv) {
    uint64_t n, seed;
    if (argc > 1) {
        n = strtoll(argv[1], NULL, 0);
    } else {
        n = 1;
    }
    if (argc > 2) {
        seed = strtoll(argv[2], NULL, 0);
    } else {
        seed = 0;
    }
    seed += maybe_slow(n, seed, 0);
    seed += fast(n, seed);
    seed += maybe_slow(n, seed, 1);
    seed += fast(n, seed);
    seed += maybe_slow(n, seed, 0);
    seed += fast(n, seed);
    printf("%" PRIX64 "\n", seed);
    return EXIT_SUCCESS;
}

gprof

জিআরফোফের জন্য ইন্সট্রুমেন্টেশন সহ সফটওয়্যারটি পুনরায় সংশ্লেষ করা প্রয়োজন এবং এটি সেই যন্ত্রটির সাথে একটি নমুনা পদ্ধতিরও ব্যবহার করে। সুতরাং এটি নির্ভুলতার মধ্যে ভারসাম্য রোধ করে (নমুনা সর্বদা পুরোপুরি নির্ভুল হয় না এবং ফাংশনগুলি এড়িয়ে যেতে পারে) এবং সম্পাদন মন্দা (যন্ত্র এবং নমুনা তুলনামূলকভাবে দ্রুত কৌশল যা কার্যকরভাবে খুব বেশি গতি দেয় না)।

জিআরফোফটি জিসিসি / বাইনুটিসগুলি অন্তর্নির্মিত, তাই আমাদের যা করতে হবে তা -pgহ'ল gprof সক্ষম করার বিকল্পটি সংকলন করা । তারপরে আমরা একটি আকারের সিএলআই প্যারামিটার দিয়ে প্রোগ্রামটি সাধারণত চালিত করি যা কয়েক সেকেন্ডের যুক্তিসঙ্গত সময়কাল ধরে রান তৈরি করে ( 10000):

gcc -pg -ggdb3 -O3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
time ./main.out 10000

শিক্ষাগত কারণে, আমরা অপ্টিমাইজেশন সক্ষম না করেও একটি রান করব। মনে রাখবেন যে এটি ব্যবহারে অকেজো, কারণ আপনি সাধারণত কেবলমাত্র অনুকূলিত প্রোগ্রামটির পারফরম্যান্সকেই অনুকূল করেন:

gcc -pg -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out 10000

প্রথমে timeআমাদের জানান যে মৃত্যুদণ্ড কার্যকর করার সময়টি তার সাথে বা তার বাইরে -pgএকই ছিল, যা দুর্দান্ত: কোনও ধীরগতি নেই! আমি তবে জটিল সফ্টওয়্যারগুলিতে 2x - 3X ধীরগতির অ্যাকাউন্ট দেখেছি, যেমন এই টিকিটে দেখানো হয়েছে

যেহেতু আমরা সংকলন করেছি -pg, প্রোগ্রামটি চালনা করে এমন একটি ফাইল gmon.outফাইল তৈরি করে যাতে প্রোফাইলিং ডেটা থাকে।

আমরা সেই ফাইলটি গ্রাফিকভাবে gprof2dotযেমনটি জিজ্ঞাসা করেছি তা পর্যবেক্ষণ করতে পারি : জিআরএফ ফলাফলের গ্রাফিকাল উপস্থাপনা পাওয়া কি সম্ভব?

sudo apt install graphviz
python3 -m pip install --user gprof2dot
gprof main.out > main.gprof
gprof2dot < main.gprof | dot -Tsvg -o output.svg

এখানে, gprofসরঞ্জামটি gmon.outট্রেস তথ্যটি পড়ে এবং একটি মানব পাঠযোগ্য প্রতিবেদন তৈরি করে main.gprof, যা gprof2dotপরে গ্রাফ তৈরি করতে পড়ে।

Gprof2dot এর উত্সটি এখানে: https://github.com/jrfonseca/gprof2dot

আমরা -O0রান জন্য নিম্নলিখিত পর্যবেক্ষণ :

এখানে চিত্র বর্ণনা লিখুন

এবং -O3রান জন্য:

এখানে চিত্র বর্ণনা লিখুন

-O0আউটপুট প্রায় কাছাকাছি স্বশাসিত হয়। উদাহরণস্বরূপ, এটি দেখায় যে 3 টি maybe_slowকল এবং তাদের শিশু কলগুলি মোট রানটাইমের 97৯..5 take% সময় নেয়, যদিও maybe_slowশিশু ছাড়া নিজেকে নির্বাহ করা মোট মৃত্যুদন্ডের সময়টির ০.০০%, অর্থাৎ এই কার্যক্রমে ব্যয় করা প্রায় সমস্ত সময়ই ব্যয় করেছিল although শিশু কল।

টোডো: আমি জিডিবিতে দেখতে পাচ্ছি, তবে কেন আউটপুটটি mainঅনুপস্থিত ? জিপিআরএফ আউটপুট থেকে অনুপস্থিত ফাংশনটি আমি মনে করি কারণ এটি জিপিআরএফ এর সংকলিত উপকরণ ছাড়াও নমুনা তৈরি করছে, এবং এটি খুব দ্রুত এবং কোনও নমুনাও পায় নি।-O3bt-O3 main

আমি পিএনজির পরিবর্তে এসভিজি আউটপুট চয়ন করি কারণ এসভিজি সিটিআরএল + এফ দ্বারা অনুসন্ধানযোগ্য এবং ফাইলের আকার প্রায় 10x ছোট হতে পারে। এছাড়াও, তৈরি সফটওয়্যারটির প্রস্থ এবং উচ্চতা জটিল সফ্টওয়্যারটির জন্য কয়েক হাজার পিক্সেল এবং eogপিএনজিগুলির জন্য জিনোম ৩.২৮.১ বাগগুলি খুঁজে পাওয়া যায়, যখন এসভিজিগুলি আমার ব্রাউজারটি স্বয়ংক্রিয়ভাবে খুলে যায়। গিম্প ২.৮ যদিও ভাল কাজ করেছে, তাও দেখুন:

তবে তারপরেও, আপনি যা চান তা সন্ধান করার জন্য আপনি চিত্রটি প্রচুর আশেপাশে টেনে আনবেন, উদাহরণস্বরূপ এই টিকেট থেকে নেওয়া "বাস্তব" সফ্টওয়্যার উদাহরণ থেকে এই চিত্রটি দেখুন :

এখানে চিত্র বর্ণনা লিখুন

আপনি কি খুব সহজেই এই সমস্ত ক্ষুদ্র অরসোর্টড স্প্যাগেটি লাইনের একে অপরের সাথে চলে যাওয়ার সাথে খুব সহজেই কল স্ট্যাক খুঁজে পেতে পারেন? dotআমি নিশ্চিত আরও ভাল বিকল্প থাকতে পারে , কিন্তু আমি এখন সেখানে যেতে চাই না। আমাদের যা প্রয়োজন তা হ'ল এটির জন্য উপযুক্ত উত্সর্গীকৃত দর্শক, তবে আমি এখনও এটি পাইনি:

তবে আপনি এই সমস্যাগুলি কিছুটা কমিয়ে আনতে রঙিন মানচিত্রটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, পূর্ববর্তী বিশাল চিত্রটিতে, আমি শেষ পর্যন্ত বাম দিকে সমালোচনামূলক পথটি সন্ধান করতে সক্ষম হয়েছি যখন আমি উজ্জ্বল ছাড়টি তৈরি করি যা সবুজ লাল পরে আসে, তার পরে অবশেষে গা and় এবং গাer় নীল।

বিকল্পভাবে, আমরা gprofঅন্তর্নির্মিত বিন্টুলি সরঞ্জামের পাঠ্য আউটপুটটি পর্যবেক্ষণ করতে পারি যা আমরা পূর্বে এখানে সংরক্ষণ করেছি:

cat main.gprof

ডিফল্টরূপে, এটি একটি অত্যন্ত ভার্বোস আউটপুট তৈরি করে যা আউটপুট ডেটার অর্থ কী তা ব্যাখ্যা করে। যেহেতু আমি এর চেয়ে ভাল ব্যাখ্যা করতে পারি না, তাই আমি আপনাকে এটি নিজে পড়তে দেব।

একবার আপনি ডেটা আউটপুট ফর্ম্যাটটি বুঝতে পারলে, -bবিকল্পটির সাহায্যে টিউটোরিয়াল ছাড়াই কেবল ডেটা দেখানোর জন্য আপনি ভার্বোসিটি হ্রাস করতে পারেন :

gprof -b main.out

আমাদের উদাহরণস্বরূপ, আউটপুটগুলি ছিল -O0:

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
100.35      3.67     3.67   123003     0.00     0.00  common
  0.00      3.67     0.00        3     0.00     0.03  fast
  0.00      3.67     0.00        3     0.00     1.19  maybe_slow

            Call graph


granularity: each sample hit covers 2 byte(s) for 0.27% of 3.67 seconds

index % time    self  children    called     name
                0.09    0.00    3003/123003      fast [4]
                3.58    0.00  120000/123003      maybe_slow [3]
[1]    100.0    3.67    0.00  123003         common [1]
-----------------------------------------------
                                                 <spontaneous>
[2]    100.0    0.00    3.67                 main [2]
                0.00    3.58       3/3           maybe_slow [3]
                0.00    0.09       3/3           fast [4]
-----------------------------------------------
                0.00    3.58       3/3           main [2]
[3]     97.6    0.00    3.58       3         maybe_slow [3]
                3.58    0.00  120000/123003      common [1]
-----------------------------------------------
                0.00    0.09       3/3           main [2]
[4]      2.4    0.00    0.09       3         fast [4]
                0.09    0.00    3003/123003      common [1]
-----------------------------------------------

Index by function name

   [1] common                  [4] fast                    [3] maybe_slow

এবং এর জন্য -O3:

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls  us/call  us/call  name    
100.52      1.84     1.84   123003    14.96    14.96  common

            Call graph


granularity: each sample hit covers 2 byte(s) for 0.54% of 1.84 seconds

index % time    self  children    called     name
                0.04    0.00    3003/123003      fast [3]
                1.79    0.00  120000/123003      maybe_slow [2]
[1]    100.0    1.84    0.00  123003         common [1]
-----------------------------------------------
                                                 <spontaneous>
[2]     97.6    0.00    1.79                 maybe_slow [2]
                1.79    0.00  120000/123003      common [1]
-----------------------------------------------
                                                 <spontaneous>
[3]      2.4    0.00    0.04                 fast [3]
                0.04    0.00    3003/123003      common [1]
-----------------------------------------------

Index by function name

   [1] common

প্রতিটি বিভাগের খুব দ্রুত সংক্ষিপ্তসার হিসাবে যেমন:

                0.00    3.58       3/3           main [2]
[3]     97.6    0.00    3.58       3         maybe_slow [3]
                3.58    0.00  120000/123003      common [1]

ফাংশনটির চারপাশে কেন্দ্রগুলি থাকে যা ইন্ডেন্ট করা থাকে ( maybe_flow)। [3]এই ফাংশনটির আইডি। ফাংশনের উপরে, তার কলারগুলি রয়েছে এবং এর নীচে কলি রয়েছে।

জন্য -O3, যে গ্রাফিক্যাল আউটপুটে মত এখানে দেখতে maybe_slowএবং fastএকটি পরিচিত পিতা বা মাতা, যা কি ডকুমেন্টেশন বলছেন যে হবে না <spontaneous>উপায়।

আমি নিশ্চিত নই যে জিপিআরফের সাথে লাইন বাই লাইন প্রোফাইলিং করার কোনও দুর্দান্ত উপায় আছে কিনা: code জিপিআরএফ সময় নির্দিষ্ট কোডের লাইনে ব্যয় করে

Valgrind কলগ্রাইন্ড

valgrind Valgrind ভার্চুয়াল মেশিনের মাধ্যমে প্রোগ্রামটি চালায়। এটি প্রোফাইলিংটি খুব নির্ভুল করে তোলে তবে এটি প্রোগ্রামের একটি খুব বড় ধীর গতিও তৈরি করে। আমি আগে kcachegrind উল্লেখ করেছি: কোডের একটি চিত্রযুক্ত ফাংশন কল গ্রাফ পেতে সরঞ্জাম

কলগ্রাইন্ডটি প্রোফাইল কোডের জন্য ভালগ্রাইন্ডের হাতিয়ার এবং কেচাগ্রাইন্ড একটি কে-ডি প্রোগ্রাম যা ক্যাশেগ্রিন্ড আউটপুটটিকে কল্পনা করতে পারে।

প্রথমে আমাদের -pgস্বাভাবিক সংকলনে ফিরে যাওয়ার জন্য পতাকাটি সরাতে হবে , অন্যথায় রানটি আসলে ব্যর্থ হয় Profiling timer expiredএবং হ্যাঁ, এটি এতটাই সাধারণ যে আমি এটি করেছি এবং এর জন্য একটি স্ট্যাক ওভারফ্লো প্রশ্ন ছিল।

সুতরাং আমরা সংকলন এবং হিসাবে চালানো:

sudo apt install kcachegrind valgrind
gcc -ggdb3 -O3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
time valgrind --tool=callgrind valgrind --dump-instr=yes \
  --collect-jumps=yes ./main.out 10000

আমি সক্ষম করি --dump-instr=yes --collect-jumps=yesকারণ এটি এমন তথ্যও ফেলে দেয় যা তুলনামূলকভাবে ছোট সংযোজন ওভারহেড ব্যয় করে আমাদের প্রতি পারফরম্যান্সের লাইন বিভাজন দেখতে সক্ষম করে।

ব্যাট বন্ধ, timeআমাদের বলে যে প্রোগ্রামটি কার্যকর করতে 29.5 সেকেন্ড সময় নিয়েছে, সুতরাং আমাদের এই উদাহরণটিতে প্রায় 15x এর মন্দা ছিল। স্পষ্টতই, এই মন্দা বড় কাজের চাপের জন্য একটি গুরুতর সীমাবদ্ধতা হতে চলেছে। এখানে উল্লিখিত "রিয়েল ওয়ার্ল্ড সফ্টওয়্যার উদাহরণ" এ , আমি ৮০x এর মন্দা লক্ষ্য করেছি।

রানটি আমার ক্ষেত্রে callgrind.out.<pid>যেমন একটি প্রোফাইল ডেটা ফাইল তৈরি করে callgrind.out.8554। আমরা ফাইলটি এর সাথে দেখি:

kcachegrind callgrind.out.8554

যা এমন একটি জিইউআই দেখায় যা পাঠ্য জিআরএফআউটপটের অনুরূপ ডেটা ধারণ করে:

এখানে চিত্র বর্ণনা লিখুন

এছাড়াও, যদি আমরা নীচে ডান "কল গ্রাফ" ট্যাবটিতে যাই, আমরা কল কলম দেখতে পাই যা আমরা অযৌক্তিক পরিমাণে সাদা সীমানা সহ নিম্নলিখিত চিত্রটি পেতে নীচে ক্লিক করে রফতানি করতে পারি :-)

এখানে চিত্র বর্ণনা লিখুন

আমি মনে করি fastসেই গ্রাফটিতে প্রদর্শিত হচ্ছে না কারণ কেচাগ্রাইন্ড অবশ্যই ভিজ্যুয়ালাইজেশনকে সহজ করেছে কারণ সেই কলটি খুব কম সময় নেয়, সম্ভবত এটিই আপনি আসল প্রোগ্রামে চান এমন আচরণ হতে পারে। ডান ক্লিক মেনুতে এমন নোডগুলি কখন বন্ধ করতে হবে তা নিয়ন্ত্রণ করার জন্য কিছু সেটিংস রয়েছে তবে দ্রুত চেষ্টা করার পরেও আমি এটি একটি ছোট কলটি দেখতে পেলাম না। আমি যদি fastবাম উইন্ডোতে ক্লিক করি তবে এটি কল কল দেখায় fast, যাতে স্ট্যাকটি আসলে ধরা পড়ে। সম্পূর্ণ গ্রাফ কল গ্রাফ দেখানোর জন্য এখনও কোনও উপায় খুঁজে পায়নি : কলগ্রাইন্ড কে কেচেগ্রিন্ড কলগ্রাফের সমস্ত ফাংশন কল দেখান

জটিল সি ++ সফটওয়্যারটিতে টুডো, আমি টাইপের কিছু এন্ট্রি দেখতে পাচ্ছি <cycle N>, উদাহরণস্বরূপ <cycle 11>যেখানে আমি ফাংশনটির নাম আশা করব, তার অর্থ কী? আমি লক্ষ্য করেছি যে এটি চালু এবং বন্ধ টগল করার জন্য একটি "সাইকেল সনাক্তকরণ" বোতাম রয়েছে, তবে এর অর্থ কী?

perf থেকে linux-tools

perfএকচেটিয়াভাবে লিনাক্স কার্নেল স্যাম্পলিং প্রক্রিয়াগুলি ব্যবহার করছে বলে মনে হয়। এটি সেটআপ করা খুব সহজ করে তোলে, তবে পুরোপুরি সঠিকও নয়।

sudo apt install linux-tools
time perf record -g ./main.out 10000

এটি মৃত্যুদন্ডের সাথে 0.2 টি যোগ করেছে, তাই আমরা সময়মতো ভাল, তবে commonকিবোর্ডের ডান তীর দিয়ে নোডটি প্রসারিত করার পরেও আমি তেমন আগ্রহ দেখি না :

Samples: 7K of event 'cycles:uppp', Event count (approx.): 6228527608     
  Children      Self  Command   Shared Object     Symbol                  
-   99.98%    99.88%  main.out  main.out          [.] common              
     common                                                               
     0.11%     0.11%  main.out  [kernel]          [k] 0xffffffff8a6009e7  
     0.01%     0.01%  main.out  [kernel]          [k] 0xffffffff8a600158  
     0.01%     0.00%  main.out  [unknown]         [k] 0x0000000000000040  
     0.01%     0.00%  main.out  ld-2.27.so        [.] _dl_sysdep_start    
     0.01%     0.00%  main.out  ld-2.27.so        [.] dl_main             
     0.01%     0.00%  main.out  ld-2.27.so        [.] mprotect            
     0.01%     0.00%  main.out  ld-2.27.so        [.] _dl_map_object      
     0.01%     0.00%  main.out  ld-2.27.so        [.] _xstat              
     0.00%     0.00%  main.out  ld-2.27.so        [.] __GI___tunables_init
     0.00%     0.00%  main.out  [unknown]         [.] 0x2f3d4f4944555453  
     0.00%     0.00%  main.out  [unknown]         [.] 0x00007fff3cfc57ac  
     0.00%     0.00%  main.out  ld-2.27.so        [.] _start              

সুতরাং আমি -O0প্রোগ্রামটিকে বেঞ্চমার্ক করার চেষ্টা করি যাতে এটি কিছু দেখায় কিনা এবং কেবল এখনই, শেষ পর্যন্ত, আমি কি কোনও কল গ্রাফ দেখতে পাচ্ছি:

Samples: 15K of event 'cycles:uppp', Event count (approx.): 12438962281   
  Children      Self  Command   Shared Object     Symbol                  
+   99.99%     0.00%  main.out  [unknown]         [.] 0x04be258d4c544155  
+   99.99%     0.00%  main.out  libc-2.27.so      [.] __libc_start_main   
-   99.99%     0.00%  main.out  main.out          [.] main                
   - main                                                                 
      - 97.54% maybe_slow                                                 
           common                                                         
      - 2.45% fast                                                        
           common                                                         
+   99.96%    99.85%  main.out  main.out          [.] common              
+   97.54%     0.03%  main.out  main.out          [.] maybe_slow          
+    2.45%     0.00%  main.out  main.out          [.] fast                
     0.11%     0.11%  main.out  [kernel]          [k] 0xffffffff8a6009e7  
     0.00%     0.00%  main.out  [unknown]         [k] 0x0000000000000040  
     0.00%     0.00%  main.out  ld-2.27.so        [.] _dl_sysdep_start    
     0.00%     0.00%  main.out  ld-2.27.so        [.] dl_main             
     0.00%     0.00%  main.out  ld-2.27.so        [.] _dl_lookup_symbol_x 
     0.00%     0.00%  main.out  [kernel]          [k] 0xffffffff8a600158  
     0.00%     0.00%  main.out  ld-2.27.so        [.] mmap64              
     0.00%     0.00%  main.out  ld-2.27.so        [.] _dl_map_object      
     0.00%     0.00%  main.out  ld-2.27.so        [.] __GI___tunables_init
     0.00%     0.00%  main.out  [unknown]         [.] 0x552e53555f6e653d  
     0.00%     0.00%  main.out  [unknown]         [.] 0x00007ffe1cf20fdb  
     0.00%     0.00%  main.out  ld-2.27.so        [.] _start              

টোডো: -O3ফাঁসির ঘটনায় কী ঘটেছিল ? এটি কি কেবল সহজ maybe_slowএবং fastখুব দ্রুত ছিল এবং কোনও নমুনা পেল না? এটি -O3কার্যকর হতে আরও বেশি সময় নেয় এমন বড় প্রোগ্রামগুলির সাথে কী ভাল কাজ করে? আমি কি কিছু সি এল এল বিকল্প মিস করেছি? -Fহার্টজে নমুনা ফ্রিকোয়েন্সি নিয়ন্ত্রণ করার বিষয়ে আমি জানতে পেরেছি , কিন্তু আমি এটিকে ডিফল্টরূপে অনুমোদিত সর্বোচ্চ -F 39500(এটি দিয়ে বাড়ানো যেতে পারে sudo) পর্যন্ত পরিণত করেছি এবং আমি এখনও পরিষ্কার কল দেখতে পাচ্ছি না।

perfব্র্যান্ডন গ্রেগের ফ্ল্যামগ্রাফ সরঞ্জাম সম্পর্কে একটি দুর্দান্ত জিনিস হ'ল কল স্ট্যাকের সময়গুলি খুব ঝরঝরেভাবে প্রদর্শন করে যা আপনাকে দ্রুত বড় কলগুলি দেখতে দেয়। টুল পাওয়া যাবে: https://github.com/brendangregg/FlameGraph এবং এ তার জন্য perf টিউটোরিয়াল উল্লেখ করা হয়: http://www.brendangregg.com/perf.html#FlameGraphs যখন আমি দৌড়ে perfছাড়া sudoআমি পেয়েছিলাম ERROR: No stack counts foundতাই জন্য এখন আমি এটি দিয়ে করব sudo:

git clone https://github.com/brendangregg/FlameGraph
sudo perf record -F 99 -g -o perf_with_stack.data ./main.out 10000
sudo perf script -i perf_with_stack.data | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > flamegraph.svg

তবে এই জাতীয় কোনও সাধারণ প্রোগ্রামে আউটপুটটি বোঝা খুব সহজ নয়, যেহেতু আমরা সহজেই maybe_slowবা fastসেই গ্রাফটিতে দেখতে পাই না :

এখানে চিত্র বর্ণনা লিখুন

আরও জটিল উদাহরণে গ্রাফটির অর্থ কী তা পরিষ্কার হয়ে যায়:

এখানে চিত্র বর্ণনা লিখুন

টোডে [unknown]এই উদাহরণে ফাংশনগুলির একটি লগ রয়েছে , তা কেন?

অন্য পারফ জিওআই ইন্টারফেসগুলির মধ্যে এটির মূল্য উপযুক্ত হতে পারে:

  • এক্সলিপস ট্রেস কম্পাস প্লাগইন: https://www.eclipse.org/tracecompass/

    তবে এর ক্ষয়ক্ষতি রয়েছে যা আপনাকে প্রথমে তথ্যটিকে কমন ট্রেস ফর্ম্যাটে রূপান্তর করতে হবে যা দিয়ে করা যেতে পারে perf data --to-ctf, তবে এটি নির্মাণের সময় সক্ষম করতে হবে / perfযথেষ্ট নতুন থাকতে হবে, যার মধ্যে কোনওটি পারফেক্টের ক্ষেত্রে নয় is উবুন্টু 18.04

  • https://github.com/KDAB/hotspot

    এর নেতিবাচক দিকটি হ'ল কোনও উবুন্টু প্যাকেজ নেই বলে মনে হয় এবং এটি নির্মাণে Qt 5.10 প্রয়োজন হয় এবং উবুন্টু 18.04 Qt 5.9 এ রয়েছে।

gperftools

পূর্বে "গুগল পারফরম্যান্স সরঞ্জাম" নামে পরিচিত, উত্স: https://github.com/gperftools/gperftools নমুনা ভিত্তিক।

প্রথমে এর সাথে জিপারফটুলগুলি ইনস্টল করুন:

sudo apt install google-perftools

তারপরে, আমরা দুটি উপায়ে জিপারফটুলস সিপিইউ প্রোফাইলার সক্ষম করতে পারি: রানটাইম বা বিল্ড টাইম এ।

রানটাইম চলাকালীন, আমাদের LD_PRELOADনির্দেশিকাটি সেট করতে হবে libprofiler.so, যার সাহায্যে আপনি খুঁজে পেতে পারেন locate libprofiler.so, যেমন আমার সিস্টেমে:

gcc -ggdb3 -O3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libprofiler.so \
  CPUPROFILE=prof.out ./main.out 10000

বিকল্পভাবে, আমরা লিঙ্ক টাইমে লাইব্রেরিটি তৈরি করতে পারি, LD_PRELOADরানটাইমটিতে সময় সরবরাহ করে:

gcc -Wl,--no-as-needed,-lprofiler,--as-needed -ggdb3 -O3 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
CPUPROFILE=prof.out ./main.out 10000

আরও দেখুন: gperftools - প্রোফাইল ফাইল ডাম্প করা হয়নি

আমি এখনও অবধি পাওয়া এই ডেটা দেখার সর্বোত্তম উপায় হল পিআরএফপি আউটপুটকে একই ফর্ম্যাট হিসাবে তৈরি করা যা কেচাচিগ্রিন্ড ইনপুট হিসাবে গ্রহণ করে (হ্যাঁ, ভালগ্রাইন্ড-প্রকল্প-দর্শক-সরঞ্জাম) এবং এটি দেখার জন্য ক্যাসিগ্রিন্ড ব্যবহার করুন:

google-pprof --callgrind main.out prof.out  > callgrind.out
kcachegrind callgrind.out

এই যে কোনও একটি পদ্ধতির সাথে চলার পরে, আমরা prof.outআউটপুট হিসাবে একটি প্রোফাইল ডেটা ফাইল পাই । আমরা সেই ফাইলটি গ্রাফিকভাবে এসভিজি হিসাবে দেখতে পারি:

google-pprof --web main.out prof.out

এখানে চিত্র বর্ণনা লিখুন

যা অন্যান্য সরঞ্জামগুলির মতো পরিচিত কল গ্রাফ হিসাবে দেয় তবে সেকেন্ডের চেয়ে স্যাম্পল সংখ্যার ক্লঙ্কি ইউনিট সহ।

বিকল্পভাবে, আমরা এর সাথে কিছু পাঠ্য ডেটাও পেতে পারি:

google-pprof --text main.out prof.out

যা দেয়:

Using local file main.out.
Using local file prof.out.
Total: 187 samples
     187 100.0% 100.0%      187 100.0% common
       0   0.0% 100.0%      187 100.0% __libc_start_main
       0   0.0% 100.0%      187 100.0% _start
       0   0.0% 100.0%        4   2.1% fast
       0   0.0% 100.0%      187 100.0% main
       0   0.0% 100.0%      183  97.9% maybe_slow

আরও দেখুন: গুগল পারফ সরঞ্জামগুলি কীভাবে ব্যবহার করবেন

উবুন্টু 18.04, gprof2dot 2019.11.30, Valgrind 3.13.0, perf 4.15.18, লিনাক্স কার্নেল 4.15.0, FLameGraph 1a0dc6985aad06e76857cf2a354bd5ba0c9ce96b, gperftools 2.5-2 এ পরীক্ষিত।


2
ডিফল্টরূপে পারফ রেকর্ড ফ্রেম পয়েন্টার রেজিস্টার ব্যবহার করে। আধুনিক সংকলকগণ ফ্রেম ঠিকানা রেকর্ড করে না এবং পরিবর্তে একটি সাধারণ উদ্দেশ্য হিসাবে নিবন্ধ ব্যবহার করে। বিকল্পটি হ'ল -fno-omit-frame-pointerপতাকা দিয়ে সংকলন করা বা একটি ভিন্ন বিকল্প ব্যবহার করা: আপনার দৃশ্যের সাথে --call-graph "dwarf"বা তার --call-graph "lbr"উপর নির্ভর করে রেকর্ড করুন।
জর্জে বেলন

5

একক থ্রেডেড প্রোগ্রামগুলির জন্য আপনি igprof , ইগনোমিনাস প্রোফাইলার: https://igprof.org/ ব্যবহার করতে পারেন ।

এটি মাইক ডুনলাভে-র ... দীর্ঘ ... এর ধারায় একটি স্যাম্পলিং প্রোফাইলার, যা প্রতিটি কার্যক্রমে ব্যয় করা সময় বা মেমরির সাথে টীকাযুক্ত কোনও ব্রাউজযোগ্য কল স্ট্যাক গাছের ফলগুলি উপহার দেয় either প্রতি ফাংশন।


এটি আকর্ষণীয় দেখায় তবে জিসিসি 9.2 এর সাথে সংকলন করতে ব্যর্থ হয়। (ডেবিয়ান / সিড) আমি গিথুব নিয়ে একটি ইস্যু করেছি।
বাসাইল স্টারিঙ্কেভিচ

5

এছাড়াও উল্লেখযোগ্য

  1. এইচপিসিটিউলকিট ( http://hpctoolkit.org/ ) - ওপেন সোর্স, সমান্তরাল প্রোগ্রামগুলির জন্য কাজ করে এবং একটি জিইউআই রয়েছে যার সাথে ফলাফলগুলি একাধিক উপায়ে দেখার জন্য
  2. ইন্টেল ভিটিউন ( https://software.intel.com/en-us/vtune ) - আপনার যদি ইন্টেল সংকলক থাকে তবে এটি খুব ভাল
  3. টিএইউ ( http://www.cs.uoregon.edu/research/tau/home.php )

আমি এইচপিসিটিসুলকিট এবং ভিটিউন ব্যবহার করেছি এবং তারা তাঁবুতে দীর্ঘ মেরুটি খুঁজে পেতে খুব কার্যকর এবং আপনার কোডটি পুনরায় সংকলনের প্রয়োজন নেই (অর্থাত্ আউটপুট পেতে সিএমকেতে আপনাকে -g -O বা RelWithDebInfo টাইপ বিল্ড ব্যবহার করতে হবে) । শুনেছি টিএইউও ক্ষমতার সাথে একই রকম।


4

আমি আমার কোডটি গতি বাড়ানোর জন্য এই দুটি পদ্ধতি ব্যবহার করি:

সিপিইউ বাউন্ড অ্যাপ্লিকেশনগুলির জন্য:

  1. আপনার কোডের প্রশ্নবিদ্ধ অংশগুলি সনাক্ত করতে DEBUG মোডে একজন প্রোফাইলার ব্যবহার করুন
  2. তারপরে রিলেস মোডে স্যুইচ করুন এবং যতক্ষণ না আপনি পারফরম্যান্সে পরিবর্তন না দেখেন ততক্ষণ আপনার কোডের প্রশ্নবিদ্ধ বিভাগগুলিকে মন্তব্য করুন (এটিকে কিছুই না দিয়ে স্ট্যাব করুন)।

আই / ও বাউন্ড অ্যাপ্লিকেশনগুলির জন্য:

  1. আপনার কোডের প্রশ্নবিদ্ধ অংশগুলি সনাক্ত করতে রিলেস মোডে একজন প্রোফাইলার ব্যবহার করুন।

বিশেষ দ্রষ্টব্য

আপনার যদি প্রোফাইলার না থাকে তবে দরিদ্র ব্যক্তির প্রোফাইলারটি ব্যবহার করুন। আপনার অ্যাপ্লিকেশনটি ডিবাগ করার সময় বিরতি দিন। বেশিরভাগ বিকাশকারী স্যুট মন্তব্য করা লাইনের সংখ্যার সাথে সমাবেশে বিভক্ত হবে। আপনি পরিসংখ্যানগতভাবে এমন একটি অঞ্চলে অবতরণ করতে পারেন যা আপনার বেশিরভাগ সিপিইউ চক্র খাচ্ছে।

সিপিইউর জন্য, ডিইবিইউজি মোডে প্রোফাইলিংয়ের কারণ হ'ল যদি আপনার রিলিজ মোডে প্রোফাইলিংয়ের চেষ্টা করা হয়, তবে সংকলকটি গণিত হ্রাস করবে, ভেক্টরাইজ লুপগুলি এবং ইনলাইন ফাংশনগুলি যা আপনার কোডটি একত্রিত করার সময় একটি অ-ম্যাপেবল মেসে পরিণত করবে। একটি অ-ম্যাপেবল গোলযোগের অর্থ আপনার প্রোফাইলারটি এত দিন কী নিচ্ছে তা পরিষ্কারভাবে সনাক্ত করতে সক্ষম হবে না কারণ সমাবেশটি অপ্টিমাইজেশনের অধীনে উত্স কোডের সাথে সামঞ্জস্য করতে পারে না । আপনার যদি রিলেস মোডের পারফরম্যান্সের (যেমন সময় সংবেদনশীল) প্রয়োজন হয় তবে একটি ব্যবহারযোগ্য পারফরম্যান্স রাখতে প্রয়োজনীয় ডিবাগার বৈশিষ্ট্যগুলি অক্ষম করুন।

আই / ও-বাউন্ডের জন্য, প্রোফাইলার এখনও রিলিজ মোডে আই / ও ক্রিয়াকলাপগুলি সনাক্ত করতে পারে কারণ আই / ও ক্রিয়াকলাপগুলি বাহ্যিকভাবে কোনও ভাগ করা লাইব্রেরি (বেশিরভাগ সময়) এর সাথে সংযুক্ত থাকে বা সবচেয়ে খারাপ ক্ষেত্রে, পরিণতিতে সিস্ট- কল বিঘ্নিত ভেক্টর (যা প্রোফাইলার দ্বারা সহজেই সনাক্তযোগ্য)।


2
+1 দরিদ্র লোকটির পদ্ধতি সিপিইউ বাউন্ডের মতো আই / ও বাউন্ডের জন্য ঠিক তেমনি কাজ করে এবং আমি DEBUG মোডে সমস্ত পারফরম্যান্স টিউনিং করার পরামর্শ দিই। আপনি যখন টিউনিং শেষ করবেন, তারপরে রিলেস চালু করুন। প্রোগ্রামটি আপনার কোডে সিপিইউ-তে আবদ্ধ থাকলে এটি একটি উন্নতি করবে। প্রক্রিয়াটির একটি অশোধিত তবে সংক্ষিপ্ত ভিডিও এখানে।
মাইক ডুনলাভে

3
পারফরম্যান্স প্রোফাইলিংয়ের জন্য আমি DEBUG বিল্ডগুলি ব্যবহার করব না। প্রায়শই আমি দেখেছি যে ডিইবিইউজি মোডে পারফরম্যান্সের সমালোচনামূলক অংশগুলি রিলিজ মোডে সম্পূর্ণরূপে অনুকূলিত। আর একটি সমস্যা হ'ল ডিবাগ কোডে সংস্থাগুলির ব্যবহার যা কার্য সম্পাদনে শব্দের যোগ করে।
gast128

3
আপনি কি আমার পোস্টটি আদৌ পড়েছেন? "আপনার যদি রিলেস মোডের পারফরম্যান্সের (যেমন সময় সংবেদনশীল) প্রয়োজন হয়, একটি ব্যবহারযোগ্য পারফরম্যান্স রাখতে প্রয়োজনীয় ডিবাগার বৈশিষ্ট্যগুলি অক্ষম করুন", "তারপরে রিলিজ মোডে স্যুইচ করুন এবং আপনার কোডের প্রশ্নবিদ্ধ বিভাগগুলিতে মন্তব্য করুন (এটি কিছুই না দিয়ে স্টাব করুন) যতক্ষণ না আপনি দেখতে পান পারফরম্যান্সে পরিবর্তন? আমি বলেছিলাম যে ডিবাগ মোডে সম্ভাব্য সমস্যার ক্ষেত্রগুলি পরীক্ষা করুন এবং আপনার উল্লিখিত সমস্যাটি এড়াতে রিলিজ মোডে এই সমস্যাগুলি যাচাই করুন।
এসইও

2

আপনি আইপ্রফ গ্রন্থাগারটি ব্যবহার করতে পারেন:

https://gitlab.com/Neurochrom/iprof

https://github.com/Neurochrom/iprof

এটি ক্রস প্ল্যাটফর্ম এবং আপনাকে রিয়েল-টাইমে আপনার অ্যাপ্লিকেশনটির পারফরম্যান্সও পরিমাপ করতে দেয় না। আপনি এটি একটি লাইভ গ্রাফের সাথে জোড় করতে পারেন। সম্পূর্ণ অস্বীকৃতি: আমি লেখক।


2

আপনি লগিং ফ্রেমওয়ার্ক ব্যবহার করতে পারেন যেমন loguruএটিতে টাইমস্ট্যাম্প এবং মোট আপটাইম অন্তর্ভুক্ত রয়েছে যা প্রোফাইলিংয়ের জন্য সুন্দরভাবে ব্যবহার করা যেতে পারে:


1

কর্মক্ষেত্রে আমাদের কাছে একটি দুর্দান্ত সরঞ্জাম রয়েছে যা সময় নির্ধারণের ক্ষেত্রে আমরা কী চাই তা নিরীক্ষণ করতে সহায়তা করে। এটি বহুবার কার্যকর হয়েছে।

এটি সি ++ এ রয়েছে এবং অবশ্যই আপনার প্রয়োজন অনুসারে কাস্টমাইজ করা উচিত। দুর্ভাগ্যক্রমে আমি কোড ভাগ করতে পারছি না, কেবল ধারণাগুলি। আপনি volatileটাইমস্ট্যাম্প এবং ইভেন্ট আইডি সহ একটি "বৃহত্তর" বাফার ব্যবহার করেন যা আপনি পোস্ট মর্টেম ডাম্প করতে পারেন বা লগিং সিস্টেমটি বন্ধ করার পরে (এবং উদাহরণস্বরূপ এটি কোনও ফাইলে ফেলে দিতে পারেন)।

আপনি সমস্ত ডেটা সহ তথাকথিত বৃহত্তর বাফারটি পুনরুদ্ধার করেন এবং একটি ছোট ইন্টারফেস এটিকে পার্স করে এবং নাম (আপ / ডাউন + মান) সহ ইভেন্টগুলি দেখায় যেমন একটি অ্যাসিলোস্কোপ রঙের সাথে (কনফিগার করা থাকে) .hpp ফাইলটিতে ) হয়।

আপনি যা চান তার উপর সম্পূর্ণ ফোকাস করার জন্য উত্পন্ন ইভেন্টগুলির পরিমাণ আপনি কাস্টমাইজ করে নিন। প্রতি সেকেন্ডে লগ হওয়া ইভেন্টের পরিমাণের উপর ভিত্তি করে আমরা যে পরিমাণ সিপিইউ চেয়েছিলাম তা গ্রহণের সময়সূচী সমস্যাগুলির জন্য এটি আমাদের অনেক সহায়তা করেছিল।

আপনার 3 টি ফাইল দরকার:

toolname.hpp // interface
toolname.cpp // code
tool_events_id.hpp // Events ID

ধারণাটি হ'ল ইভেন্টগুলিকে এরকমভাবে সংজ্ঞায়িত করা tool_events_id.hpp:

// EVENT_NAME                         ID      BEGIN_END BG_COLOR NAME
#define SOCK_PDU_RECV_D               0x0301  //@D00301 BGEEAAAA # TX_PDU_Recv
#define SOCK_PDU_RECV_F               0x0302  //@F00301 BGEEAAAA # TX_PDU_Recv

আপনি এখানে কয়েকটি ফাংশন সংজ্ঞায়িত করুন toolname.hpp:

#define LOG_LEVEL_ERROR 0
#define LOG_LEVEL_WARN 1
// ...

void init(void);
void probe(id,payload);
// etc

আপনার কোড যেখানেই আপনি ব্যবহার করতে পারেন:

toolname<LOG_LEVEL>::log(EVENT_NAME,VALUE);

দ্য probeফাংশন কয়েক সমাবেশ লাইন ব্যবহার যত শীঘ্র সম্ভব ঘড়ি টাইমস্ট্যাম্প পুনরুদ্ধার করতে এবং তারপর বাফারে একটি এন্ট্রি সেট করে। লগ ইভেন্টটি কোথায় সঞ্চয় করতে হবে তা নিরাপদে একটি সূচক খুঁজতে আমাদেরও একটি পারমাণবিক বৃদ্ধি রয়েছে। অবশ্যই বাফারটি বিজ্ঞপ্তিযুক্ত।

আশা করি নমুনা কোডের অভাবে ধারণাটি অবরুদ্ধ নয়।


1

আসলে গুগল / বেঞ্চমার্ক সম্পর্কে উল্লেখ না করে কিছুটা বিস্মিত হয়েছে , কোডের নির্দিষ্ট ক্ষেত্রটি পিন করা কিছুটা কষ্টকর, বিশেষত যদি কোড বেসটি কিছুটা বড় হয় তবে এর সাথে সংমিশ্রণে ব্যবহার করার সময় আমি এটিকে সত্যিই সহায়ক বলে মনে করিcallgrind

আইএমএইচও এখানে যে টুকরোটি বাধা সৃষ্টি করছে তা সনাক্ত করা এখানে মূল কী। আমি তবে প্রথমে নিম্নলিখিত প্রশ্নগুলির উত্তর দিয়ে চেষ্টা করব এবং তার ভিত্তিতে সরঞ্জামটি বেছে নেব

  1. আমার অ্যালগরিদম সঠিক?
  2. এমন কোনও তালা রয়েছে যা বোতল ঘাড় হিসাবে প্রমাণিত হচ্ছে?
  3. কোডের কোনও নির্দিষ্ট বিভাগ যা অপরাধী হিসাবে প্রমাণিত হয়?
  4. আইও, পরিচালনা এবং অনুকূলিতকরণ সম্পর্কে কীভাবে?

valgrindসমন্বয় সঙ্গে callrindএবং kcachegrindউপরে পয়েন্ট একটি শালীন প্রাক্কলন প্রদান করা উচিত এবং একদা এটিকে প্রতিষ্ঠিত এর কোড কিছু অধ্যায় সমস্যা আছে, আমি একটি মাইক্রো তলচিহ্ন না করার সুপারিশ করছি google benchmarkএকটি ভাল জায়গা শুরু হয়।


1

-pgকোডটি সংকলন ও লিঙ্ক করার সময় পতাকা ব্যবহার করুন এবং এক্সিকিউটেবল ফাইলটি চালান। যখন এই প্রোগ্রামটি কার্যকর করা হয়, প্রোফাইলিং ডেটা a.out ফাইলে সংগ্রহ করা হয়।
দুটি পৃথক ধরণের প্রোফাইলিং রয়েছে

1- ফ্ল্যাট প্রোফাইলিং:
কমান্ডটি চালিয়ে gprog --flat-profile a.outআপনি নিম্নলিখিত তথ্যটি পেয়েছিলেন
- ফাংশনের জন্য সামগ্রিক সময়ের কত শতাংশ ব্যয় হয়েছিল
- কোনও ফাংশনে কত সেকেন্ড ব্যয় করা হয়েছিল - সাব-ফাংশনগুলিতে কল সহ এবং ব্যতীত
- কল,
- প্রতি কল প্রতি গড় সময়।

2- গ্রাফ
আমাদের gprof --graph a.outপ্রতিটি ফাংশনের জন্য নিম্নলিখিত তথ্য পাওয়ার জন্য কমান্ড প্রোফাইল দিচ্ছে
- যার প্রতিটি বিভাগে একটি ফাংশন একটি সূচক সংখ্যার সাথে চিহ্নিত করা হয়।
- ফাংশনের উপরে, ফাংশনগুলির একটি তালিকা রয়েছে যা ফাংশনটিকে কল করে।
- ফাংশনের নীচে, ফাংশনগুলির একটি তালিকা রয়েছে যা ফাংশন দ্বারা ডাকা হয়।

আরও তথ্য পেতে আপনি https://sourceware.org/binutils/docs-2.32/gprof/ এ দেখতে পারেন


0

আর্ম এমএপ-তে কেউ উল্লেখ না করায় আমি ব্যক্তিগতভাবে এটিকে যুক্ত করব আমি একটি সি ++ বৈজ্ঞানিক প্রোগ্রাম প্রোফাইলের জন্য মানচিত্রটি সফলভাবে ব্যবহার করেছি।

আর্ম এমএপি হ'ল সমান্তরাল, মাল্টিথ্রেডেড বা একক থ্রেডেড সি, সি ++, ফোর্টরান এবং এফ 90 কোডগুলির প্রোফাইলার। এটি উত্সরেখায় গভীর-বিশ্লেষণ এবং অলসতার পিনপয়েন্টিং সরবরাহ করে। বেশিরভাগ প্রোফাইলারের বিপরীতে, এটি সমান্তরাল এবং থ্রেডযুক্ত কোডের জন্য প্রাইমপ্রেড, ওপেনএমপি বা এমপিআই সক্ষম করতে ডিজাইন করা হয়েছে।

এমএপি বাণিজ্যিক সফ্টওয়্যার।


0

একটি ডিবাগিং সফ্টওয়্যার ব্যবহার করুন কোডটি ধীরে ধীরে কোথায় চলছে তা সনাক্ত করবেন কীভাবে?

আপনি কেবল গতিতে চলার সময় মনে করেন যে আপনার বাধা আছে তবে তা আপনার গতি হ্রাস করবে

অযাচিত রিলোকেশনের লুপিং, বাফার ওভারফ্লোস, অনুসন্ধান, মেমরি ফাঁস ইত্যাদির মতো ক্রিয়াকলাপটি আরও কার্যকর করার ক্ষমতা গ্রহণ করে যা কোডটির কার্যকারিতার উপরে বিরূপ প্রভাব ফেলবে, প্রোফাইলিংয়ের আগে সংকলনে -pg যুক্ত করতে ভুলবেন না:

g++ your_prg.cpp -pgবা cc my_program.cpp -g -pgআপনার সংকলক অনুসারে

এটি এখনও চেষ্টা করে দেখেনি তবে আমি গুগল-পারফিউল সম্পর্কে ভাল জিনিস শুনেছি। এটি অবশ্যই চেষ্টা করার মতো।

valgrind --tool=callgrind ./(Your binary)

এটি gmon.out বা কলগ্রাইন্ড.আউট.এক্স নামে একটি ফাইল তৈরি করবে। তারপরে আপনি এই ফাইলটি পড়ার জন্য কেচেকেগ্রিন্ড বা ডিবাগার সরঞ্জামটি ব্যবহার করতে পারেন। কোন লাইনে কত খরচ হয় তার ফলাফল সহ এটি আপনাকে জিনিসগুলির একটি গ্রাফিকাল বিশ্লেষণ দেবে।

আমি তাই মনে করি

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.