আপনি কি মনে করেন "চমৎকার" অবজেক্ট অরিয়েন্টেটেড কোড লেখার এবং খুব দ্রুত লো ল্যাটেন্সি কোডটি লেখার মধ্যে কোনও বাণিজ্য রয়েছে? উদাহরণস্বরূপ, সি ++ / পলিমারফিজম ইত্যাদির ওভারহেডে ভার্চুয়াল ফাংশনগুলি এড়িয়ে যাওয়া- কোডটি পুনরায় লেখার জন্য যা খারাপ লাগবে, তবে খুব দ্রুত ইত্যাদি?
আমি এমন একটি ক্ষেত্রে কাজ করি যা বিলম্বের চেয়ে থ্রুটপুটটিতে কিছুটা বেশি মনোযোগী তবে এটি খুব কার্য সম্পাদন-সমালোচনামূলক এবং আমি "বাছাই" বলব ।
তবুও একটি সমস্যা হ'ল এত লোক তাদের কর্মক্ষমতা সম্পর্কে ধারণাগুলি সম্পূর্ণরূপে ভুল করে। বিজ্ঞপ্তিগুলি প্রায়শই সমস্ত কিছু ভুল সম্পর্কে পায় এবং তাদের "গণনা মূল্যের" সম্পূর্ণ ধারণাগত মডেলটির পুনরায় কাজ করা দরকার, কেবলমাত্র আলগোরিদিমিক জটিলতা কেবলমাত্র তারা সঠিকভাবে পেতে পারে সে সম্পর্কে about মধ্যস্থতাকারীরা অনেক কিছুই ভুল করে। বিশেষজ্ঞরা কিছু জিনিস ভুল করে।
যথাযথ সরঞ্জামগুলি পরিমাপ করা যা ক্যাশে মিস এবং শাখার ভুল অনুমানের মতো মেট্রিক সরবরাহ করতে পারে যা ক্ষেত্রের যে কোনও স্তরের দক্ষতার সমস্ত লোককে চেক করে রাখে।
পরিমাপ করাও কী অপটিমাইজ করবেন না তা নির্দেশ করে । বিশেষজ্ঞরা প্রায়শই নবাগতদের তুলনায় অপেক্ষাকৃত কম সময় ব্যয় করেন , যেহেতু তারা সত্যিকারের মাপের হটস্পটগুলিকে অনুকূল করে তুলছেন এবং অন্ধকারে বন্য ছুরিকাঘাতগুলি কী ধীর হতে পারে (যা চরম আকারে, কেবলমাত্র মাইক্রো-অপ্টিমাইজ করার জন্য প্ররোচিত করতে পারে) এর উপর ভিত্তি করে কোডবেসের প্রতিটি অন্যান্য লাইন সম্পর্কে)।
পারফরম্যান্সের জন্য ডিজাইনিং
পাশাপাশি, পারফরম্যান্সের জন্য ডিজাইনিংয়ের মূলটি ইন্টারফেস ডিজাইনের মতোই নকশা অংশ থেকে আসে । অনভিজ্ঞতার সমস্যাগুলির মধ্যে একটি হ'ল কিছু সাধারণীকরণের প্রসঙ্গে পরোক্ষ ফাংশন কলের দামের মতো পরম বাস্তবায়ন মেট্রিক্সের প্রাথমিক পরিবর্তন হতে পারে যেমন ব্যয় হয় (যা অপটিমাইজারের বিন্দু থেকে তাত্ক্ষণিক অর্থে আরও ভালভাবে বোঝা যায়) ব্রাঞ্চিং দৃষ্টিকোণের পরিবর্তে দেখুন) পুরো কোডবেজ এটিকে এড়িয়ে যাওয়ার এক কারণ।
খরচ তুলনামূলক হয় । একটি পরোক্ষ ফাংশন কলের জন্য যখন ব্যয় হয়, যেমন, সমস্ত খরচ আপেক্ষিক। আপনি যদি এমন এক ফাংশন কল করার জন্য সেই সময়টি একত্রে পরিশোধ করে থাকেন যা লক্ষ লক্ষ উপাদানকে ছাড়িয়ে যায়, এই ব্যয়টি নিয়ে চিন্তিত হ'ল কয়েক বিলিয়ন ডলারের পণ্য কেনার জন্য পেনিসের উপর ঘণ্টার পর ঘণ্টা ব্যয় করার মতো, কেবলমাত্র সেই পণ্যটি কিনে না দেওয়ার সিদ্ধান্ত নেওয়া কারণ এটি কারণ এক পয়সা খুব ব্যয়বহুল ছিল।
মোটা ইন্টারফেস ডিজাইন
পারফরম্যান্সের ইন্টারফেস ডিজাইনের দিকটি প্রায়শই আগে এই ব্যয়গুলিকে মোটা স্তরে ঠেলে দেওয়ার চেষ্টা করে। উদাহরণস্বরূপ, কোনও একক কণার জন্য রানটাইম বিমূর্ত ব্যয় পরিশোধের পরিবর্তে, আমরা সেই ব্যয়টিকে কণা সিস্টেম / ইমিটারের স্তরে চাপিয়ে দিতে পারি, কার্যকরভাবে একটি কণাকে কার্যকরভাবে প্রয়োগের বিশদ এবং / অথবা এই কণা সংগ্রহের কাঁচা ডেটাতে সরবরাহ করতে পারি।
সুতরাং অবজেক্ট-ওরিয়েন্টেড ডিজাইনের জন্য পারফরম্যান্সের জন্য ডিজাইনের সাথে বেমানান হওয়ার দরকার নেই (ল্যাটেন্সি বা থ্রুপুট যাই হোক না কেন) তবে এমন একটি ভাষায় প্রলোভন থাকতে পারে যা ক্রমবর্ধমান টিনে গ্রানুলার অবজেক্টগুলিকে মডেল করার দিকে মনোনিবেশ করে এবং সেখানে সর্বশেষতম অপ্টিমাইজারটি পারে না সহায়তা। এটি কোনও একক পয়েন্ট প্রতিনিধিত্ব করে এমন একটি ক্লাসকে কোলেসেসের মতো কাজ করতে পারে না যা সফ্টওয়্যারটির মেমরি অ্যাক্সেস প্যাটার্নগুলির জন্য দক্ষ এসএ প্রতিনিধিত্ব করে। মোটা হওয়ার স্তরে মডেল করা ইন্টারফেস ডিজাইনের সাথে পয়েন্টগুলির সংকলনটি সেই সুযোগটি সরবরাহ করে এবং প্রয়োজন হিসাবে আরও এবং আরও সর্বোত্তম সমাধানগুলির দিকে পুনরাবৃত্তি করার অনুমতি দেয়। এ জাতীয় নকশা বাল্ক মেমরির জন্য ডিজাইন করা হয়েছে।
* এখানে মেমরির উপরে ফোকাস নোট করুন এবং ডেটা নয় , কারণ দীর্ঘসময় ধরে পারফরম্যান্স-সমালোচনামূলক ক্ষেত্রে কাজ করা আপনার ডেটা ধরণের এবং ডেটা স্ট্রাকচারের এবং আপনার মেমরির সাথে কীভাবে সংযুক্ত রয়েছে সে সম্পর্কে আপনার দৃষ্টিভঙ্গি বদলাবে। একটি বাইনারি অনুসন্ধান ট্রি কেবলমাত্র নির্দিষ্ট সংখ্যক বরাদ্দকারী দ্বারা সহায়তা না করাতে গাছের নোডের ক্ষেত্রে সম্ভাব্য-বিচ্ছিন্নতা এবং ক্যাশে-বন্ধুত্বপূর্ণ মেমরি খণ্ডের মতো লোগারিথমিক জটিলতার পক্ষে আর হয়ে ওঠে না। দৃশ্যটি অ্যালগরিদমিক জটিলতা খারিজ করে না, তবে এটি এটিকে আর মেমরি বিন্যাসের থেকে স্বাধীনভাবে দেখতে পায় না। মেমরি অ্যাক্সেসের পুনরাবৃত্তি সম্পর্কে আরও কাজ হিসাবে কাজটির পুনরাবৃত্তিগুলিও দেখতে শুরু করা হয় *
অনেকগুলি পারফরম্যান্স-সমালোচনামূলক ডিজাইন আসলে উচ্চ-স্তরের ইন্টারফেস ডিজাইনের ধারণার সাথে খুব সামঞ্জস্যপূর্ণ হতে পারে যা মানুষের বুঝতে ও ব্যবহার করা সহজ। পার্থক্যটি হ'ল এই প্রসঙ্গে "উচ্চ-স্তরের" মেমরির প্রচুর পরিমাণে সমষ্টি সম্পর্কে, সম্ভাব্য বৃহত ডেটা সংগ্রহের জন্য তৈরি একটি ইন্টারফেস এবং হুডের অধীনে একটি বাস্তবায়ন যা বেশ নিম্ন স্তরের হতে পারে। ভিজ্যুয়াল উপমাটি এমন গাড়ি হতে পারে যা সত্যিই স্বাচ্ছন্দ্যময় এবং ড্রাইভ করা সহজ এবং সাউন্ডের গতিতে চলার সময় খুব নিরাপদ তবে আপনি যদি হুডটি পপ করেন তবে ভিতরে অগ্নি-শ্বাস-প্রশ্বাসের অল্প কিছু রয়েছে।
একটি মোটা নকশা সহ আরও কার্যকর লকিং নিদর্শন সরবরাহ করার এবং কোডের মধ্যে সমান্তরালতা কাজে লাগানোর সহজ উপায় আসতে ঝোঁক (মাল্টিথ্রেডিং একটি বিস্তৃত বিষয় যা আমি এখানে এড়িয়ে যাব)।
মেমরি পুল
লো-লেটেন্সি প্রোগ্রামিংয়ের একটি সমালোচনামূলক দিক সম্ভবত উল্লেখের স্থানীয়ত্বের পাশাপাশি মেমরির বরাদ্দকরণ এবং ক্ষয় করার সাধারণ গতি উন্নত করতে মেমরির উপর খুব স্পষ্ট নিয়ন্ত্রণ হতে চলেছে। কাস্টম বরাদ্দকারী পুলিং মেমরিটি আসলে বর্ণিত একই ধরণের ডিজাইন মানসিকতার প্রতিধ্বনি দেয়। এটি বাল্ক জন্য ডিজাইন করা হয় ; এটি একটি মোটা স্তরে ডিজাইন করা হয়েছে। এটি বড় বড় ব্লকগুলিতে মেমরিটিকে পূর্বপদে রাখে এবং ছোট খণ্ডে ইতিমধ্যে বরাদ্দকৃত মেমরিটি পুল করে।
ধারণাটি ব্যয়বহুল জিনিসগুলি (সাধারণ উদ্দেশ্যে বরাদ্দকারীর বিরুদ্ধে একটি মেমরি অংশ বরাদ্দকরণ, উদাহরণস্বরূপ) মোটা এবং মোটা স্তরের দিকে ঠেলে দেওয়ার মতোই। একটি মেমরি পুলটি প্রচুর পরিমাণে স্মৃতি নিয়ে কাজ করার জন্য ডিজাইন করা হয়েছে ।
টাইপ সিস্টেমগুলি পৃথক মেমরি
যে কোনও ভাষায় গ্রানুলার অবজেক্ট-ওরিয়েন্টড ডিজাইনের একটি অসুবিধা হ'ল এটি প্রায়শই প্রচুর কিশোর-ব্যবহারকারী সংজ্ঞায়িত প্রকার ও ডেটা স্ট্রাকচার প্রবর্তন করতে চায়। এই ধরণেরগুলি তখন গতিশীলরূপে বরাদ্দ করা হলে সামান্য কিশোর খণ্ডে বরাদ্দ রাখতে চাইতে পারেন।
সি ++ এর একটি সাধারণ উদাহরণ হ'ল পলিমারফিজম প্রয়োজন এমন ক্ষেত্রে, যেখানে প্রাকৃতিক প্রলোভন একটি সাধারণ-উদ্দেশ্যে মেমরির বরাদ্দকারীদের বিরুদ্ধে সাবক্লাসের প্রতিটি উদাহরণ বরাদ্দ করা হয়।
এটি সম্ভবত সামঞ্জস্যপূর্ণ-মেমরি লেআউটগুলি সামান্য ইটি-বিটসি বিট এবং অ্যাড্রেসিং রেঞ্জ জুড়ে ছড়িয়ে ছিটিয়ে থাকা টুকরো টুকরো টুকরো টুকরো করে ফেলেছে যা আরও পৃষ্ঠার ত্রুটি এবং ক্যাশে মিস না করে অনুবাদ করে।
যে ক্ষেত্রগুলি সর্বনিম্ন-লেটেন্সি, স্টাটার-মুক্ত, সংজ্ঞাবিরোধী প্রতিক্রিয়ার দাবি করে সম্ভবত হিটস্পটগুলি সর্বদা একক বাধা পর্যন্ত সিদ্ধ হয় না, যেখানে ক্ষুদ্র অক্ষমতাগুলি প্রকৃতপক্ষে প্রকৃতপক্ষে "একত্রিত" হতে পারে (অনেক লোক কল্পনা করে) কোনও প্রোফাইলারের সাথে তাদের তদারকির জন্য ভুলভাবে ঘটছে, তবে বিলম্বিত-চালিত ক্ষেত্রগুলিতে এমন কিছু বিরল ঘটনা ঘটতে পারে যেখানে ক্ষুদ্র অদক্ষতা জমে থাকে)। এবং এইরকম জমে থাকা সর্বাধিক সাধারণ কারণগুলি হ'ল: সমস্ত জায়গাতেই মেমরির কিশোর অংশগুলির অতিরিক্ত বরাদ্দ।
জাভার মতো ভাষায়, বোতলজাতীয় অঞ্চলগুলির (টাইট লুপগুলিতে প্রক্রিয়াজাত অঞ্চল) যেমন এর অ্যারে int
(তবে এখনও একটি উচ্চমানের উচ্চ স্তরের ইন্টারফেসের পিছনে) এর পরিবর্তে সম্ভব হয় তখন প্লে পুরানো ডেটা ধরণের আরও অ্যারে ব্যবহার করা সহায়ক হতে পারে say , ArrayList
ব্যবহারকারী-সংজ্ঞায়িত Integer
অবজেক্টগুলির একটি। এটি মেমরি বিভাজনকে এড়িয়ে যায় যা সাধারণত পরবর্তীকালের সাথে থাকে। সি ++ তে, আমাদের মেমরি বরাদ্দকরণের ধরণগুলি দক্ষ হলে আমাদের কাঠামোগুলিকে যথেষ্ট পরিমাণে হ্রাস করতে হবে না, কারণ সেখানে ব্যবহারকারী-সংজ্ঞায়িত ধরণেরগুলি স্বচ্ছভাবে সেখানে এবং এমনকি জেনেরিক ধারক প্রসঙ্গেও বরাদ্দ করা যেতে পারে।
একসাথে ফিরে স্মৃতি ফিউজিং
এখানে একটি সমাধান হ'ল একজাতীয় ডেটা ধরণের জন্য কাস্টম বরাদ্দকারীর কাছে পৌঁছানো এবং সম্ভবত একজাতীয় ডেটা ধরণের জুড়ে। যখন ক্ষুদ্রতর ডাটা প্রকার এবং ডেটা স্ট্রাকচারগুলি মেমরিতে বিট এবং বাইটগুলিতে সমতল হয়, তারা একজাতীয় প্রকৃতি গ্রহণ করে (কিছু পরিবর্তনের প্রান্তিককরণের প্রয়োজনীয়তা সত্ত্বেও)। আমরা যখন তাদের কোনও স্মৃতি-কেন্দ্রিক মানসিকতা থেকে তাকাতে পারি না, তখন প্রোগ্রামিং ভাষার ধরণের সিস্টেমটি "চাওয়া" হয় সম্ভাব্য-সংক্ষিপ্ত মেমরি অঞ্চলগুলিকে পৃথকভাবে ছোট ছোট ছড়িয়ে ছিটিয়ে থাকা অংশগুলিতে আলাদা করতে।
স্ট্যাক এটিকে এড়াতে এই মেমোরি-কেন্দ্রিক ফোকাসকে কাজে লাগায় এবং এর অভ্যন্তরে ব্যবহারকারীর দ্বারা সংজ্ঞায়িত ধরণের যে কোনও সম্ভাব্য মিশ্রণকে সম্ভাব্যভাবে সংরক্ষণ করে। স্ট্যাকটি আরও ব্যবহার করা একটি দুর্দান্ত ধারণা যখন এটি সম্ভব হয় কারণ এটি শীর্ষে প্রায় সর্বদা ক্যাশে লাইনে বসে থাকে তবে আমরা মেমরি বরাদ্দকারীদেরও ডিজাইন করতে পারি যা এই বৈশিষ্ট্যগুলির একটি কিছু নকল করে যা একটি লাইফো প্যাটার্ন ছাড়াই মেশিনকে বিশৃঙ্খলভাবে ডেটাযুক্ত করে তোলে এমনকি আরও জটিল মেমরি বরাদ্দ এবং deallocation নিদর্শন জন্য অংশ।
মেমরির সংকীর্ণ ব্লকগুলি প্রসেস করার সময় আধুনিক হার্ডওয়্যারটি তার শীর্ষে থাকার জন্য ডিজাইন করা হয়েছে (একই ক্যাশে লাইন, একই পৃষ্ঠাতে বারবার অ্যাক্সেস করা)। সেখানে কীওয়ার্ডটি স্বাচ্ছন্দ্য রয়েছে, কারণ এটি কেবল তখনই উপকারী যখন আগ্রহের ডেটা চারপাশে থাকে। সুতরাং পারফরম্যান্সের মূল চাবিকাঠি (তবুও অসুবিধা) হ'ল উচ্ছেদের পূর্বে মেমরির বিভাজিত অংশগুলিকে আবার একত্রিত করে একযোগে অবরুদ্ধ ব্লকগুলিতে পরিণত করা হয় যা উচ্ছেদের পূর্বে তাদের সম্পূর্ণ (সমস্ত পার্শ্ববর্তী ডেটা প্রাসঙ্গিক) অ্যাক্সেস করা হয়। প্রোগ্রামিং ভাষাগুলিতে বিশেষত ব্যবহারকারী-সংজ্ঞায়িত প্রকারের সমৃদ্ধ ধরণের সিস্টেমটি এখানে সবচেয়ে বড় বাধা হতে পারে, তবে আমরা যথাযথভাবে কাস্টম বরাদ্দকারী এবং / অথবা বাল্কিয়ার ডিজাইনের মাধ্যমে সমস্যাটি সমাধান করতে পারি।
অরুপ
"কুশলী" বলা শক্ত। এটি একটি সাবজেক্টিভ মেট্রিক, এবং যে কেউ খুব কার্য সম্পাদন-সমালোচনামূলক ক্ষেত্রে কাজ করে সে "সৌন্দর্য" সম্পর্কে তাদের ধারণাটি এমন একটিতে পরিবর্তন করা শুরু করবে যা আরও অনেক তথ্য-ভিত্তিক এবং ইন্টারফেসগুলিতে ফোকাস করে যা প্রচুর পরিমাণে জিনিসগুলি প্রক্রিয়া করে।
বিপজ্জনক
"বিপজ্জনক" আরও সহজ হতে পারে। সাধারণভাবে, কর্মক্ষমতা নিম্ন স্তরের কোডের দিকে যেতে চায়। উদাহরণস্বরূপ, মেমরি বরাদ্দকারীকে কার্যকর করা ডেটা ধরণের নীচে না পৌঁছানো এবং কাঁচা বিট এবং বাইটের বিপজ্জনক পর্যায়ে কাজ করা অসম্ভব। ফলস্বরূপ, এটি প্রয়োগযোগ্য অপ্টিমাইজেশনের স্তরের সাথে পরীক্ষার পুরোপুরি স্কেলিং করে এই পারফরম্যান্স-সমালোচনামূলক সাবসিস্টেমগুলিতে সাবধানতার সাথে পরীক্ষার পদ্ধতিতে মনোযোগ বাড়াতে সহায়তা করতে পারে।
সৌন্দর্য
তবুও এগুলি সমস্ত বাস্তবায়ন বিশদ পর্যায়ে থাকবে। একজন প্রবীণ বৃহত আকারের এবং পারফরম্যান্স-সমালোচনামূলক মানসিকতা উভয় ক্ষেত্রেই "সৌন্দর্য" প্রয়োগের বিশদটির পরিবর্তে ইন্টারফেস ডিজাইনের দিকে অগ্রসর হয়। ইন্টারফেস ডিজাইন পরিবর্তনের মুখে সংঘবদ্ধ হওয়া সংঘবদ্ধকরণ এবং ক্যাসকেডিং ভাঙ্গনের কারণে বাস্তবায়নের পরিবর্তে "সুন্দর", ব্যবহারযোগ্য, নিরাপদ, দক্ষ ইন্টারফেসগুলি অনুসন্ধান করা তাত্পর্যপূর্ণভাবে উচ্চতর অগ্রাধিকারে পরিণত হয়। বাস্তবায়ন যে কোনও সময় অদলবদল করা যেতে পারে। আমরা সাধারণত প্রয়োজন হিসাবে কর্মক্ষমতা প্রতি পুনরাবৃত্তি, এবং পরিমাপ দ্বারা নির্দেশিত হিসাবে। ইন্টারফেস ডিজাইনের মূল কীটি হ'ল একটি মোটা পর্যায়ে মডেল করা যাতে পুরো সিস্টেমটি না ভেঙে এমন পুনরাবৃত্তির জন্য জায়গা ছেড়ে যায়।
প্রকৃতপক্ষে, আমি প্রস্তাব দেব যে পারফরম্যান্স-সমালোচনামূলক বিকাশের উপর একজন অভিজ্ঞ ব্যক্তির ফোকাস প্রায়শই নিরাপত্তা, পরীক্ষা, রক্ষণাবেক্ষণ, সাধারণভাবে কেবল এসই এর শিষ্যর উপর একটি প্রধান দৃষ্টি নিবদ্ধ রাখে, যেহেতু একটি বৃহত আকারের কোডবেস যার বেশ কয়েকটি পারফরম্যান্স রয়েছে ক্রিটিকাল সাবসিস্টেম (কণা সিস্টেম, ইমেজ প্রসেসিং অ্যালগরিদম, ভিডিও প্রসেসিং, অডিও প্রতিক্রিয়া, রেট্রেসারস, জাল ইঞ্জিন, ইত্যাদি) রক্ষণাবেক্ষণের দুঃস্বপ্নে ডুবে যাওয়া এড়াতে সফটওয়্যার ইঞ্জিনিয়ারিংয়ের দিকে গভীর মনোযোগ দেওয়া প্রয়োজন। এটি কোনও কাকতালীয় কারণে নয় যে প্রায়শই সবচেয়ে আশ্চর্যজনকভাবে কার্যকর পণ্যগুলির মধ্যে খুব কম সংখ্যক বাগও থাকতে পারে।
টি এল; ডিআর
যাইহোক, প্রকৃতপক্ষে পারফরম্যান্স-সমালোচনামূলক ক্ষেত্রে অগ্রাধিকার থেকে শুরু করে কী কী ক্ষীণতা হ্রাস করতে পারে এবং ক্ষুদ্র অক্ষমতাগুলি কীভাবে জমে উঠতে পারে এবং আসলে "সৌন্দর্য" কে কী রূপ দেয় (যখন সবচেয়ে বেশি উত্পাদনশীল জিনিস দেখে) that's