c++ - উনল - সি++ বই




আমি কিভাবে লিনাক্সে চলমান সি++ কোড প্রোফাইল করতে পারি? (8)

আপনার লক্ষ্য একটি প্রোফাইলার ব্যবহার করা হয়, প্রস্তাবিত এক ব্যবহার করুন।

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

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

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

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

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

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

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

পিপিএস একটি মোটামুটি সাধারণতা হিসাবে, আপনার সফটওয়্যারটিতে বিমূর্ততার আরো স্তরগুলি, আপনি এটি দেখতে পাবেন যে এটি কর্মক্ষমতা সমস্যাগুলির কারণ (এবং দ্রুততর পেতে সুযোগ)।

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

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

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

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

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)

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                

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

ধরুন পূর্বের ধারণা ভিন্ন। ধরুন আমরা 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)

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%। তাই Bayes আমাদের সম্ভাব্য খরচ আমাদের অনুমান আপডেট করতে পারবেন। যদি ডেটা পরিমাণটি ছোট হয়, তবে এটি কীভাবে ব্যয় হয় তা সঠিকভাবে আমাদের জানাতে পারে না, কেবলমাত্র এটি ফিক্সিংয়ের জন্য যথেষ্ট বড়।

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

(চাবিটি হল আমরা একবার দেখেছি। আমরা যদি এটি একবার দেখতে পাই, তবে এটি f > 0. ছাড়া আর কিছুই বলবে না)

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

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

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

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

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


আপনি নিম্নলিখিত অপশন দিয়ে Valgrind ব্যবহার করতে পারেন

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

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


আমি আপনি GCC ব্যবহার করছেন অনুমান। স্ট্যান্ডার্ড সমাধান gprof সঙ্গে প্রফাইল হতে হবে।

প্রোফাইলিং আগে সংকলন যোগ করার জন্য নিশ্চিত করুন:

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

আমি এখনো এটি চেষ্টা করে নি কিন্তু google-perftools সম্পর্কে ভাল কিছু শুনেছি। এটা অবশ্যই একটি চেষ্টা মূল্য।

here সম্পর্কিত প্রশ্ন।

কিছু অন্যান্য buzzwords যদি gprof আপনার জন্য কাজ না করে: Valgrind , Intel VTune , Sun DTrace


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

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

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

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


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

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


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

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

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

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

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

এটি GNU Gprof (ডেবিয়ানের জন্য GNU Gprof ) 2.18.0.20080103 64-বিট ডেবিয়ান লেনিয়ের অধীনে চলছে, যদি এটি যে কেউকে সাহায্য করে।


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

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

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

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

callgrind_control -i on

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

callgrind_control -k

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

kcachegrind callgrind.out.*

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


Valgrind, callgrind এবং kacheachegrind ব্যবহার করুন:

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

callgrind.out.x তৈরি করে। Kcachegrind ব্যবহার করে এটি পড়ুন।

Gprof ব্যবহার করুন (অ্যাড-পিপি):

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

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

Google-perftools ব্যবহার করুন:

সময় নমুনা ব্যবহার করে, I / O এবং CPU বিঘ্ন প্রকাশ করা হয়।

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

অন্যরা: এএমডি কোডনালিস্ট (এএমডি কোডএক্সএল দ্বারা প্রতিস্থাপিত), অপ্রফফাইল, 'পারফ' টুলস (apt-get linux-tools ইনস্টল করুন)






profiling