শেষ অবলম্বন [বন্ধ] এর পারফরম্যান্স অপটিমাইজেশন কৌশলগুলি


609

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

ধরা যাক:

  • কোডটি ইতিমধ্যে সঠিকভাবে কাজ করছে
  • নির্বাচিত অ্যালগরিদমগুলি সমস্যার পরিস্থিতিতে ইতিমধ্যে অনুকূল
  • কোডটি পরিমাপ করা হয়েছে এবং আপত্তিকর রুটিনগুলি পৃথক করা হয়েছে
  • অনুকূলকরণের সমস্ত প্রচেষ্টাও যাতে তারা আরও খারাপ না হয় তা নিশ্চিত করার জন্যও পরিমাপ করা হবে

আমি এখানে যা খুঁজছি তা হ'ল একটি সমালোচনামূলক অ্যালগরিদমের শেষ কয়েক শতাংশ পর্যন্ত শেষ করার কৌশলগুলি এবং কৌশলগুলি যখন তখন কিছুই করার থাকে না, যা কিছু নেয় না।

আদর্শভাবে, উত্তরগুলিকে অজ্ঞাব্যত্তিক তৈরি করার চেষ্টা করুন এবং যেখানে প্রযোজ্য সেখানে প্রস্তাবিত কৌশলগুলিতে কোনও নীচের দিক নির্দেশ করুন।

আমি আমার নিজস্ব প্রাথমিক পরামর্শগুলির সাথে একটি জবাব যুক্ত করব এবং স্ট্যাক ওভারফ্লো সম্প্রদায়টি যা ভাবতে পারে তার জন্য অপেক্ষা করব।

উত্তর:


427

ঠিক আছে, আপনি সমস্যার সংজ্ঞা দিচ্ছেন যেখানে মনে হয় উন্নতির খুব বেশি জায়গা নেই। এটি আমার অভিজ্ঞতায় মোটামুটি বিরল। আমি 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 ক্রম পায়।


3
আপনি উপরে বর্ণিত ধাপগুলির কিছু বিবরণ পড়তে চাই। স্বাদ জন্য অপ্টিমাইজেশান কিছু টুকরা অন্তর্ভুক্ত করা সম্ভব? (পোস্টটি খুব দীর্ঘ না করেই?)
jerryjvl

8
... আমি এমন একটি বইও লিখেছিলাম যা এখন মুদ্রণের বাইরে, সুতরাং এটি অ্যামাজনে একটি হাস্যকর মূল্যের জন্য যাচ্ছে - "বিল্ডিং বেটার অ্যাপ্লিকেশনস" আইএসবিএন 0442017405 Es মূলত একই উপাদানটি প্রথম অধ্যায়ে রয়েছে।
মাইক ডুনলাভে

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

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


188

পরামর্শ:

  • পুনরায় গণনার চেয়ে প্রাক-গণনা : যে কোনও লুপ বা পুনরাবৃত্তি কলগুলিতে তুলনামূলকভাবে সীমিত পরিসীমা রয়েছে এমন গণনা রয়েছে, এমন কোনও লুপ (অ্যারে বা অভিধান) তৈরি করার বিষয়টি বিবেচনা করুন যা বৈধ পরিসরে সমস্ত মানের জন্য সেই গণনার ফলাফল ধারণ করে ইনপুট। তারপরে পরিবর্তে অ্যালগরিদমের অভ্যন্তরে একটি সাধারণ অনুসন্ধান করুন।
    ডাউন-সাইডস : প্রাক-গণিত মানগুলির মধ্যে কয়েকটি যদি ব্যবহার করা হয় তবে এটি আরও খারাপ হতে পারে, এছাড়াও অনুসন্ধানটি উল্লেখযোগ্য স্মৃতি নিতে পারে।
  • লাইব্রেরি পদ্ধতি ব্যবহার করবেন না : বেশিরভাগ গ্রন্থাগারগুলিকে বিস্তৃত পরিসরের অধীনে সঠিকভাবে পরিচালনা করতে এবং পরামিতিগুলিতে নাল চেকগুলি সম্পাদন করা প্রয়োজন etc. আপনি যে সঠিক পরিস্থিতিতে এটি ব্যবহার করছেন তা প্রয়োগ হয় না।
    নিচের দিকের : অতিরিক্ত কোড লেখার অর্থ বাগের জন্য আরও পৃষ্ঠের ক্ষেত্রফল।
  • লাইব্রেরির পদ্ধতিগুলি ব্যবহার করুন : নিজের সাথে বিরোধিতা করার জন্য, ভাষা পাঠাগারগুলি এমন লোকেরা লিখেছেন যা আপনার বা আমার চেয়ে অনেক বেশি স্মার্ট; মতভেদ তারা এটিকে আরও ভাল এবং দ্রুত করেছে। আপনি বাস্তবে এটি দ্রুততর করতে না পারলে এটিকে নিজেই প্রয়োগ করবেন না (যেমন: সর্বদা পরিমাপ করুন!)
  • প্রতারণা : কিছু ক্ষেত্রে যদিও আপনার সমস্যার জন্য একটি সঠিক গণনা উপস্থিত থাকতে পারে তবে আপনার 'নির্ভুল' প্রয়োজন হতে পারে না, কখনও কখনও একটি অনুমানের পরিমাণ 'যথেষ্ট ভাল' হতে পারে এবং চুক্তিতে অনেক দ্রুত faster নিজেকে জিজ্ঞাসা করুন, উত্তরটি যদি 1% ছাড়িয়ে যায় তবে তা কি সত্যই গুরুত্বপূর্ণ? 5%? এমনকি 10%?
    নিম্ন দিক : ভাল ... উত্তর সঠিক হবে না।

32
প্রিকম্পিউটেশন সর্বদা সহায়তা করে না এবং এটি কখনও কখনও আঘাতও করতে পারে - যদি আপনার দেখার টেবিলটি খুব বড় হয় তবে এটি আপনার ক্যাশের কার্যকারিতাটি হারাতে পারে।
অ্যাডাম রোজেনফিল্ড

37
প্রতারণা প্রায়শই জয় হতে পারে। আমার একটি রঙ সংশোধন প্রক্রিয়া ছিল যে মূলটিতে একটি 3-ভেক্টর একটি 3x3 ম্যাট্রিক্সের সাথে ডটেড ছিল। সিপিইউতে হার্ডওয়্যারে একটি ম্যাট্রিক্স গুণ ছিল যা কিছু অন্যান্য ক্রস শর্তাবলী রেখেছিল এবং এটি করার অন্যান্য সমস্ত পদ্ধতির তুলনায় বাস্তব দ্রুত চলে গিয়েছিল, তবে কেবল 4x4 ম্যাট্রিকেস এবং 4-ভেক্টর ভাসমানকে সমর্থন করেছে। অতিরিক্ত খালি স্লট ঘোরার জন্য কোড পরিবর্তন করা এবং গণনাটিকে স্থির বিন্দু থেকে ভাসমান স্থানে রূপান্তর করা কিছুটা কম নির্ভুল তবে খুব দ্রুত ফলাফলের জন্য অনুমোদিত।
আরবার্টেইগ

6
প্রতারণাটি এমন একটি ম্যাট্রিক্স গুণমান ব্যবহার করেছিল যা কিছু অভ্যন্তরীণ পণ্য ফেলে রেখেছিল, একক সিপিইউ নির্দেশের জন্য মাইক্রোকোডে প্রয়োগ করা সম্ভব হয়েছিল যা পৃথক নির্দেশাবলীর সমতুল্য ক্রমগুলির চেয়েও দ্রুত সম্পন্ন হয়েছিল। এটি একটি প্রতারণা কারণ এটি "সঠিক" উত্তরটি পায় না, কেবল একটি উত্তর যা "যথেষ্ট সঠিক"।
RBerteig

6
@ আরবার্টিগ: কেবলমাত্র "যথেষ্ট সঠিক" অপটিমাইজেশনের একটি সুযোগ যা বেশিরভাগ লোক আমার অভিজ্ঞতায় মিস করে।
মার্টিন থম্পসন

5
আপনি সবসময় ধরে নিতে পারবেন না যে প্রত্যেকে আপনার চেয়ে বুদ্ধিমান। শেষে আমরা সবাই প্রফেসনাল। তবে আপনি ধরে নিতে পারেন যে আপনি যে নির্দিষ্ট লাইব্রেরিটি ব্যবহার করেন এটি বিদ্যমান এবং এটির মানের কারণে আপনার পরিবেশে পৌঁছেছে, সুতরাং এই লাইব্রেরির লেখাটি অবশ্যই খুব ভাল হতে হবে, আপনি কেবল এটির কারণেই করতে পারবেন না কারণ আপনি এতে বিশেষী নন are ক্ষেত্র, এবং আপনি এটিতে একই ধরণের সময় বিনিয়োগ করবেন না। আপনি কম স্মার্ট না বলে নয়। চলে আসো.
v.oddou

164

আপনি যখন আর পারফরম্যান্সটি উন্নত করতে পারবেন না - দেখুন পরিবর্তে আপনি অনুভূত পারফরম্যান্সটি উন্নত করতে পারেন কিনা see

আপনি আপনার fooCalc অ্যালগরিদম দ্রুত করতে সক্ষম নাও হতে পারেন, তবে প্রায়ই আপনার অ্যাপ্লিকেশনটিকে ব্যবহারকারীর কাছে আরও প্রতিক্রিয়াশীল করে তোলার উপায় রয়েছে।

কয়েকটি উদাহরণ:

  • ব্যবহারকারী কী অনুরোধ করবেন এবং এর আগে তার উপর কাজ শুরু করবেন তা অনুমান করা
  • শেষে আসতে একবারে পরিবর্তে, ফলাফলগুলি প্রদর্শিত হচ্ছে
  • সঠিক অগ্রগতি মিটার

এগুলি আপনার প্রোগ্রামটিকে দ্রুততর করে তুলবে না, তবে এটি আপনার গতির সাথে আপনার ব্যবহারকারীদের আরও সুখী করতে পারে।


27
শেষে গতিবেগের অগ্রগতি বারটি একেবারে নির্ভুল একটির চেয়ে দ্রুত গতিতে বোঝা যায়। "প্রগতি বারটি পুনর্বিবেচনা" (2007) -তে হ্যারিসন, অ্যামেন্টো, কুজনসভ এবং বেল একাধিক ব্যবহারকারীর বারের পরীক্ষা করে পাশাপাশি অপারেশনগুলি পুনর্বিন্যাসের কয়েকটি উপায় নিয়ে আলোচনা করেছেন যাতে অগ্রগতিটি দ্রুত হিসাবে অনুধাবন করা যায়।
এমিল বিক্রষ্টম

9
এছাড়াও, বেশিরভাগ অগ্রগতি বারগুলি নকল কারণ একক শতাংশে প্রবাহের বহুবিধ বিবিধ পদক্ষেপের পূর্বাভাস দেওয়া শক্ত বা কখনও কখনও অসম্ভব। 99% :-(
এমিল বিক্রষ্টম

138

আমি আমার জীবনের বেশিরভাগ অংশ ঠিক এই জায়গায় কাটিয়েছি। বিস্তৃত স্ট্রোকগুলি হল আপনার প্রোফাইলার চালানো এবং এটি রেকর্ড করা:

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

এবং আমি আরও একটি জিনিস করতে পছন্দ করি:

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

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

6
তা সত্ত্বেও, জেআইটি পরবর্তী আউটপুটটি পরীক্ষা করে দেখাতে পারে যে এমন কোনও নির্মাণ রয়েছে যা জেআইটি পর্যায়ের মাধ্যমে ভালভাবে অনুকূল করা যায় না ... তদন্ত কোনও ক্ষতি করতে পারে না, এমনকি যদি কোনও শেষ পরিণতি হয়ে যায়।
jerryjvl

5
আমি মনে করি নিজেকে সহ অনেক লোকই জিসিসি দ্বারা উত্পাদিত এই "ডাব্লুটিএফএফ সমাবেশে" আগ্রহী হবে। আপনার খুব আকর্ষণীয় কাজের মতো শোনায় :)
ব্লুরাজা - ড্যানি ফ্লুঘুফুট

1
Examples on the PowerPC ...<- এটি পাওয়ারপিসির কিছু বাস্তবায়ন। পাওয়ারপিসি একটি সিপিইউ নয়, একটি আইএসএ।
বিলি ওনিল

1
@ বিলিওনিল এমনকি আধুনিক x86 হার্ডওয়্যারেও, ইমুল পাইপলাইন স্টল করতে পারে; "ইন্টেল ®৪ এবং আইএ -32 আর্কিটেকচার অপ্টিমাইজেশন রেফারেন্স ম্যানুয়াল" দেখুন §13.3.2.3: "পূর্ণসংখ্যার গুণিত নির্দেশ কার্যকর করতে বেশ কয়েকটি চক্র লাগে They এগুলি পাইপলাইনযুক্ত হয় যে কোনও পূর্ণসংখ্যার বহুগুণ নির্দেশ এবং অন্য একটি দীর্ঘ-বিন্দু নির্দেশিকা এগিয়ে অগ্রগতি করতে পারে কার্যকরকরণের পর্যায়ে, তবে পূর্ণসংখ্যার বহুগুণ নির্দেশাবলী প্রোগ্রামের আদেশের প্রয়োজনীয়তার কারণে অন্যান্য একক-চক্র পূর্ণসংখ্যার নির্দেশাবলী জারি করা থেকে আটকাবে "" এজন্য সাধারণত শব্দ সংযুক্ত অ্যারে মাপ এবং ব্যবহার করা ভাল lea
ক্র্যাশওয়ার্কস

78

এটি আরও হার্ডওয়ার নিক্ষেপ!


30
আপনার কাছে এমন সফ্টওয়্যার রয়েছে যখন ক্ষেত্রটিতে ইতিমধ্যে হার্ডওয়্যারটি চালিত হবে বলে আশা করা যায় এমন সময়ে আরও হার্ডওয়ার হ'ল বিকল্প নয় option
ডগ টি।

76
কারও জন্য ভোক্তা সফ্টওয়্যার তৈরির খুব সহায়ক উত্তর নয়: গ্রাহক আপনাকে "একটি দ্রুত কম্পিউটার কিনুন" বলতে শুনতে চাইছেন না। বিশেষত যদি আপনি ভিডিও গেম কনসোলের মতো কিছু লক্ষ্য করার জন্য সফ্টওয়্যার লিখছেন।
ক্র্যাশওয়ার্কস

19
@ ক্র্যাশওয়ার্কস বা এই বিষয়টির জন্য একটি এমবেডড সিস্টেম। শেষ বৈশিষ্ট্যটি শেষ পর্যন্ত এবং বোর্ডগুলির প্রথম ব্যাচটি ইতিমধ্যে কাটা হয়েছে এমন মুহুর্তটি আবিষ্কার করার মুহূর্ত নয় যে আপনার প্রথম স্থানে একটি দ্রুত সিপিইউ ব্যবহার করা উচিত ছিল ...
আরবার্টেইগ

71
আমাকে একবার এমন একটি প্রোগ্রাম ডিবাগ করতে হয়েছিল যার বিশাল মেমরি ফুটো ছিল - এর ভিএম আকার প্রতি ঘন্টা প্রায় 1Mb দ্বারা বৃদ্ধি পেয়েছিল। একজন সহকর্মী কৌতুক করেছিলেন যে আমাকে যা করতে হবে তা হ'ল স্থির হারে স্মৃতি যুক্ত করা । :)
j_random_hacker

9
আরও হার্ডওয়্যার: আহ হ্যাঁ মাঝারি বিকাশকারীর লাইফলাইন। আমি জানি না কতবার শুনেছি "অন্য একটি মেশিন যুক্ত করুন এবং ক্ষমতা দ্বিগুণ করুন!"
অলফ ফোরশেল

58

আরও পরামর্শ:

  • আই / ও এড়িয়ে চলুন : গণনা সম্পাদনকারী যে কোনও কোডের তুলনায় যে কোনও আই / ও (ডিস্ক, নেটওয়ার্ক, পোর্ট ইত্যাদি) সর্বদা অনেক ধীর গতিতে চলেছে, সুতরাং আপনার যে আই / ও এর কঠোর প্রয়োজন হয় না তা থেকে মুক্তি পান।

  • I / O আপ-ফ্রন্টটি সরান : আপনার গণনা আপ-ফ্রন্টের জন্য প্রয়োজন হবে এমন সমস্ত ডেটা লোড করুন, যাতে আপনার কাছে পুনরাবৃত্তি না হয় I / O একটি সমালোচনামূলক অ্যালগরিদমের মূল অংশের মধ্যে অপেক্ষা করে (এবং সম্ভবত ফলাফল হিসাবে পুনরাবৃত্তি হতে পারে) ডিস্ক সন্ধান করে, যখন একটি হিটতে সমস্ত ডেটা লোড করা অন্বেষণ এড়াতে পারে)।

  • বিলম্ব I / O : হিসাব শেষ না হওয়া অবধি আপনার ফলাফলগুলি লিখে ফেলবেন না, একটি ডেটা স্ট্রাকচারে এগুলি সংরক্ষণ করুন এবং তারপরে কঠোর পরিশ্রম করার পরে শেষের দিকে একবারে তা ফেলে দিন।

  • থ্রেডেড আই / ও : তাদের পক্ষে যথেষ্ট সাহসী, লোডিংটিকে একটি সমান্তরাল থ্রেডে সরিয়ে দিয়ে আসল গণনার সাথে 'I / O আপ-ফ্রন্ট' বা 'বিলম্ব I / O' একত্রিত করুন, যাতে আপনি আরও ডেটা লোড করার সময় আপনি কাজ করতে পারেন আপনার ইতিমধ্যে থাকা ডেটাতে একটি গণনার উপর, অথবা আপনি পরবর্তী ব্যাচের ডেটা গণনা করার সময় আপনি একই সাথে শেষ ব্যাচ থেকে ফলাফলগুলি লিখতে পারেন।


3
নোট করুন যে "আইওকে একটি সমান্তরাল থ্রেডে নিয়ে যাওয়া" অনেকগুলি প্ল্যাটফর্মগুলিতে (যেমন উইন্ডোজ এনটি) অ্যাসিক্রোনাস আইও হিসাবে করা উচিত।
বিলি ওনিল

2
আই / ও প্রকৃতপক্ষে একটি সমালোচনামূলক বিষয়, কারণ এটি ধীর এবং ধীরে ধীরে বিশাল লেটেন্সি রয়েছে এবং আপনি এই পরামর্শটি দিয়ে দ্রুততর পেতে পারেন তবে এটি এখনও মূলত ত্রুটিযুক্ত: পয়েন্টগুলি হ'ল বিলম্বতা (যা লুকিয়ে থাকতে হবে) এবং সিস্কেল ওভারহেড ( যা I / O কলগুলির সংখ্যা হ্রাস করে হ্রাস করতে হবে )। সর্বোত্তম পরামর্শটি হ'ল: ইনপুটটির mmap()জন্য ব্যবহার করুন, উপযুক্ত madvise()কল করুন এবং aio_write()আউটপুটের বড় অংশ লেখার জন্য ব্যবহার করুন (= কয়েকটি এমআইবি)।
মাস্টার

1
এই শেষ বিকল্পটি জাভাতে প্রয়োগ করা মোটামুটি সহজ especially এটি লিখেছি এমন অ্যাপ্লিকেশনগুলির জন্য এটি বিশাল কর্মক্ষমতা বাড়িয়েছে। আরেকটি গুরুত্বপূর্ণ পয়েন্ট (I / O আপফ্রন্টের চেয়ে বেশি সরানো) এটিকে SEQUENTIAL এবং লার্জ-ব্লক I / O করা। ডিস্ক সন্ধানের সময় চেয়ে ছোট ছোট অনেকগুলি পঠন 1 বড় একের চেয়ে অনেক বেশি ব্যয়বহুল।
ববএমসিজি

এক পর্যায়ে আমি I / O এড়ানোর জন্য প্রতারণা করেছিলাম, সমস্ত ফাইলগুলি অস্থায়ীভাবে গণনার আগে একটি র‌্যাম ডিস্কে স্থানান্তরিত করে এবং সেগুলি পরে ফিরিয়ে নিয়েছি। এটি নোংরা, তবে এমন পরিস্থিতিতে কার্যকর হতে পারে যেখানে আপনি যুক্তিটি নিয়ন্ত্রণ করেন না যা I / O কলগুলি করে।
এমডি

48

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

বেশিরভাগ ডাটাবেসে কার্সার এড়িয়ে চলুন। পাশাপাশি লুপিং এড়িয়ে চলুন। বেশিরভাগ সময়, ডেটা অ্যাক্সেস সেট-ভিত্তিক হওয়া উচিত, রেকর্ড প্রক্রিয়াজাতকরণের মাধ্যমে রেকর্ড নয়। আপনি একবারে 1,000,000 রেকর্ড সন্নিবেশ করতে চাইলে এর মধ্যে একটি রেকর্ড সঞ্চিত প্রক্রিয়া পুনরায় ব্যবহার না করা অন্তর্ভুক্ত।

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

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

সূচক, সূচক, সূচক। আপনার ডাটাবেসের ক্ষেত্রে প্রযোজ্য হলে সেই পরিসংখ্যানগুলি আপডেট করুন।

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

সঠিক ডেটা ধরণের ব্যবহার করুন। কোনও স্ট্রিং ডেটাটাইপকে তারিখের ডেটাটাইপে রূপান্তর করার চেষ্টা করার চেয়ে একটি তারিখের ক্ষেত্রে তারিখ গণিত করা আরও দ্রুত, তারপরে গণনা করুন।

কোনও ধরণের লুপ কখনও ট্রিগারে রাখবেন না!

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

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

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

কারা কারা বাধা দিচ্ছে তা খুঁজে পেতে প্রোফাইলার আপনাকে সহায়তা করবে। কিছু ক্যোয়ারী যা একা দৌড়ানোর সময় দ্রুত কার্যকর করা হয় অন্যান্য ক্যোয়ারীর লকগুলির কারণে সত্যিই ধীর হয়ে যেতে পারে।


29

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

এগুলি আপনার পরিচালনা করতে হবে এমন প্রভাবগুলি। কখনও কখনও আপনার কোড মাইক্রো পরিচালনা করার মাধ্যমে, তবে কখনও কখনও সাবধানতার সাথে বিবেচনা এবং পুনঃব্যবহারের মাধ্যমে।

প্রচুর মন্তব্য ইতিমধ্যে ক্যাশে বন্ধুত্বপূর্ণ কোড উল্লেখ করেছে। এর কমপক্ষে দুটি স্বাদযুক্ত স্বাদ রয়েছে:

  • স্মৃতি আনতে বিলম্ব হওয়া এড়ান।
  • লোয়ার মেমোরি বাস প্রেসার (ব্যান্ডউইথ)।

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

দ্বিতীয় সমস্যাটি ডেটা পুনঃব্যবহারের উন্নতি করতে হবে। উপলভ্য ক্যাশে-তে উপস্থাপিত আপনার ডেটা সাবসেটে কাজ করতে আপনার অ্যালগরিদমগুলিকে পরিবর্তন করুন এবং ক্যাশে থাকা অবস্থায় সেই ডেটা যথাসম্ভব পুনরায় ব্যবহার করুন।

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


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

4
"জিসিসি থেকে এলএলভিএম এ স্যুইচ করা উচিত" :)
জিফ্রে

4
আপনি কি নিজের অ্যালগরিদমকে সমান্তরালে চালাতে পারবেন? - বিপরীতটিও প্রযোজ্য
জাস্টিন

4
সত্য যে, থ্রেডের পরিমাণ হ্রাস
করাও

পুনরায়: মাইক্রো-অপ্টিমাইজিং: আপনি যদি সংকলকের এসএম আউটপুটটি পরীক্ষা করেন তবে আপনি প্রায়শই উত্সটিকে আরও ভাল asm উত্পাদন করতে হ্যান্ড-হোল্ড করতে পারেন twe দেখুন কেন এই সি ++ কোড চেয়ে দ্রুত আমার হাতে লেখা Collatz অনুমান পরীক্ষার জন্য সমাবেশ? আধুনিক x86 এ সংকলককে সহায়তা বা প্রহার করার বিষয়ে আরও জানতে।
পিটার কর্ডেস

17

যদিও আমি মাইক ডুনলাভির উত্তর পছন্দ করি, বাস্তবে এটি সহায়ক উদাহরণ সহ একটি দুর্দান্ত উত্তর, আমি মনে করি এটি খুব সহজভাবে প্রকাশ করা যেতে পারে:

প্রথমে সর্বাধিক পরিমাণে কী লাগে তা খুঁজে বার করুন এবং কেন তা বুঝুন।

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

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

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

এইচপিএইচ, আসউডমভ


16

আপনার সম্ভবত "গুগল দৃষ্টিভঙ্গি" বিবেচনা করা উচিত, অর্থাত্ আপনার অ্যাপ্লিকেশনটি কীভাবে বহুমাত্রিকভাবে সমান্তরাল এবং সমবর্তী হয়ে উঠতে পারে তা নির্ধারণ করা উচিত, যার অর্থ কোনও সময় বিভিন্ন মেশিন এবং নেটওয়ার্কগুলিতে আপনার অ্যাপ্লিকেশন বিতরণ করার বিষয়টিও বোঝা যাবে, যাতে এটি আদর্শভাবে প্রায় রৈখিকভাবে স্কেল করতে পারে আপনি যে হার্ডওয়্যারটি ছুড়েছিলেন তা দিয়ে।

অন্যদিকে, গুগল লোকেরা তাদের ব্যবহার করা প্রকল্প, সরঞ্জাম এবং অবকাঠামোগত কয়েকটি সমস্যা সমাধানে প্রচুর জনশক্তি এবং সংস্থান নিক্ষেপ করার জন্যও পরিচিত, যেমন উদাহরণস্বরূপ ইঞ্জিনিয়ারদের একটি নিবেদিত দল রেখে জিসিটির জন্য পুরো প্রোগ্রাম অপ্টিমাইজেশন গুগল-টিপিক্যাল ব্যবহারের ক্ষেত্রে এটির জন্য তৈরি করার জন্য জিসিসি ইন্টার্নাল হ্যাকিং।

একইভাবে, কোনও অ্যাপ্লিকেশন প্রোফাইলিংয়ের অর্থ সিস্টেমের দৃষ্টিকোণ থেকে অপ্রয়োজনীয়তা এবং অপ্টিমাইজেশন সম্ভাবনা সনাক্তকরণের জন্য কেবল প্রোগ্রাম কোডটি নয়, তার চারপাশের সমস্ত সিস্টেম এবং অবকাঠামো (থিং নেটওয়ার্ক, স্যুইচস, সার্ভার, RAID অ্যারেগুলি) বোঝানো উচিত।


15
  • ইনলাইন রুটিনগুলি (কল / রিটার্ন এবং প্যারামিটার পুশিং দূর করে)
  • সারণী চেহারা আপগুলি (যদি তারা দ্রুত হয়) দিয়ে পরীক্ষা / স্যুইচগুলি বাদ দেওয়ার চেষ্টা করুন
  • লুপগুলি (ডাফের ডিভাইস) এ নথিভুক্ত করুন যেখানে তারা কেবল সিপিইউ ক্যাশে ফিট করে
  • মেমরি অ্যাক্সেসকে স্থানীয়করণ করুন যাতে আপনার ক্যাশেটি ফুঁকতে না পারে
  • অপ্টিমাইজার ইতিমধ্যে এটি না করে যদি সম্পর্কিত গণনা স্থানীয়করণ
  • অপ্টিমাইজার ইতিমধ্যে এটি না করে থাকলে লুপের আক্রমণকারীদের বাদ দিন

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

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

12

ভাগ এবং বিজয়

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


9
শেষ বাক্যটি পড়ার সময় আমি শুনেছিলাম ফ্লাইভওয়াটার "স্ম্যাক" শব্দটির জন্য +1।
ব্রায়ান বোয়েচার

11

প্রথমত, বেশ কয়েকটি পূর্বের উত্তরে যেমন উল্লেখ করা হয়েছে, আপনার কর্মক্ষমতা কী কামড়ায় তা শিখুন - এটি মেমরি বা প্রসেসর বা নেটওয়ার্ক বা ডাটাবেস বা অন্য কিছু। উপর নির্ভর করে ...

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

  • ... যদি এটি প্রসেসর হয় - সমাবেশ ভাষাতে স্যুইচ করুন। স্টাডি প্রসেসরের স্পেসিফিকেশন - কী টিক্স , ভিএলআইডাব্লু, সিমডি লাগে । ফাংশন কলগুলি সম্ভবত প্রতিস্থাপনযোগ্য টিক-ইটার। লুপ রূপান্তর - পাইপলাইন, আনরোল শিখুন। গুণগুলি এবং বিভাগগুলি বিট শিফটগুলির সাথে প্রতিস্থাপনযোগ্য / আন্তবিবাহিত হতে পারে (ছোট সংখ্যার সাথে গুণগুলি সংযোজনগুলির সাথে প্রতিস্থাপনযোগ্য হতে পারে)। সংক্ষিপ্ত ডেটা সহ কৌশলগুলি ব্যবহার করে দেখুন - আপনি ভাগ্যবান হলে 64৪ বিটের একটি নির্দেশ যদি ৩২ বা দুটিতে 16 বা 8 এর উপর 8 বা বিট আকারে যায় তবে প্রতিস্থাপনযোগ্য হয়ে উঠতে পারে। আরও দীর্ঘ চেষ্টা করুনডেটা - যেমন আপনার ফ্লোট গণনাগুলি নির্দিষ্ট প্রসেসরের দ্বিগুণ চেয়ে ধীর হয়ে যেতে পারে। আপনার যদি ত্রিকোণমিতিক জিনিস থাকে তবে এটি প্রাক-গণনাযুক্ত টেবিলগুলির সাথে লড়াই করুন; এও মনে রাখবেন যে নির্ভুলতার ক্ষতি অনুমোদিত সীমাতে থাকলে স্বল্প মূল্যের সাইনটি সেই মানটির সাথে প্রতিস্থাপন করা যেতে পারে।

  • ... এটি যদি নেটওয়ার্ক হয় - আপনি যে তথ্যটি দিয়ে গেছেন তা সংকোচনের কথা ভাবেন। বাইনারি সহ এক্সএমএল স্থানান্তর প্রতিস্থাপন করুন। অধ্যয়ন প্রোটোকল। আপনি যদি কোনওভাবে ডেটা হ্যান্ডেল করতে পারেন তবে টিসিপির পরিবর্তে ইউডিপি চেষ্টা করুন।

  • ... যদি এটি ডাটাবেস, ভাল, যে কোনও ডাটাবেস ফোরামে যান এবং পরামর্শ জিজ্ঞাসা করুন। মেমরির ডেটা-গ্রিড, কোয়েরি প্ল্যান ইত্যাদি অনুকূলকরণ ইত্যাদি etc.

এইচটিএইচ :)


9

ক্যাশিং! প্রায় কোনও দ্রুততর করার একটি সস্তা উপায় (প্রোগ্রামার প্রচেষ্টায়) হ'ল আপনার প্রোগ্রামের যে কোনও ডেটা মুভমেন্ট এরিয়ায় ক্যাচিং অ্যাবস্ট্রাকশন স্তর যুক্ত করা। তা আই / ও বা কেবল পাসিং / অবজেক্ট বা স্ট্রাকচারের তৈরি। প্রায়শই কারখানার ক্লাস এবং পাঠক / লেখকদের ক্যাশে যুক্ত করা সহজ।

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


8

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

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

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


8

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

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

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

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

  • সমান্তরাল : ক্রমান্বয়ে লেনদেনগুলি সন্ধান করুন যা তাত্ক্ষণিকভাবে কঠোরভাবে ধারাবাহিকভাবে জারি করা দরকার হয় না এবং এগুলি সমান্তরালে জারি করার জন্য সিস্টেমটিকে পুনরায় কাজ করুন। আমি এমন একটি ক্ষেত্রে মোকাবিলা করেছি যেখানে শেষ-থেকে-শেষের অনুরোধটির মধ্যে অন্তর্ভুক্ত নেটওয়ার্কের বিলম্ব ছিল ~ 2s, যা কোনও একক লেনদেনের জন্য সমস্যা ছিল না, তবে যখন ক্লায়েন্ট অ্যাপ্লিকেশনটির নিয়ন্ত্রণ পুনরায় নিয়ন্ত্রণ করার আগে 6 সিক্যুয়াল 2s রাউন্ড ট্রিপগুলি প্রয়োজন ছিল , এটি হতাশার বিশাল উত্সে পরিণত হয়েছিল। এই লেনদেনগুলি প্রকৃতপক্ষে স্বতন্ত্র ছিল তা আবিষ্কার করে এগুলি সমান্তরালভাবে সম্পাদন করার অনুমতি দেয়, যার ফলে শেষ-ব্যবহারকারীর বিলম্বটি একক রাউন্ড ভ্রমণের ব্যয়ের খুব কাছাকাছি হয়ে যায়।

  • একত্রিত করুন : যেখানে ক্রমানুসারে অনুরোধগুলি যথাযথভাবে কার্যকর করা উচিত , সেগুলিকে আরও একক বিস্তৃত অনুরোধের সাথে সংযুক্ত করার সুযোগগুলি সন্ধান করুন। সাধারণ উদাহরণগুলির মধ্যে নতুন সত্ত্বা তৈরি করা অন্তর্ভুক্ত থাকে এবং তারপরে সেই সত্তাগুলি অন্যান্য বিদ্যমান সত্তার সাথে সম্পর্কিত করার অনুরোধ জানানো হয়।

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

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

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


7

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


7

শেষ কয়েক% খুব সিপিইউ এবং অ্যাপ্লিকেশন নির্ভর জিনিস ....

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

তালিকাটি এগিয়ে চলেছে .... তবে এই ধরণের জিনিস আসলেই শেষ অবলম্বন ...

এক্স 86 জন্য সংগ্রহ করতে, এবং চালানোর Valgrind- র সঠিক কর্মক্ষমতা প্রোফাইলিং কোড বিরুদ্ধে / Cachegrind। বা টেক্সাস ইনস্ট্রুমেন্টসের সিসিএসটুডিওর একটি মিষ্টি প্রোফাইলার রয়েছে। তারপরে আপনি সত্যই জানবেন কোথায় মনোযোগ দিতে হবে ...


7

Did you know that a CAT6 cable is capable of 10x better shielding off extrenal inteferences than a default Cat5e UTP cable?

কোনও অ-অফলাইন প্রকল্পের জন্য, সেরা সফ্টওয়্যার এবং সেরা হার্ডওয়্যার থাকার সময়, যদি আপনার আউটপুটটি দুর্বল হয়, তবে সেই পাতলা রেখাটি মিলি সেকেন্ডে হলেও ডেটা চেপে আপনাকে বিলম্ব করতে চলেছে ... তবে আপনি যদি শেষ ড্রপগুলি নিয়ে কথা বলছেন , যে কোনও প্যাকেজ পাঠানো বা প্রাপ্ত হওয়ার জন্য এটি 24-27 টাকার কিছুটা ড্রপ।


7

পূর্ববর্তী উত্তরগুলির মতো গভীরতা বা জটিল হিসাবে প্রায় নয়, তবে এখানে রয়েছে: (এগুলি আরও শুরুর / মধ্যবর্তী স্তর)

  • সুস্পষ্ট: শুকনো
  • পিছনে লুপগুলি চালান যাতে আপনি সর্বদা একটি চলকের পরিবর্তে 0 এর সাথে তুলনা করেন
  • আপনি যখনই পারেন বিটওয়াইজ অপারেটরগুলি ব্যবহার করুন
  • পুনরাবৃত্তি কোডটি মডিউল / ফাংশনে বিভক্ত করুন break
  • ক্যাশে অবজেক্টস
  • স্থানীয় ভেরিয়েবলের সামান্য পারফরম্যান্স সুবিধা রয়েছে
  • যতটা সম্ভব স্ট্রিং ম্যানিপুলেশন সীমাবদ্ধ করুন

4
পিছনের দিকে লুপিং সম্পর্কে: হ্যাঁ, লুপ শেষের জন্য তুলনাটি আরও দ্রুত হবে। সাধারণত আপনি মেমরিতে সূচকে পরিবর্তনশীলটি ব্যবহার করেন এবং এটির বিপরীতে অ্যাক্সেস করা ঘন ঘন ক্যাশে মিসের কারণে (কোনও প্রিফেচ নেই) ফলপ্রসূ হতে পারে।
আন্দ্রেয়াস রিফ

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

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

5

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

উন্নত ক্যাশে লোকাল, লুপ আন্রোলিং, দীর্ঘতর নির্ভরতা শৃঙ্খলাগুলি দূর করার চেষ্টা করুন, আরও ভাল নির্দেশিকা স্তরের সমান্তরালতা পেতে। যখন সম্ভব হয় তখন শাখাগুলির উপরে শর্তযুক্ত পদক্ষেপগুলি পছন্দ করুন। সম্ভব হলে সিমডি নির্দেশাবলী ব্যবহার করুন।

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

ঠিক আছে, এবং "এসও-তে কোডটি দেখান এবং সেই নির্দিষ্ট অংশের কোডটির জন্য অপ্টিমাইজেশন পরামর্শের জন্য জিজ্ঞাসা করুন"।


5

যদি ভাল হার্ডওয়্যার একটি বিকল্প হয় তবে অবশ্যই এটির জন্য যান। অন্যভাবে

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

আমি আপনার প্রথম সমান্তরালে যোগ করব : আপনার সংকলক বিকল্পগুলিতে সমস্ত ডিবাগিং তথ্য বন্ধ করতে ভুলবেন না
বার্নি

5

গুগল উপায় হ'ল একটি বিকল্প "এটি ক্যাশে করুন .. যখনই সম্ভব ডিস্কটি স্পর্শ করবেন না"


5

আমি ব্যবহার করি এমন কিছু দ্রুত এবং ময়লা অপ্টিমাইজেশান কৌশল রয়েছে। আমি এটিকে একটি 'প্রথম পাস' অপটিমাইজেশন হিসাবে বিবেচনা করি।

সময়টি কোথায় ব্যয় করা হয়েছে তা শিখুন ঠিক কী সময় নিচ্ছে তা সন্ধান করুন। এটি কি আইও ফাইল করবেন? এটা কি সিপিইউ সময়? এটা কি নেটওয়ার্ক? এটি কি ডাটাবেস? যদি বাধা না হয় তবে আইও-র জন্য অনুকূলতা অবলম্বন করা।

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

ইনডেক্সে ঘন ঘন জানতে চাওয়া ডাটাবেসের মাঠে ইনডেক্স তৈরি করুন। আপনি প্রায় সর্বদা গতির জন্য স্থান বাণিজ্য করতে পারেন।

লুপগুলি অপ্টিমাইজ করার জন্য ভিতরে থাকা এড়িয়ে চলুন , আমি কোনও লুকআপ করা এড়াতে চাই। লুপের বাইরে অফসেট এবং / অথবা সূচকটি সন্ধান করুন এবং ভিতরে ডেটা পুনরায় ব্যবহার করুন।

মিনিমাইজ আইও হ্রাস করুন এমনভাবে ডিজাইন করার চেষ্টা যা আপনাকে বিশেষ করে নেটওয়র্কযুক্ত সংযোগের মাধ্যমে পড়তে বা লিখতে হবে এমন সংখ্যা হ্রাস করে

বিমূর্ততা হ্রাস করুন করুন কোডটি যে বিমূর্তকরণের কাজ করতে হবে তত বেশি ধীর। সমালোচনামূলক লুপের ভিতরে, বিমূর্ততাগুলি হ্রাস করুন (উদাহরণস্বরূপ নিম্ন-স্তরের পদ্ধতিগুলি যা অতিরিক্ত কোড এড়ায় তা প্রকাশ করুন)

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

প্রাক-প্রক্রিয়া আপনি গতির জন্য সাধারণত স্থান বাণিজ্য করতে পারেন। যদি গণনা বা অন্যান্য তীব্র ক্রিয়াকলাপ থাকে তবে দেখুন যে আপনি সমালোচনামূলক লুপে আসার আগে কিছু তথ্য পূর্ববর্তী করতে পারেন কিনা।


5

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


5

এই উত্তরটি যুক্ত করা যেহেতু আমি এটি অন্য সকলের মধ্যে অন্তর্ভুক্ত দেখিনি।

প্রকার এবং সাইন এর মধ্যে অন্তর্নিহিত রূপান্তর হ্রাস করুন:

এটি কমপক্ষে সি / সি ++ এর ক্ষেত্রে প্রযোজ্য, এমনকি যদি আপনি ইতিমধ্যে ভাবেন রূপান্তর মুক্ত - কখনও কখনও ফাংশনগুলির চারপাশে সংকলক সতর্কতা যুক্ত করার পরীক্ষা করা ভাল, বিশেষত লুপগুলির মধ্যে রূপান্তরগুলির জন্য নজর রাখা।

জিসিসি স্পেসিফিক: আপনি আপনার কোডের চারপাশে কিছু ভার্বোজ প্রগমা যোগ করে এটি পরীক্ষা করতে পারেন,

#ifdef __GNUC__
#  pragma GCC diagnostic push
#  pragma GCC diagnostic error "-Wsign-conversion"
#  pragma GCC diagnostic error "-Wdouble-promotion"
#  pragma GCC diagnostic error "-Wsign-compare"
#  pragma GCC diagnostic error "-Wconversion"
#endif

/* your code */

#ifdef __GNUC__
#  pragma GCC diagnostic pop
#endif

আমি এমন কেসগুলি দেখেছি যেখানে আপনি এই জাতীয় সতর্কতার দ্বারা উত্থাপিত রূপান্তরগুলি হ্রাস করে কয়েক শতাংশ গতি অর্জন করতে পারেন।

কিছু ক্ষেত্রে আমার কড়া সতর্কবার্তা সহ একটি শিরোনাম রয়েছে যা আমি দুর্ঘটনাজনিত রূপান্তরগুলি রোধ করতে অন্তর্ভুক্ত রাখি, তবে এটি একটি বাণিজ্য বন্ধ কারণ আপনি ইচ্ছাকৃত রূপান্তরগুলিকে শান্ত করতে প্রচুর কাস্ট যুক্ত করতে পারেন যা কেবল কোডকে ন্যূনতম জন্য আরও বিশৃঙ্খল করে তুলতে পারে may লাভ।


এই কারণেই আমি ওক্যামলটিতে এটি পছন্দ করি, সংখ্যার প্রকারের মধ্যে castালাই অবশ্যই এক্সপ্লিকেট হওয়া উচিত।
গাইস

@ গাইউস ফেয়ার পয়েন্ট - তবে অনেক ক্ষেত্রে ভাষাগুলি পরিবর্তন করা বাস্তবের পছন্দ নয়। যেহেতু সি / সি ++ বিস্তৃতভাবে এর সংকলক নির্দিষ্ট করা সত্ত্বেও আরও কঠোর করে তুলতে সক্ষম হবার জন্য এটি দরকারী উপকারী।
ধারণাগুলি 42

4

কখনও কখনও আপনার ডেটা বিন্যাস পরিবর্তন সাহায্য করতে পারে। সি-তে আপনি অ্যারে বা কাঠামো থেকে অ্যারেগুলির কাঠামোতে স্যুইচ করতে পারেন, বা তদ্বিপরীত।


4

ওএস এবং কাঠামোটি টুইঙ্ক করুন।

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

ফেসবুক, উদাহরণস্বরূপ, লিনাক্সে কার্নেল স্তরের কিছু জিনিস বদলেছে, মেমক্যাচ কীভাবে কাজ করে তা পরিবর্তন করেছে (উদাহরণস্বরূপ তারা একটি মেমক্যাড প্রক্সি লিখেছিল, এবং tcp এর পরিবর্তে ইউডিপি ব্যবহার করেছিল )।

এর আরেকটি উদাহরণ উইন্ডো ২০০৮ 8 উইন 2 কে 8 এর একটি সংস্করণ রয়েছে আপনি এক্স অ্যাপ্লিকেশন চালানোর জন্য প্রয়োজনীয় বেসিক ওএস ইনস্টল করতে পারেন (যেমন ওয়েব-অ্যাপস, সার্ভার অ্যাপস)। এটি চলমান প্রক্রিয়াগুলিতে ওএসের ওভারহেডের অনেকাংশ হ্রাস করে এবং আপনাকে আরও ভাল পারফরম্যান্স দেয়।

অবশ্যই, আপনাকে প্রথম ধাপ হিসাবে সর্বদা আরও হার্ডওয়ারে ফেলে দেওয়া উচিত ...


2
অন্যান্য সমস্ত পদ্ধতির ব্যর্থ হওয়ার পরে, বা যদি কোনও নির্দিষ্ট ওএস বা ফ্রেমওয়ার্ক বৈশিষ্ট্য উল্লেখযোগ্যভাবে হ্রাসপ্রাপ্ত কার্যকারিতার জন্য দায়ী হয়ে থাকে তবে এটি বৈধ পন্থা হতে পারে তবে এটিকে টানতে প্রয়োজনীয় দক্ষতা এবং নিয়ন্ত্রণের স্তরটি প্রতিটি প্রকল্পের জন্য উপলব্ধ নাও হতে পারে।
অ্যান্ড্রু নীলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.