অকাল অপটিমাইজেশন কি আসলেই সমস্ত মন্দের মূল?


215

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


22
আমি মনে করি আপনার অকাল অপটিমাইজেশন এবং অপ্রয়োজনীয় অপ্টিমাইজেশনের মধ্যে পার্থক্য করতে হবে। আমার কাছে অকাল পরামর্শ দেয় 'জীবনচক্রের খুব প্রথম দিকে' অবিরাম প্রস্তাব দেয় 'উল্লেখযোগ্য মান যোগ করে না'। আইএমও, দেরীতে অপ্টিমাইজেশনের প্রয়োজনীয়তা মূ .় নকশাকে বোঝায়।

109
হ্যাঁ, তবে মন্দটি একটি বহুপদী এবং এর অনেক শিকড় রয়েছে, এর মধ্যে কিছু জটিল।
ড্যান_ওয়াটারওয়ার্থ

7
আপনার বিবেচনা করা উচিত, যে নথ এই 1974 সালে লিখেছিলেন। সত্তরের দশকে স্লো প্রোগ্রামগুলি লেখা এতটা সহজ ছিল না যেমনটি আজকাল। তিনি পাস্কালকে মাথায় রেখে লিখেছেন জাভা বা পিএইচপি দিয়ে নয়।
সিলিং

4
না। সমস্ত অশুভের মূল লোভ।
তুলিনাস কর্ডোভা

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

উত্তর:


322

সম্পূর্ণ উক্তিটি মনে রাখা গুরুত্বপূর্ণ:

আমাদের ছোট কার্যকারিতা সম্পর্কে ভুলে যাওয়া উচিত, সময়ের প্রায় 97% বলুন: অকাল অনুকূলতা হ'ল সমস্ত মন্দের মূল। তবুও আমাদের সেই সমালোচনামূলক 3% তে আমাদের সুযোগগুলি অতিক্রম করা উচিত নয়।

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

"অকাল অপটিমাইজেশন" এর সাথে সবচেয়ে বড় সমস্যা হ'ল এটি অপ্রত্যাশিত বাগগুলি প্রবর্তন করতে পারে এবং একটি বিশাল সময় অপচয়কারী হতে পারে।


7
ডোনাল্ড নুথের লোক হওয়ার কারণে, যদি তার কাছে এটির ব্যাক আপ করার কোনও প্রমাণ থাকে তবে আমি পরাভূত হব না। বিটিডাব্লু, এসসিআর: স্টেট স্ট্রাকচার্ড প্রোগ্রামিং উইথ টু স্টেটমেন্টস, এসিএম জার্নাল কম্পিউটিং সার্ভেস, খণ্ড 6, নং ৪, ডিসেম্বর, ১৯4৪. পৃষ্ঠা ২6868 citeseerx.ist.psu.edu/viewdoc/…
mctylr

28
... একজন ভাল প্রোগ্রামারকে এ জাতীয় যুক্তি দিয়ে আত্মতৃপ্তিতে জাগানো হবে না, সমালোচনামূলক কোডটি মনোযোগ সহকারে দেখার জন্য তিনি বুদ্ধিমানের কাজ করবেন; তবে কেবলমাত্র সেই কোডটি সনাক্ত হওয়ার পরে (
পুরো

21
আমার কাছে আজ একটি 20 কে রেপ ব্যবহারকারী ছিল আমাকে বলুন যে এর HashSetপরিবর্তে ব্যবহার Listকরা অকালীন অপটিমাইজেশন ছিল। প্রশ্নে ব্যবহারের ক্ষেত্রে একটি স্ট্যাটিক্যালি প্রাথমিক সংগ্রহ ছিল যা একমাত্র উদ্দেশ্য ছিল সন্ধানের টেবিল হিসাবে পরিবেশন করা। আমি মনে করি না যে আমি বলার ভুল ছিলাম যে অকাল অপ্টিমাইজেশনের বিপরীতে কাজের জন্য সঠিক সরঞ্জামটি বেছে নেওয়ার মধ্যে একটি পার্থক্য রয়েছে। আমি মনে করি আপনার পোস্টটি এই দর্শনের সত্যতা নিশ্চিত করেছে: There are obvious optimizations...anything that isn't trivially clear optimization should be avoided until it can be measured.একটি হ্যাশসেটের অপ্টিমাইজেশন পুরোপুরি পরিমাপ করা হয়েছে এবং নথিভুক্ত করা হয়েছে।
ক্রাশ করুন

9
@ ক্রাশ: হ্যাঁ: এর Setচেয়েও শব্দার্থগতভাবে সঠিক এবং তথ্যবহুল List, সুতরাং এটির মধ্যে অপ্টিমাইজেশনের দিক থেকে আরও কিছু রয়েছে।
এরিক অলিক

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

111

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

গুরুত্বের ক্রমে কিছু ভাল প্রাথমিক অপ্টিমাইজেশন কী:

  • আর্কিটেকচারাল অপ্টিমাইজেশন (প্রয়োগ কাঠামো, এটি সংশ্লেষিত এবং স্তরযুক্ত করার পদ্ধতি)
  • ডেটা ফ্লো অপ্টিমাইজেশন (অ্যাপ্লিকেশনের অভ্যন্তরে এবং বাইরে)

কিছু মধ্য বিকাশ চক্র অপ্টিমাইজেশন:

  • ডেটা স্ট্রাকচার, নতুন ডেটা স্ট্রাকচারের পরিচয় করিয়ে দিন যার প্রয়োজনে আরও ভাল পারফরম্যান্স রয়েছে বা ওভারহেড কম রয়েছে lower
  • অ্যালগরিদম (কুইকোর্ট 3 এবং হিপসোর্ট ;-) এর মধ্যে সিদ্ধান্ত নেওয়া এখনই ভাল সময়;)

কিছু শেষ চক্র অপ্টিমাইজেশন

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

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

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


"অপ্টিমাইজেশন: আপনার সবচেয়ে খারাপ শত্রু", জোসেফ এম নিউকামার দ্বারা লিখেছেন: flounder.com/optimization.htm
রন রুবেল

53

প্রথম পরিমাপ ছাড়া অপ্টিমাইজেশন প্রায় সবসময় অকাল।

আমি বিশ্বাস করি যে এটি ক্ষেত্রে সত্য এবং সাধারণ ক্ষেত্রেও এটি সত্য।


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

এটি নথিভুক্ত না হলে
নওফাল

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

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

42

অপ্টিমাইজেশান "দুষ্ট" কারণ যদি তা ঘটে:

  • কম পরিষ্কার কোড
  • উল্লেখযোগ্যভাবে আরও কোড
  • কম সুরক্ষিত কোড
  • প্রোগ্রামার সময় নষ্ট

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


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

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

8
কোড থ্রেডকে নিরাপদ করা অপ্টিমাইজেশন নয়।
mattnz

38

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

এখানে একটি বৃহত উদ্ধৃতি (পিডিএফের 8 পৃষ্ঠায়, মূল 268 পৃষ্ঠা থেকে):

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

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

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

পূর্ববর্তী পৃষ্ঠা থেকে আরেকটি ভাল বিট:

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


20

আমি প্রায়শই এই উদ্ধৃতিটি স্পষ্টত খারাপ কোড বা কোডকে ন্যায়সঙ্গত করতে ব্যবহার করতে দেখেছি যেহেতু এর কার্য সম্পাদন পরিমাপ করা হয়নি, কোডের আকার বাড়াতে বা পাঠযোগ্যতার সাথে আপোষ না করে সম্ভবত খুব সহজেই তৈরি করা যেতে পারে।

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

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

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

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

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

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

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

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

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


2
আমেন। অকাল অপটিমাইজেশন এই দিনগুলিতে খুব উদারপন্থী প্রায় ছুঁড়ে ফেলেছে যারা এই কাজের জন্য ভুল সরঞ্জামটি ব্যবহার করে ন্যায়সঙ্গত করার চেষ্টা করে by আপনি যদি কাজের আগে সঠিক সরঞ্জামটি সময়ের আগে জানেন তবে এটি ব্যবহার না করার জন্য কোনও অজুহাত নেই।
ক্রাশ করুন

13

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

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

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


এটি অবশ্যই সঠিক। আমি অনুমান করি যে অকালীন অপ্টিমাইজেশন হ'ল যখন কোডটি আরও জটিল / জটিলভাবে অস্পষ্ট সুবিধার জন্য বোঝার জন্য তৈরি করা হয়, কেবলমাত্র স্থানীয় প্রভাব রয়েছে (ডিজাইনের বিশ্বব্যাপী প্রভাব রয়েছে)।
পল ডি ভ্রিজে

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

3
শুরুতে নকশাটি অপ্টিমাইজ করুন, শেষে কোডটি অপ্টিমাইজ করুন।
বিসিএস

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

1
"ডিজাইনের পর্যায়ে অনুকূল পারফরম্যান্সের জন্য পরিকল্পনা একটি দুর্বল ডিজাইনের দেরি অপ্টিমাইজেশানের চেয়ে অনেক বেশি উন্নত" এবং "দেরীতে অপ্টিমাইজেশান একটি উচ্চ মূল্যে অপেক্ষাকৃত পুরষ্কার সরবরাহ করে" খুব ভালভাবে বলা যায়! সম্ভবত উত্পাদিত সমস্ত সিস্টেমের 97% এর ক্ষেত্রে সত্য নয়, তবে এটি অনেকের - বিচ্ছিন্নভাবে অনেকগুলি - সিস্টেমগুলির জন্য।
অলিফ ফারশেল

10

আসলে আমি শিখেছি যে অকাল-অ-অপটিমাইজেশন হ'ল প্রায়শই সমস্ত মন্দের মূল।

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

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

Bochs তাকান। এটা নরকের মতো ধীর। এটি কি দ্রুততর হবে? হতে পারে, তবে কেবল কয়েক শতাংশের মধ্যে। এটি কখনই ভিএমওয়্যার বা ভিবিক্স বা কিউইএমইউ-র মতো ভার্চুয়ালাইজেশন সফ্টওয়্যারটির সাথে তুলনীয় পারফরম্যান্স পাবে না। কারণ এটি ডিজাইন দ্বারা ধীর!

যদি কোনও সফ্টওয়্যারটির সমস্যাটি এটি ধীর হয় তবে এটি খুব ধীর এবং এটি কেবল একটি জনতার দ্বারা পারফরম্যান্সের উন্নতি করেই ঠিক করা যায়। + 10% কেবল ধীর সফ্টওয়্যারটি দ্রুত তৈরি করে না। এবং আপনি সাধারণত পরে অপ্টিমাইজেশন দ্বারা 10% এর বেশি পাবেন না।

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

আমি জানি যে সত্যিই আপনার নির্দিষ্ট ক্ষেত্রে ফিট করে না, তবে এটি সাধারণ প্রশ্নের উত্তর দেয় "অকালীন অপটিমাইজেশন কি আসলেই সমস্ত মন্দের মূল?" - একটি পরিষ্কার নম্বর সহ।

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

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

বোকা অপ্টিমাইজেশান "অকাল" অপ্টিমাইজেশনের চেয়ে আরও খারাপ, তবুও উভয়ই অকাল-অপটিমাইজেশনের চেয়ে আরও ভাল।


6

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

সুতরাং মূলত, হ্যাঁ, এটি অকালীন অপটিমাইজেশনের মতো মনে হয়, তবে এটি বাগগুলি পরিচয় না করা ছাড়া আমি অবশ্যই তা ফিরিয়ে আনব না - সর্বোপরি, এটি এখনই অনুকূলিত হয়েছে (!)


আপনি "আরও বৈশিষ্ট্য লেখার" পরিবর্তে "আরও পরীক্ষা লিখতে" বলতে চান, তাই না? :)
গ্রেগ হিউগিল

1
আরও বৈশিষ্ট্য আরও পরীক্ষার জন্য জড়িত :)
workmad3

হ্যাঁ, হ্যাঁ! ঠিক এটাই আমি বোঝাতে
চাইছিলাম

2
কোডটি আরও জটিলতার পরিচয় দেয় এবং সম্ভবত সর্বজনীনভাবে ব্যবহৃত হবে না। এটিকে ব্যাক করা (এবং অনুরূপ জিনিসগুলি) কোড পরিষ্কার রাখে।
পল ডি ভ্রিজে

3

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

তিনি এর বিরুদ্ধে পরামর্শ দিয়েছেন।

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


2
আমি মনে করি "সোনার-ধাতুপট্টাবৃত" অপটিমাইজেশনের চেয়ে আলাদা। অপ্টিমাইজেশনগুলি সাধারণত সর্বাধিক পারফরম্যান্স পাওয়ার চেষ্টা করা হয় যখন "সোনার-ধাতুপট্টাবৃত" পণ্যটির পক্ষে গুরুত্বপূর্ণ নয় এমন "বেলস এবং হুইসেলস" (সমস্ত অতিরিক্ত কার্যকারিতা) যুক্ত করার বিষয়ে যা দেখায় / করতে শীতল লাগে feels
স্কট ডরম্যান

3

যেহেতু কোড বুঝতে সমস্যা নেই, তাই এই কেসটিকে ব্যতিক্রম হিসাবে বিবেচনা করা যেতে পারে।

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


1
একমত না। আমি বলবো কখনই বুদবুদ সাজ ব্যবহার করবেন না। কুইকসোর্ট একটি ডিফাক্টো স্ট্যান্ডার্ডে পরিণত হয়েছে এবং এটি ভালভাবে বোঝা গেছে, এবং সমস্ত পরিস্থিতিতে একটি বুদ্বুদ সাজানোর মতো কার্যকর করা সহজ। সর্বনিম্ন সাধারণ ডিনোমিনিটারটি আর কম নয়;)

1
খুব অল্প সংখ্যক আইটেমের জন্য, কুইকোর্টের জন্য প্রয়োজনীয় পুনরাবৃত্তি এটি একটি শালীন বুদবুদর্টের তুলনায় ধীর করে তুলতে পারে ... তবুও বলার অপেক্ষা রাখে না যে বুদ্বুরাবোটের সবচেয়ে খারাপ অবস্থানে (যেমন একটি বাছাই করা তালিকার
দ্বিধাবিভক্ত

হ্যাঁ, তবে এটি কেবলমাত্র একটি উদাহরণ যা কীভাবে বিভিন্ন প্রয়োজনে অ্যালগোরিদম নির্বাচন করতে হয়;)

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

2
আমার একটি ডিফল্ট সাজানোর ধারণা লাইব্রেরি আমাকে যা দেয় তা (qsort (), .sort (), (সাজান ...), যাই হোক না কেন)।
ডেভিড থর্নলি

3

আমি খুঁজে পেয়েছি যে অকাল অপটিমাইজেশনের সমস্যাটি বেশিরভাগ ক্ষেত্রে বিদ্যমান কোডটি দ্রুততর হয়ে পুনরায় লেখার সময় ঘটে। আমি দেখতে পাচ্ছি যে প্রথম স্থানে কিছু সংশ্লেষিত অপ্টিমাইজেশন লিখতে সমস্যা হতে পারে তবে বেশিরভাগই আমি অকালীন অপটিমাইজেশনটি দেখতে পেয়েছি যা ভেঙে পড়ে না তা স্থির করার ক্ষেত্রে তার কুশল মাথাটি লালন করছে be

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

এই কোডটির ফলাফল যা বোঝা (খারাপ) এবং কাজের জন্য প্রচুর সময় পোড়ানো যা সম্ভবত কার্যকর (খারাপ) নয়।


3

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

সুতরাং, "প্রোটো-টাইপ" তে খুব কম বা উদ্বেগের খুব মৌলিক নকশা এবং বাস্তবায়নের ত্রুটিগুলি পণ্যগুলির (এবং সংস্থাগুলি) দীর্ঘমেয়াদী সাফল্যের প্রধান বাধা হয়ে দাঁড়িয়েছে।

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

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

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


1
হাহা, বা যখন তিনজন ব্যবহারকারীর সাথে ডেমো এক হাজারের সাথে 1.0 রিলিজ হয়।
অলিফ ফোর্শাল

1

আমি মনে করি এটি আপনি "অকাল" কীভাবে সংজ্ঞায়িত করেন তার উপর নির্ভর করে। আপনি যখন লিখছেন তখন নিম্ন-স্তরের কার্যকারিতা দ্রুত করে তোলা অন্তর্গতভাবে মন্দ নয়। আমি মনে করি এটি উক্তিটির একটি ভুল ধারণা। কখনও কখনও আমি মনে করি যে উদ্ধৃতিটি আরও কিছু যোগ্যতার সাথে করতে পারে। আমি পঠনযোগ্যতা সম্পর্কে যদিও m_p গ্লাডিয়েটরের মন্তব্য প্রতিধ্বনিত করব।


1

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

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

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

  • অনুসন্ধানের স্ক্রিন সমর্থন করার জন্য একটি বস্তুগত দৃশ্য

  • একটি ট্রিগার-বজায় রাখা সারণী অন্য অনুসন্ধানের পর্দা সমর্থন করার জন্য যা কোনও বস্তুগত দর্শন দিয়ে করা যায়নি।

  • একটি অস্বীকৃত রিপোর্টিং টেবিল (এটি কেবলমাত্র বিদ্যমান ছিল কারণ যখন কোনও ডেটা গুদাম প্রকল্প ক্যানড হয়ে যায় তখন আমাদের কিছু থ্রুপুট রিপোর্ট নিতে হয়েছিল)

  • একটি ইন্টারফেসের জন্য একটি ট্রিগার-রক্ষণাবেক্ষণের সারণী যা সিস্টেমের মধ্যে বেশ বড় সংখ্যক ভিন্নতম ইভেন্টের সর্বাধিক সাম্প্রতিক সন্ধান করতে হয়েছিল।

এটি (সেই সময়ে) অস্ট্রেলাসিয়ার বৃহত্তম জে 2 ই ই প্রকল্প ছিল - ভাল বিকাশকারী সময়ের 100 বছরেরও বেশি সময় ধরে - এবং এটিতে ডেটাবেস স্কিমায় 4 টি অস্বীকৃত আইটেম ছিল, যার মধ্যে একটিও আসলে সেখানে ছিল না।


1

অকালীন অপটিমাইজেশন সমস্ত মন্দের মূল নয়, এটি অবশ্যই। তবে এর মধ্যে ত্রুটিগুলি রয়েছে:

  • আপনি উন্নয়নের সময় আরও সময় বিনিয়োগ
  • আপনি এটি পরীক্ষা করার জন্য আরও সময় বিনিয়োগ করেন
  • আপনি আরও সময় ফিক্সিং বাগগুলি বিনিয়োগ করেন যা অন্যথায় না হয়

অকাল অপটিমাইজেশনের পরিবর্তে, কেউ আরও ভাল অপ্টিমাইজেশনের জন্য প্রকৃত প্রয়োজন আছে কিনা তা দেখার জন্য, প্রারম্ভিক দৃশ্যমানতা পরীক্ষা করতে পারে।


1

যারা "পিএমও" মেনে চলেছেন তাদের বেশিরভাগই (আংশিক উক্তিটি, অর্থাৎ) মাপের উপর ভিত্তি করে অপ্টিমাইজেশন করতে হবে এবং একেবারে শেষ পর্যন্ত পরিমাপ করা যাবে না।

বৃহত সিস্টেমের বিকাশের এটিও আমার অভিজ্ঞতা যে পারফরম্যান্স টেস্টিংটি শেষের দিকে করা হয়, যেহেতু উন্নয়ন শেষ হয় completion

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

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

  • সদ্য-প্রয়োগকৃত কোডের কার্যকারিতাটি বিদ্যমান, একই কোডের সাথে তুলনা করা যেতে পারে। নতুন কোডের কার্য সম্পাদনের জন্য একটি "অনুভূতি" সময়ের সাথে সাথে প্রতিষ্ঠিত হবে।
  • যদি বিদ্যমান কোডটি হঠাৎ করে ঘেমে যায় তবে আপনি বুঝতে পারেন যে এটির কিছু ঘটেছে এবং আপনি তা তাত্ক্ষণিকভাবে তদন্ত করতে পারেন, পরে (পুরোপুরি) পুরো সিস্টেমটি প্রভাবিত করার পরে নয়।

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

এই দুর্দান্ত টুকরোটি পরীক্ষা করে দেখুন কীভাবে পিএমও হতে পারে বা কোনও অর্থ হতে পারে।

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