ঠিক আছে, আপনি সমস্যার সংজ্ঞা দিচ্ছেন যেখানে মনে হয় উন্নতির খুব বেশি জায়গা নেই। এটি আমার অভিজ্ঞতায় মোটামুটি বিরল। আমি 1993 সালের নভেম্বরে ড। ডবসের একটি নিবন্ধে এটি ব্যাখ্যা করার চেষ্টা করেছি, কোনও প্রথাগত বর্জ্য ছাড়াই প্রচলিতভাবে সু-নকশিত অ-তুচ্ছ প্রোগ্রাম শুরু করে এবং প্রাচীর-ঘড়ির সময় 48 সেকেন্ড থেকে কমিয়ে আনা পর্যন্ত এটি একাধিক অনুকূলকরণের মধ্য দিয়ে নিয়েছিলাম 1.1 সেকেন্ডে, এবং উত্স কোডের আকারটি 4 এর ফ্যাক্টর দ্বারা হ্রাস পেয়েছে My আমার ডায়াগনস্টিক টুলটি এটি ছিল । পরিবর্তনের ক্রমটি ছিল:
পাওয়া প্রথম সমস্যাটি হ'ল তালিকার ক্লাস্টার ব্যবহার করা (বর্তমানে "পুনরায়" এবং "ধারক শ্রেণি" বলা হয়) অর্ধেক সময়ের জন্য অ্যাকাউন্টিং। এগুলি মোটামুটি সহজ কোড দিয়ে প্রতিস্থাপন করা হয়েছিল, সময়টি 20 সেকেন্ডে নামিয়ে আনে।
এখন সর্বাধিক সময় গ্রহণকারী হ'ল আরও বেশি তালিকা তৈরি করা। শতাংশ হিসাবে, এটি আগে এত বড় ছিল না, তবে এখন এটি কারণ বড় সমস্যাটি সরানো হয়েছিল। আমি এটির গতি বাড়ানোর একটি উপায় খুঁজে পাই এবং সময়টি 17 সেকেন্ডে নেমে যায়।
এখন সুস্পষ্ট অপরাধীদের খুঁজে পাওয়া শক্ত, তবে কয়েকটি ছোট আছে যা সম্পর্কে আমি কিছু করতে পারি এবং সময়টি 13 সেকেন্ডে নেমে যায়।
এখন মনে হচ্ছে কোনও প্রাচীর আঘাত করেছে। নমুনাগুলি আমাকে ঠিক কী করছে তা বলছে, তবে আমি উন্নতি করতে পারে এমন কোনও কিছুই খুঁজে পাচ্ছি না। তারপরে আমি প্রোগ্রামটির মূল নকশা, তার লেনদেন-চালিত কাঠামোর প্রতিফলন করি এবং জিজ্ঞাসা করি যে এটি সমস্ত তালিকা-অনুসন্ধান করছে যা এটি করছে যা সমস্যার প্রয়োজন অনুসারে আসলে বাধ্যতামূলক হয়।
তারপরে আমি একটি পুনরায় নকশার উপর আঘাত করি, যেখানে প্রোগ্রাম কোডটি আসলে উত্সের একটি ছোট সেট থেকে তৈরি করা হয় (প্রিপ্রোসেসর ম্যাক্রোগুলির মাধ্যমে), এবং যাতে প্রোগ্রামটি ক্রমাগত এমন জিনিসগুলি আবিষ্কার করে না যা প্রোগ্রামার জানে যে মোটামুটি অনুমানযোগ্য। অন্য কথায়, জিনিসগুলির ক্রম "ব্যাখ্যা" করবেন না, এটি "সংকলন" করুন।
- সেই পুনরায় ডিজাইনটি সম্পন্ন করা হয়, উত্স কোডটি 4 এর একটি ফ্যাক্টর দ্বারা সঙ্কুচিত করা হয় এবং সময়টি 10 সেকেন্ডে কমে যায়।
এখন, কারণ এটি এত তাড়াতাড়ি হচ্ছে, এটি নমুনা করা শক্ত, তাই আমি এটিকে 10 গুণ বেশি কাজ দেই, তবে নিম্নলিখিত সময়গুলি মূল কাজের চাপের উপর ভিত্তি করে।
আরও নির্ণয়ের মাধ্যমে জানা যায় যে এটি সারি-পরিচালনায় সময় ব্যয় করছে। ইন-আস্তরণের ফলে সময়টি 7 সেকেন্ডে হ্রাস হয়।
এখন বড় সময় গ্রহণকারী হ'ল ডায়াগনস্টিক প্রিন্টিংটি আমি করছিলাম। ফ্লাশ যে - 4 সেকেন্ড।
এখন সবচেয়ে বড় সময় গ্রহণকারীরা হ'ল মলোক এবং বিনামূল্যে কল । রিসাইকেল অবজেক্টস - ২.6 সেকেন্ড
নমুনা অবিরত রেখে আমি এখনও অপারেশনগুলি খুঁজে পাই যা কঠোরভাবে প্রয়োজন হয় না - 1.1 সেকেন্ড।
মোট স্পিডআপ ফ্যাক্টর: 43.6
এখন কোনও দুটি প্রোগ্রাম এক রকম নয়, তবে খেলনাবিহীন সফ্টওয়্যারটিতে আমি সর্বদা এর মতো অগ্রগতি দেখেছি। প্রথমে আপনি সহজ স্টাফগুলি পাবেন এবং তারপরে আরও বেশি কঠিন, যতক্ষণ না আপনি হ্রাসের পরিমাণে ফিরে আসবেন। তারপরে আপনি যে অন্তর্দৃষ্টিটি পেয়েছেন তা পুনরায় ডিজাইনের দিকে নিয়ে যেতে পারে, নতুন গতির গতিবেগ শুরু করে, যতক্ষণ না আপনি আবার হ্রাসকারী রিটার্নগুলিকে আঘাত করেন। এখন এই বিন্দু যা এ কিনা আশ্চর্যের কিছু জানার জন্য পারে ++i
বা i++
বা for(;;)
বা while(1)
হয় দ্রুত: বিভিন্ন প্রকারের প্রশ্নের আমি স্ট্যাক ওভারফ্লো উপর তাই প্রায়ই দেখতে পাই।
পিএস আমি ভাবছি কেন আমি প্রোফাইলার ব্যবহার করিনি। উত্তরটি হ'ল এই "সমস্যা "গুলির প্রায় প্রতিটিই একটি ফাংশন কল সাইট ছিল, যা নমুনাগুলি পিনপয়েন্ট স্ট্যাক করে। প্রোফাইলার্স, আজও, সবেমাত্র এই ধারণাটি নিয়েই আসছেন যে বিবৃতি এবং কল নির্দেশাবলী পুরো ফাংশনগুলির চেয়ে সনাক্ত করা আরও গুরুত্বপূর্ণ এবং ঠিক করা সহজ।
এটি করার জন্য আমি প্রকৃতপক্ষে একটি প্রোফাইলার তৈরি করেছি, তবে কোডটি কী করছে তার সাথে সত্যিকারের ডাউন এবং মলিন ঘনিষ্ঠতার জন্য এটিতে আপনার আঙ্গুলগুলি ঠিকঠাক পাওয়ার কোনও বিকল্প নেই। নমুনাগুলির সংখ্যা কম বলে এটি কোনও সমস্যা নয়, কারণ যে সমস্যাগুলির দেখা পাচ্ছে তার কোনওটিই এত ছোট নয় যে সেগুলি সহজেই বাদ যায়।
যুক্ত: জেরিভিভিএল কয়েকটি উদাহরণের জন্য অনুরোধ করেছে। এখানে প্রথম সমস্যা। এতে একাধিক সংখ্যক পৃথক লাইন কোড থাকে, একসাথে অর্ধেক সময় নেয়:
/* IF ALL TASKS DONE, SEND ITC_ACKOP, AND DELETE OP */
if (ptop->current_task >= ILST_LENGTH(ptop->tasklist){
. . .
/* FOR EACH OPERATION REQUEST */
for ( ptop = ILST_FIRST(oplist); ptop != NULL; ptop = ILST_NEXT(oplist, ptop)){
. . .
/* GET CURRENT TASK */
ptask = ILST_NTH(ptop->tasklist, ptop->current_task)
এগুলি তালিকা ক্লাস্টার ILST ব্যবহার করছিল (তালিকার শ্রেণীর অনুরূপ)। এগুলি "তথ্য গোপন করা" সহ সাধারণ উপায়ে প্রয়োগ করা হয় যার অর্থ শ্রেণীর ব্যবহারকারীদের কীভাবে তাদের প্রয়োগ করা হয় সেদিকে খেয়াল রাখার কথা ছিল না। যখন এই রেখাগুলি লেখা হয়েছিল (কোডের প্রায় 800 লাইনগুলির মধ্যে) এই ধারণাটি দেওয়া হয়নি যে এগুলি একটি "বাধা" হতে পারে (আমি এই শব্দটিকে ঘৃণা করি)। এগুলি কেবল জিনিসগুলি করার প্রস্তাবিত উপায়। অন্ধকারে বলা সহজ যে এগুলি এড়ানো উচিত ছিল, তবে আমার অভিজ্ঞতায় পারফরম্যান্সের সমস্ত সমস্যা সে রকম। সাধারণভাবে, কার্য সম্পাদনের সমস্যাগুলি এড়ানোর চেষ্টা করা ভাল। তৈরি করা বিষয়গুলি সন্ধান করা এবং এটি ঠিক করা আরও ভাল, যদিও তাদের "এড়ানো উচিত ছিল" (পর্দার দৃষ্টিতে)।
এখানে দুটি পৃথক লাইনে দ্বিতীয় সমস্যাটি রয়েছে:
/* ADD TASK TO TASK LIST */
ILST_APPEND(ptop->tasklist, ptask)
. . .
/* ADD TRANSACTION TO TRANSACTION QUEUE */
ILST_APPEND(trnque, ptrn)
এগুলি তাদের প্রান্তে আইটেম যুক্ত করে তালিকা তৈরি করছে। (ঠিক করা ছিল অ্যারেগুলিতে আইটেমগুলি সংগ্রহ করা এবং তালিকাগুলি একবারে তৈরি করা)) মজার বিষয়টি হ'ল এই বিবৃতিগুলি মূল সময়ের মূলত (যেমন কল স্ট্যাকের উপর ছিল) 3/48 মূল্যের ব্যয় করে, তাই তারা ছিল না শুরুতে আসলে একটি বড় সমস্যা । তবে, প্রথম সমস্যাটি সরিয়ে দেওয়ার পরে, তাদের সময়টি 3/20 সময় ব্যয় করেছিল এবং এখন "বড় মাছ" ছিল। সাধারণভাবে, এটি এভাবেই চলে।
আমি যুক্ত করতে পারি যে এই প্রকল্পটি আমার সহায়তা করা একটি বাস্তব প্রকল্প থেকে পাতন করা হয়েছিল। সেই প্রকল্পে পারফরম্যান্সের সমস্যাগুলি অনেক বেশি নাটকীয় ছিল (স্পিডআপগুলি যেমন) কোনও কাজ শেষ হয়েছে কিনা তা দেখার জন্য অভ্যন্তরীণ লুপের মধ্যে একটি ডাটাবেস-অ্যাক্সেস রুটিন কল করা।
রেফারেন্স যুক্ত হয়েছে: উত্স কোড, মূল এবং পুনরায় ডিজাইন উভয়ই, www.ddj.com- তে 1993-র জন্য, 9311.zip ফাইলটিতে, ফাইলগুলি স্লাগ.অ্যাসাক এবং স্লাগ.জিপ পাওয়া যাবে।
সম্পাদনা 2011/11/26: এখন ভিজ্যুয়াল সি ++ তে সোর্স কোড সমেত একটি সোর্সফোরজ প্রকল্প রয়েছে এবং এটি কীভাবে সুর করা হয়েছিল তার বিবরণ-দ্বারা-ধাক্কা description এটি কেবল উপরে বর্ণিত দৃশ্যের প্রথম অর্ধের মধ্য দিয়ে যায় এবং এটি ঠিক একই ক্রমটি অনুসরণ করে না, তবে তবুও একটি গতিবেগের গতিবেগের 2-3 ক্রম পায়।