জিআরফোফের বিকল্প [বন্ধ]


166

অন্যান্য প্রোগ্রামগুলি জিপিআরফ হিসাবে একই জিনিস করে?


2
আপনি কোন প্ল্যাটফর্মে আগ্রহী?
osgx

2
আমি লিনাক্সে আগ্রহী।
নিউরোমান্সার


13
@Gregory - আমি ঐ উত্তরের সব 6 তার নিজের প্রশ্নের হচ্ছে সম্মত নত করছি, এবং হয়ত সে তার নিজের উত্তরের সঙ্গে অবদান উচিত, 229 বনাম 6, ...
জাঁ বার্নার্ড Pellerin

5
এই প্রশ্নটি কীভাবে গঠনমূলক হতে পারে না?
জনআর্টুগো

উত্তর:


73

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


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

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

3
... এটা দেখ. আমি মনে করি তারা প্রায় সঠিক পথে আছে: rotateright.com/zoom.html
মাইক

195

gprof (কাগজ পড়ুন) historical তিহাসিক কারণে বিদ্যমান। আপনি যদি মনে করেন এটি পারফরম্যান্সের সমস্যাগুলি খুঁজতে আপনাকে সহায়তা করবে, এটি এর আগে কখনও বিজ্ঞাপন দেওয়া হয়নি। কাগজটি যা বলেছে তা এখানে:

প্রোপেলটি বিভিন্ন বাস্তবায়নের ব্যয়ের তুলনা এবং মূল্যায়ন করতে ব্যবহার করা যেতে পারে।

এটি বলে না যে এটি মূল্যায়ন করার জন্য বিভিন্ন বাস্তবায়ন সনাক্ত করতে ব্যবহার করা যেতে পারে, যদিও এটি বোঝায় যে এটি বিশেষ পরিস্থিতিতে, এটি করতে পারে:

বিশেষত যদি প্রোগ্রামটির ছোট্ট অংশগুলি এটির প্রয়োগের সময়টিকে প্রাধান্য দেয়।

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

পরিবর্তে এটি চেষ্টা করুন।
এখানে 44x গতির একটি উদাহরণ রয়েছে।
এখানে একটি 730x স্পিডআপ।
এখানে একটি 8 মিনিটের ভিডিও প্রদর্শন রয়েছে।
এখানে পরিসংখ্যান একটি ব্যাখ্যা।
সমালোচনার একটি উত্তর এখানে।

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

জি.আর.পি.ফ কর্মক্ষমতা সম্পর্কে কিছু মিথকথাকে মূর্ত করে তোলে যেমন:

  1. প্রোগ্রামের কাউন্টার স্যাম্পলিং দরকারী।
    এটি কেবলমাত্র তখনই কার্যকর যখন আপনার একটি অপ্রয়োজনীয় হটস্পট বাধা যেমন যেমন স্কেলারের মানগুলির একটি বৃহত অ্যারের বুদ্বুদ সাজান। উদাহরণস্বরূপ, আপনি যত তাড়াতাড়ি স্ট্রিং-তুলনা ব্যবহার করে এটিকে সাজানোর ক্ষেত্রে পরিবর্তন করুন, এটি এখনও একটি বাধা but অন্যদিকে যদি এটি প্রসারিত প্রোগ্রামের কাউন্টার (কল স্ট্যাক) কে নমুনা দেয় তবে স্ট্রিং-তুলনা বলা হয় এমন বিন্দুটি সাজানোর লুপটি স্পষ্টভাবে প্রদর্শিত হয়। প্রকৃতপক্ষে, gprof ছিল কেবলমাত্র পিসি-স্যাম্পলিংয়ের সীমাবদ্ধতার প্রতিকার করার একটি প্রচেষ্টা।

  2. সময় গ্রহণের কোডগুলি সময় গ্রহণের চেয়ে সময় নির্ধারণের কাজগুলি আরও গুরুত্বপূর্ণ।
    এই পৌরাণিক কাহিনীর কারণ হ'ল gprof স্ট্যাক নমুনাগুলি ক্যাপচার করতে সক্ষম ছিল না, সুতরাং পরিবর্তে এটি কার্য সম্পাদন করে, তাদের প্রার্থনার গণনা করে এবং কল গ্রাফ ক্যাপচার করার চেষ্টা করে। যাইহোক, একবার কোনও ব্যয়বহুল ফাংশন শনাক্ত হয়ে গেলে, আপনার এখনও সময়ের জন্য দায়ী রেখাগুলির জন্য এটির ভিতরে নজর রাখা দরকার। যদি সেখানে স্ট্যাক স্যাম্পল থাকে তবে আপনাকে দেখার দরকার নেই, সেই লাইনগুলি নমুনাগুলিতে থাকবে। (একটি সাধারণ ফাংশনটিতে 100 - 1000 নির্দেশাবলী থাকতে পারে A একটি ফাংশন কল 1 নির্দেশনা, যাতে ব্যয়বহুল কলগুলি সনাক্ত করে এমন কোনও কিছু 2-3 মাত্রার মাত্রা আরও সুনির্দিষ্ট হয়))

  3. যে কল গ্রাফ গুরুত্বপূর্ণ।
    কোন প্রোগ্রাম সম্পর্কে আপনার যা জানা দরকার তা এটি যেখানে সময় ব্যয় করে তা নয় but why। যখন এটি কোনও ফাংশনে সময় ব্যয় করে, স্ট্যাকের কোডের প্রতিটি লাইন এটি কেন আছে তা নিয়ে যুক্তির শৃঙ্খলে একটি লিঙ্ক দেয়। যদি আপনি কেবল স্ট্যাকের কিছু অংশ দেখতে পান তবে আপনি কেবল কারণটির কিছু অংশ দেখতে পাচ্ছেন, সুতরাং সেই সময়টি আসলে প্রয়োজনীয় কিনা তা আপনি নিশ্চিতভাবে বলতে পারবেন না। কল গ্রাফ আপনাকে কী বলে? প্রতিটি চাপ আপনাকে বলে যে কিছু ফাংশন এ সময়ের কিছু অংশের জন্য কিছু ফাংশন বি কল করার প্রক্রিয়াধীন ছিল। এমনকি বি এর কাছে কল করার কোডের এ জাতীয় একটি মাত্র লাইন থাকলেও, এই লাইনটি কারণের একটি ছোট্ট অংশ দেয়। আপনি যদি যথেষ্ট ভাগ্যবান হন তবে সেই লাইনের কোনও দুর্বল কারণ থাকতে পারে। সাধারণত, দুর্বল কারণ খুঁজে পেতে আপনাকে একযোগে একাধিক লাইন দেখতে হবে। যদি A একাধিক স্থানে বি কে কল করে তবে এটি আপনাকে আরও কম বলে।

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

  5. সময় পরিমাপের সঠিকতা (এবং সেইজন্য প্রচুর নমুনা) গুরুত্বপূর্ণ important
    এক সেকেন্ডের জন্য এটি সম্পর্কে চিন্তা করুন। কোডের একটি লাইন যদি পাঁচটির মধ্যে 3 টি নমুনায় থাকে তবে আপনি যদি এটি একটি হালকা বাল্বের মতো গুলি করতে পারেন তবে এটি প্রায় 60% কম সময় ব্যবহৃত হবে। এখন, আপনি জানেন যে আপনি যদি অন্য 5 টি নমুনা নিয়ে থাকেন তবে আপনি এটি কেবল 2 বার বা 4 টির মতো দেখতে পেয়েছেন So সুতরাং 60% পরিমাপ 40% থেকে 80% পর্যন্ত সাধারণ পরিসরের মতো। যদি এটি কেবল 40% হত, আপনি কি বলবেন যে সমস্যাটি ঠিক করার মতো নয়? সুতরাং সময়ের যথার্থতার বিন্দুটি কী, যখন আপনি সত্যিকার অর্থেই সমস্যাগুলি অনুসন্ধান করতে চান ? 500 বা 5000 নমুনাগুলি আরও বৃহত্তর নির্ভুলতার সাথে সমস্যাটি পরিমাপ করত তবে আরও সঠিকভাবে এটি খুঁজে পেত না।

  6. বিবৃতি বা ফাংশন আমন্ত্রণের গণনা কার্যকর।
    মনে করুন আপনি জানেন যে কোনও ফাংশন 1000 বার বলা হয়েছে। আপনি কি বলতে পারেন যে এটির কতটা সময় ব্যয় হয়? আপনার এটিও জানতে হবে যে এটি চালাতে কত সময় লাগে, গড় হিসাবে, এটি গণনা দ্বারা গুণ করে এবং মোট সময় দ্বারা ভাগ করে নেওয়া। গড় প্রার্থনার সময় ন্যানোসেকেন্ড থেকে সেকেন্ডে আলাদা হতে পারে, তাই একা গণনা খুব বেশি কিছু বলে না। যদি স্ট্যাকের নমুনা থাকে তবে একটি রুটিন বা কোনও বিবৃতি ব্যয় হ'ল এটি স্যাম্পলগুলির ভগ্নাংশ। সময়ের সেই ভগ্নাংশটি হ'ল নীতিগতভাবে সামগ্রিকভাবে কীভাবে সংরক্ষণ করা যেতে পারে যদি রুটিন বা বিবৃতিতে কোনও সময় না নেওয়া যায়, সুতরাং পারফরম্যান্সের সাথে এটিই সর্বাধিক প্রত্যক্ষ সম্পর্ক।

  7. অবরুদ্ধ অবস্থায় নমুনাগুলি নেওয়া প্রয়োজন হবে না
    এই কল্পকাহিনীর কারণগুলি দ্বিগুণ: 1) প্রোগ্রামের অপেক্ষায় থাকা পিসি স্যাম্পলিং অর্থহীন এবং 2) সময়ের যথার্থতার সাথে ব্যস্ততা। তবে, (1) এর জন্য প্রোগ্রামটি খুব ভালভাবে অপেক্ষা করছে এমন কোনও কিছুর জন্য অপেক্ষা করছে, যেমন ফাইল I / O, যা আপনার জানা দরকার এবং কোন স্ট্যাকের নমুনাগুলি প্রকাশিত হয় be (স্পষ্টতই আপনি ব্যবহারকারীর ইনপুটটির জন্য অপেক্ষা করার সময় নমুনাগুলি বাদ দিতে চান)) (2) যদি প্রোগ্রামটি কেবল অন্য প্রক্রিয়াগুলির সাথে প্রতিযোগিতার কারণে অপেক্ষা করে থাকে, সম্ভবত এটি চলমান অবস্থায় মোটামুটি এলোমেলোভাবে ঘটে। সুতরাং যখন প্রোগ্রামটি আরও বেশি সময় নিচ্ছে, তবে এটি পরিসংখ্যানগুলির ক্ষেত্রে বড় প্রভাব ফেলবে না, বিবৃতি স্ট্যাকের যে শতাংশে রয়েছে তার কত শতাংশ।

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

  9. নমুনাগুলি উচ্চ ফ্রিকোয়েন্সিতে নিতে হবে
    এটি এই ধারণা থেকে আসে যে কোনও পারফরম্যান্স সমস্যা দ্রুত-অভিনয় হতে পারে এবং নমুনাগুলি আঘাত করার জন্য ঘন ঘন থাকতে হয়। তবে, যদি সমস্যাটির ব্যয় হয়, 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।)

  10. আপনি খোঁজার চেষ্টা করছেন বোতলের
    যেন ছিল কেবল এক। নিম্নলিখিত কার্যনির্বাহনের সময়রেখা বিবেচনা করুন: vxvWvzvWvxvWvYvWvxvWv.vWvxvWvYvW
    এতে প্রকৃত উপকারী কাজ থাকে যা প্রতিনিধিত্ব করে .vWxYzযথাক্রমে 1/2, 1/4, 1/8, 1/16, 1/32 সময় নেওয়ার ক্ষেত্রে পারফরম্যান্স সমস্যা রয়েছে । নমুনা vসহজেই খুঁজে পায় । এটি মুছে ফেলা হয়েছে,
    xWzWxWYWxW.WxWYW
    এখন ছেড়ে প্রোগ্রামটি চালাতে Wআধ ঘন্টা সময় নেয় এবং এখন অর্ধেক সময় নেয় এবং সহজেই পাওয়া যায়। এটি মুছে ফেলা হয়, রেখে
    xzxYx.xY
    এই প্রক্রিয়াটি চলতে থাকে, প্রতিবারের চেয়ে বড় সরিয়ে, পারফরম্যান্স সমস্যা, যতক্ষণ না অপসারণ করার মতো কিছু পাওয়া যায় না। এখন কেবলমাত্র মৃত্যুদন্ড কার্যকর করা হ'ল ., যা মূল প্রোগ্রাম দ্বারা ব্যবহৃত 1/332 সময় কার্যকর করে। এই ম্যাগনিফিকেশন প্রভাব, যার দ্বারা যেকোন সমস্যা অপসারণ করলে বাকী শতাংশকে আরও বড় করে তোলে, কারণ হরক হ্রাস পেয়েছে।
    আর একটি গুরুত্বপূর্ণ বিষয়টি হ'ল প্রতিটি একক সমস্যা অবশ্যই খুঁজে পেতে হবে - ৫ টির মধ্যে একটিও অনুপস্থিত Any কিছু খুঁজে পাওয়া, তবে সবগুলিই "যথেষ্ট ভাল" নয়।

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

বার্কলে বু প্লিমসন কলোরাডো ডিউক এয়ারলহাম ফসু ইন্ডিয়ানা মিট এম এস এস এনসিএসএইলিনয়েস এনসিএসু নিউ ইউ ইউ প্রিন্সটন পিএসইউ স্ট্যানফোর্ড ইউসিএসডি ইউএমডি ইউমিচ ইউটিএইচ ইউটিএক্স ইউটেক্স ওয়াস্টল

** কাজ করার অনুরোধ করার অন্যান্য উপায়গুলি বাদ দিয়ে, কেন বার্তা পোস্ট করে যেমন বলা হচ্ছে তা খুঁজে বের করবেন না ।


3
@ নরম্যান: আমি এর উপর ভিত্তি করে একটি প্রোফাইলার তৈরি করেছি, ডস-এর জন্য সি তে, '93 এর কাছাকাছি। আমি এটিকে এখনও-অন্য-পারফরম্যান্স-অ্যানালাইজার বলেছি এবং আইইইই বৈঠকে এটিকে ঘিরে ফেলেছি, তবে এটি যতদূর গেছে। জোট নামে রোটেটরাইটের একটি পণ্য রয়েছে যা খুব বেশি দূরে নয়। * নিক্সে , pstack ম্যানুয়ালি এটি করার জন্য ভাল। কাজের জন্য আমার করণীয় তালিকা (উইন্ডোতে ফার্মাকামট্রিক্স) প্রায় এক মাইল লম্বা যা মজার প্রকল্পগুলিকে বাধা দেয়, পরিবারের উল্লেখ না করে। এটি কার্যকর হতে পারে: স্ট্যাকওভারফ্লো.com
মাইক ডুনলাভে

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

7
@osgx: আমি কিছু ছিঁড়তে চাইছি না। এটি একটি পুরানো প্রিয় অটোমোবাইলের মতো, সহজ ও রাগযুক্ত, তবে এমন কিছু জিনিস যা তা করে না, এবং সেগুলি সম্পর্কে আমাদের সচেতন হওয়া দরকার এবং কেবল এটি নয়, আমাদের পৌরাণিক কাহিনী থেকে জাগ্রত হওয়া দরকার need আমি প্রশংসা করি যে কয়েকটি প্ল্যাটফর্মে স্ট্যাকের নমুনাগুলি পাওয়া খুব কঠিন হতে পারে, তবে যদি কোনও সমস্যা এমন হয় যে জিপিওফ এটি খুঁজে পাবে না, তবে এটি কেবলমাত্র একমাত্র হাতিয়ার হ'ল ছোট আরাম comfort
মাইক ডুনলাভে

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

2
@ ম্যাট: আইও পারফরম্যান্স সমস্যার উদাহরণগুলি এইভাবে পাওয়া গেছে: 1) কোনও ফাইল বা কনসোলে লগ বার্তা প্রিন্ট করা, যা ভ্রান্তভাবে তুচ্ছ বলে মনে করা হয়েছিল। 2) পাঠ্য এবং সংখ্যা আইওতে দ্বিগুণ মধ্যে রূপান্তর। 3) ভূগর্ভস্থ আইও স্টার্টআপের সময় আন্তর্জাতিকীকরণের স্ট্রিংগুলি বের করে, যে স্ট্রিংগুলি সক্রিয় হয় সেগুলি আন্তর্জাতিকীকরণের প্রয়োজন হয় না। আমি এই জাতীয় উদাহরণ প্রচুর হিট করেছি।
মাইক ডুনলাভে

63

যেহেতু আমি এখানে কিছু দেখিনি 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;
}

আমি কেবল আপনার উদাহরণটি চালিয়েছি এবং 5 টি স্ট্যাকশট নিয়েছি। তারা যা পেয়েছিল তা এখানে: 40% (মোটামুটি) সময় f1কল করেছিল delete। 40% (মোটামুটি) সময় process_requestকল করছিল delete। বাকী অংশের একটি ভাল অংশ ব্যয় করা হয়েছিল new। পরিমাপগুলি মোটামুটি, তবে হটস্পটগুলি পিনপাইনড।
মাইক ডুনলাভে

একটি কি stackshot? এটা কি ফলাফল pstack?

2
As in my answer, you run it under a debugger and hit ^C at a random time and capture the stack trace। 1) আমি মনে করি যে আপনার গ্রাহকের সার্ভারে চলমান কোনও প্রোগ্রামের জন্য পারফরম্যান্স সমস্যার বিশ্লেষণ করার প্রয়োজন হলে আপনার কৌশলটি কার্যকর নয়। 2) আমি নিশ্চিত নই যে আপনি বিভিন্ন অনুরোধগুলি পরিচালনা করে এমন প্রচুর থ্রেডযুক্ত একটি প্রোগ্রামের তথ্য পেতে আপনি এই কৌশলটি কীভাবে প্রয়োগ করেন। মানে যখন সাধারণ ছবিটি বেশ জটিল।

2
# 1 হিসাবে। কখনও কখনও গ্রাহকরা কল করে বলেন যে আপনার প্রোগ্রামটি ধীরে ধীরে কাজ করে। আপনি তাত্ক্ষণিকভাবে বলতে পারেন না যে the problem is outside your code, পারেন? যেহেতু আপনার পয়েন্টটি সমর্থন করার জন্য আপনার কিছু তথ্য প্রয়োজন হতে পারে। এই পরিস্থিতিতে আপনার কোনও সময় আপনার অ্যাপ্লিকেশনটির প্রোফাইল প্রয়োজন হতে পারে। আপনি কেবল আপনার গ্রাহককে জিডিবি শুরু করতে এবং সেন্টিগ্রেড চাপতে এবং কল স্ট্যাকগুলি পেতে বলতে পারবেন না। এটা আমার বক্তব্য ছিল। এটি spielwiese.fontein.de/2012/01/22/… উদাহরণ । আমার এই সমস্যা ছিল এবং প্রোফাইলিংটি অনেক সাহায্য করেছিল।

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

21

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

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

জি.আর.পি.ফ. এর বিপরীতে, আপনি দু'এর একটিও ব্যবহার করে আপনার সিস্টেমে চলমান কোনও প্রক্রিয়া / বাইনারি প্রোফাইল করতে পারেন।


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

আফ্রোফাইল পছন্দ করেনি, মনে হয়েছিল হাফিজার্ড
ম্যাট জয়েনার

@ কোন নির্দিষ্ট পয়েন্ট?
এনকর্ন

স্ট্যাট ওভারফ্লোগুলি উত্পাদনের আগে এটি 10 ​​দশকের বেশি মৃত্যুর সাথে সামলাতে সক্ষম হয় নি, আউটপুটটি বিশেষভাবে কার্যকর ছিল না এবং ডকুমেন্টেশনটি ভয়ঙ্কর।
ম্যাট যোগদানকারী

1
@ টু ওপ্রোফিল: এআরএম, বিদ্যুৎ,
আইএ 64৪



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