আসল প্রশ্ন
দুটি লুপের চেয়ে কেন একটি লুপ এত ধীর?
উপসংহার:
মামলা 1 হ'ল একটি ক্লাসিক ইন্টারপোলেশন সমস্যা যা অকার্যকর হয়ে থাকে। আমি আরও মনে করি যে অনেকগুলি মেশিন আর্কিটেকচার এবং বিকাশকারীরা মাল্টি-থ্রেড অ্যাপ্লিকেশন করার পাশাপাশি প্যারালাল প্রোগ্রামিংয়ের ক্ষমতা সম্পন্ন মাল্টি-কোর সিস্টেমগুলি বিল্ডিং এবং ডিজাইনিংয়ের কাজ শেষ করার অন্যতম কারণ ছিল।
হার্ডওয়্যার, ওএস এবং কম্পাইলার (রা) কীভাবে র্যাম, ক্যাশে, পৃষ্ঠা ফাইল ইত্যাদির সাথে কাজ করে জড়িত হ্যাপ বরাদ্দ করতে একসাথে কাজ করে তা জড়িত ছাড়াই এ জাতীয় পদ্ধতির থেকে এটিকে দেখানো; এই অ্যালগরিদমের ভিত্তিতে যে গণিত রয়েছে তা আমাদের দেখায় যে এই দুটির মধ্যে কোনটি আরও ভাল সমাধান।
আমরা একটি একটি উপমা ব্যবহার করতে পারেন Bossএকটি হচ্ছে Summationযে একটি উপস্থাপিত করবে For Loopশ্রমিকদের মধ্যে ভ্রমণ করতে হবে যে A& B।
আমরা সহজেই দেখতে পাই যে কেস 2 কমপক্ষে অর্ধেক তত দ্রুত হয় যদি কেস 1 এর চেয়ে সামান্য বেশি না হয় যাতায়াতের জন্য প্রয়োজনীয় দূরত্ব এবং শ্রমিকদের মধ্যে যে সময় নেওয়া হয় তার পার্থক্যের কারণে। এই গণিতটি লঞ্চ প্রায় কার্যত এবং নিখুঁতভাবে বেঞ্চমার্ক টাইমসের পাশাপাশি অ্যাসেম্বলি নির্দেশাবলীর পার্থক্যের সংখ্যার সাথে মিলিয়ে।
আমি এখন নীচে এই সমস্ত কীভাবে কাজ করে তা ব্যাখ্যা করতে শুরু করব।
সমস্যা মূল্যায়ন
ওপির কোড:
const int n=100000;
for(int j=0;j<n;j++){
a1[j] += b1[j];
c1[j] += d1[j];
}
এবং
for(int j=0;j<n;j++){
a1[j] += b1[j];
}
for(int j=0;j<n;j++){
c1[j] += d1[j];
}
বিবেচনা
অপর দুটি লুপের দুটি রূপ সম্পর্কে ওপির মূল প্রশ্ন এবং অন্যান্য অনেক দুর্দান্ত উত্তর এবং দরকারী মন্তব্যের পাশাপাশি ক্যাশেগুলির আচরণ সম্পর্কে তার সংশোধিত প্রশ্ন বিবেচনা করা; আমি এই পরিস্থিতি এবং সমস্যা সম্পর্কে আলাদা ধারণা গ্রহণ করে এখানে চেষ্টা করতে এবং কিছু আলাদা করতে চাই।
অভিগমন
দুটি লুপগুলি বিবেচনা করে এবং ক্যাশে এবং পৃষ্ঠা ফাইলিংয়ের সমস্ত আলোচনা বিবেচনা করে আমি এটিকে অন্য দৃষ্টিকোণ থেকে দেখার জন্য অন্য একটি পদ্ধতি অবলম্বন করতে চাই। একটি যা ক্যাশে এবং পৃষ্ঠার ফাইলগুলি বা মেমরি বরাদ্দকরণের জন্য মৃত্যুদন্ড জড়িত করে না, বাস্তবে, এই পদ্ধতির এমনকি আসল হার্ডওয়্যার বা সফ্টওয়্যার মোটেই উদ্বেগ নয়।
পরিপ্রেক্ষিত
কিছুক্ষণ কোডটি দেখার পরে এটি বেশ স্পষ্ট হয়ে উঠল যে সমস্যাটি কী এবং এটি কী উত্পন্ন করছে। আসুন এটিকে একটি অ্যালগোরিদমিক সমস্যা হিসাবে ভাঙা যাক এবং গাণিতিক স্বরলিপি ব্যবহারের দৃষ্টিকোণ থেকে এটি দেখুন তবে গণিতের সমস্যাগুলির সাথে সাথে অ্যালগরিদমের ক্ষেত্রেও সাদৃশ্য প্রয়োগ করুন।
আমরা কি জানি
আমরা জানি যে এই লুপটি 100,000 বার চলবে। আমরা জানি যে a1, b1, c1&d1 64-বিট আর্কিটেকচারের উপর পয়েন্টার আছে। সি -+ এর মধ্যে 32-বিট মেশিনে সমস্ত পয়েন্টার 4 বাইট এবং 64-বিট মেশিনে থাকে, সেগুলি 8 বাইট আকারের হয় কারণ পয়েন্টারগুলি একটি নির্দিষ্ট দৈর্ঘ্যের হয়।
আমরা জানি যে আমাদের 32 টি বাইট রয়েছে যাতে উভয় ক্ষেত্রেই বরাদ্দ করতে হয়। পার্থক্যটি হ'ল আমরা প্রতিটি পুনরাবৃত্তির উপর 32 বাইট বা 2-8 বাইটের 2 সেট বরাদ্দ করছি যেখানে 2 য় ক্ষেত্রে আমরা স্বতন্ত্র লুপগুলির জন্য প্রতিটি পুনরাবৃত্তির জন্য 16 বাইট বরাদ্দ করছি।
উভয় লুপ মোট বরাদ্দে এখনও 32 বাইট সমান। এই তথ্যের সাহায্যে এখন এগিয়ে চলুন এবং এই ধারণাগুলির সাধারণ গণিত, অ্যালগরিদম এবং উপমা দেখান।
একই সেট বা অপারেশনের গ্রুপ যা উভয় ক্ষেত্রেই সম্পাদন করতে হবে তার সংখ্যা আমরা জানি। উভয় ক্ষেত্রে যে পরিমাণ মেমরি বরাদ্দ করা দরকার তা আমরা জানি। আমরা মূল্যায়ন করতে পারি যে উভয় ক্ষেত্রেই বরাদ্দের সামগ্রিক কাজের চাপ প্রায় একই রকম হবে।
আমরা কী জানি না
আমরা কাউন্টার সেট না করে এবং একটি মানদণ্ড পরীক্ষা না চালালে প্রতিটি মামলায় কতক্ষণ সময় লাগবে তা আমরা জানি না। তবে মুল প্রশ্নগুলি ইতিমধ্যে মূল প্রশ্ন এবং কিছু উত্তর এবং মন্তব্য থেকে অন্তর্ভুক্ত ছিল; এবং আমরা দুজনের মধ্যে একটি উল্লেখযোগ্য পার্থক্য দেখতে পাচ্ছি এবং এটিই এই সমস্যার এই প্রস্তাবের পুরো যুক্তি।
আসুন তদন্ত করা যাক
এটি ইতিমধ্যে প্রতীয়মান যে ইতিমধ্যে অনেকে হ্যাপ বরাদ্দ, বেঞ্চমার্ক পরীক্ষা, র্যাম, ক্যাশে এবং পৃষ্ঠা ফাইলগুলি দেখে এই কাজটি করেছেন। নির্দিষ্ট ডেটা পয়েন্ট এবং সুনির্দিষ্ট পুনরাবৃত্তি সূচকগুলির দিকে তাকানোও অন্তর্ভুক্ত ছিল এবং এই নির্দিষ্ট সমস্যা সম্পর্কে বিভিন্ন কথোপকথনের অনেক লোক এটি সম্পর্কে অন্যান্য সম্পর্কিত বিষয়গুলি প্রশ্ন করা শুরু করে। গাণিতিক অ্যালগোরিদম ব্যবহার করে এবং এর সাথে সাদৃশ্য প্রয়োগ করে আমরা কীভাবে এই সমস্যাটি দেখতে শুরু করব? আমরা দু'দফা দাবি করে শুরু করি! তারপরে আমরা সেখান থেকে আমাদের অ্যালগরিদম তৈরি করি।
আমাদের বক্তব্য:
- আমরা আমাদের লুপ এবং এর পুনরাবৃত্তিগুলি একটি সংমিশ্রণ হতে দেব যা 1 থেকে শুরু হয় এবং 100000 এ শেষ হয় 0 এর সাথে শুরু না করে লুপগুলির জন্য কারণ আমাদের কেবল মেমরি অ্যাড্রেসিংয়ের 0 সূচীকরণ স্কিম সম্পর্কে চিন্তা করার দরকার নেই যেহেতু আমরা কেবল আগ্রহী অ্যালগরিদম নিজেই।
- উভয় ক্ষেত্রেই আমাদের সাথে কাজ করার জন্য 4 টি ফাংশন এবং প্রতিটি ফাংশন কলে 2 টি অপারেশন সহ 2 ফাংশন কল রয়েছে। আমরা নিম্নলিখিত হিসাবে ফাংশন ফাংশন এবং কলের এই সেট আপ করবে:
F1(), F2(), f(a), f(b), f(c)এবং f(d)।
অ্যালগরিদম:
1 ম কেস: - শুধুমাত্র একটি সংশ্লেষ তবে দুটি স্বতন্ত্র ফাংশন কল।
Sum n=1 : [1,100000] = F1(), F2();
F1() = { f(a) = f(a) + f(b); }
F2() = { f(c) = f(c) + f(d); }
২ য় কেস: - দুটি সারসংক্ষেপ তবে প্রত্যেকটির নিজস্ব ফাংশন কল রয়েছে।
Sum1 n=1 : [1,100000] = F1();
F1() = { f(a) = f(a) + f(b); }
Sum2 n=1 : [1,100000] = F1();
F1() = { f(c) = f(c) + f(d); }
আপনি খেয়াল F2()কেবলমাত্র বিদ্যমান Sumথেকে Case1যেখানে F1()মধ্যে অন্তর্ভুক্ত করা হয় Sumথেকে Case1এবং উভয় Sum1এবং Sum2থেকে Case2। এটি পরে স্পষ্ট হবে যখন আমরা এই সিদ্ধান্তে পৌঁছাতে শুরু করি যে একটি বিকল্প রয়েছে যা দ্বিতীয় অ্যালগরিদমের মধ্যে চলছে।
প্রথম কেস Sumকলগুলির মাধ্যমে পুনরাবৃত্তিগুলি f(a)তার স্বতে যুক্ত হবে f(b)তারপরে এটি কল f(c)করবে যা একই কাজ করবে তবে f(d)প্রতিটি 100000পুনরাবৃত্তির জন্য নিজেকে যুক্ত করবে । দ্বিতীয় ক্ষেত্রে, আমাদের আছে Sum1এবং Sum2উভয়ই একই কাজ করে যেমন তারা একই ফাংশনটি পরপর দু'বার ডাকা হচ্ছে।
এই ক্ষেত্রে আমরা চিকিত্সা করতে পারি Sum1এবং Sum2ঠিক সাদামাটা পুরাতন Sumযেখানে Sumএই ক্ষেত্রে এটি দেখতে দেখতে: Sum n=1 : [1,100000] { f(a) = f(a) + f(b); }এবং এখন এটি একটি অপ্টিমাইজেশানের মতো দেখাচ্ছে যেখানে আমরা কেবল এটি একই ফাংশন হিসাবে বিবেচনা করতে পারি।
উপমা সঙ্গে সংক্ষিপ্তসার
আমরা দ্বিতীয় ক্ষেত্রে যা দেখেছি তার সাথে এটি প্রায় উপস্থিতি হিসাবে দেখা যায় যেহেতু অপ্টিমাইজেশন রয়েছে যেহেতু উভয় লুপের জন্য একই সঠিক স্বাক্ষর রয়েছে, তবে এটি আসল সমস্যা নয়। ইস্যু কাজ করা হয় যে কাজ করা হচ্ছে না f(a), f(b), f(c), এবং f(d)। উভয় ক্ষেত্রে এবং উভয়ের মধ্যে তুলনা করা, এটিই প্রতিটি ক্ষেত্রে সামুশনের ভ্রমণ করতে হবে এমন দূরত্বের পার্থক্য যা আপনাকে মৃত্যুদন্ডের সময়টিতে পার্থক্য দেয়।
চিন্তা করুন For Loopsহচ্ছে Summationsএকটি হচ্ছে পুনরাবৃত্তিও করে Bossযে দুই জনের আদেশ প্রদান করা হয় A& Bএবং যে তাদের কাজ মাংস হয় C& Dযথাক্রমে তাদের কাছ থেকে কিছু প্যাকেজ নিতে এবং এটা দেখাবে। এই সাদৃশ্যগুলিতে, লুপগুলি বা সংমিশ্রণ পুনরাবৃত্তির জন্য এবং শর্তগুলি পরীক্ষা করে তারা প্রকৃতপক্ষে প্রতিনিধিত্ব করে না Boss। আসলে কি প্রতিনিধিত্ব করে Bossপ্রকৃত গাণিতিক আলগোরিদিম সরাসরি থেকে কিন্তু প্রকৃত ধারণা থেকে নয় Scopeএবং Code Blockমধ্যে একটি রুটিন বা সাবরুটিন, পদ্ধতি, ফাংশন, অনুবাদ ইউনিট, ইত্যাদি প্রথম অ্যালগরিদম 1 সুযোগ যেখানে 2nd অ্যালগরিদম পরপর 2 সুযোগ রয়েছে।
প্রতিটি কল স্লিপে প্রথম কেসের মধ্যে, Bossযায় Aএবং অর্ডার দেয় এবং প্যাকেজ Aআনতে চলে যায় এবং পরে একই কাজ করার আদেশ দেয় এবং প্রতিটি পুনরাবৃত্তির থেকে প্যাকেজটি গ্রহণ করে ।B'sBossCD
দ্বিতীয় ক্ষেত্রে, সমস্ত প্যাকেজ না পাওয়া পর্যন্ত প্যাকেজ আনতে Bossসরাসরি কাজ করে । তারপরে সমস্ত প্যাকেজ পাওয়ার জন্য একই কাজ করে।AB'sBossCD's
যেহেতু আমরা একটি 8-বাইট পয়েন্টার নিয়ে কাজ করছি এবং গাদা বরাদ্দ নিয়ে কাজ করছি আসুন নীচের সমস্যাটি বিবেচনা করুন। ধরা যাক যে এটি Bossথেকে 100 ফুট Aএবং এটি A500 ফুট C। মৃত্যুদন্ডের আদেশের কারণে Bossআমাদের প্রাথমিকভাবে কতটা দূরে রয়েছে তা নিয়ে আমাদের চিন্তা Cকরার দরকার নেই। উভয় ক্ষেত্রেই প্রথম দিকে প্রথম Bossথেকে Aপ্রথম দিকে ভ্রমণ হয় B। এই সাদৃশ্যটি এই দূরত্বটি হুবহু বলা যায় না; অ্যালগরিদমের কাজ দেখানোর জন্য এটি কেবল একটি দরকারী পরীক্ষার ক্ষেত্রে দৃশ্যপট।
অনেক ক্ষেত্রে হিপ বরাদ্দগুলি করার সময় এবং ক্যাশে এবং পৃষ্ঠা ফাইলগুলির সাথে কাজ করার সময়, ঠিকানার অবস্থানগুলির মধ্যে এই দূরত্বগুলি খুব বেশি আলাদা হয় না বা তারা ডেটা ধরণের এবং অ্যারের আকারগুলির প্রকৃতির উপর নির্ভর করে উল্লেখযোগ্যভাবে পরিবর্তিত হতে পারে।
পরীক্ষার কেস:
প্রথম কেস: প্রথম পুনরাবৃত্তির সময়Bossঅর্ডার স্লিপ দিতে প্রথমে 100 ফুট যেতে হয়AএবংAচলে যায় এবং তার কাজটি করে, তবেতার অর্ডার স্লিপ দিতে তারBoss500 পা ভ্রমণ করতেCহবে। তারপরে পরবর্তী পুনরাবৃত্তিতে এবং অন্য প্রতিটি পুনরাবৃত্তির পরে উভয়েরBossমধ্যে 500 ফুট পিছনে পিছনে যেতে হবে।
দ্বিতীয়ত কেস:Boss প্রথম পুনরাবৃত্তির উপর 100 ফুট ভ্রমণ করতে হয়েছেA, কিন্তু যে পরে, তিনি ইতিমধ্যেই আছে এবং মাত্র জন্য অপেক্ষাAফিরে পেতে পর্যন্ত স্লিপ ভরা হয়। তারপরেBossপ্রথম পুনরাবৃত্তিতে 500 ফুট ভ্রমণ করতে হবেCকারণCএটি 500 ফুটA। যেহেতুতাঁরBoss( Summation, For Loop )সাথে কাজ করার পরে এটি ডাকা হচ্ছে ঠিকAতখনই সেখানে অপেক্ষা করেনAযতক্ষণ না তিনিC'sঅর্ডার স্লিপনা করে সমস্তকাজ শেষ করেন।
দূরত্বের পার্থক্য ভ্রমণ
const n = 100000
distTraveledOfFirst = (100 + 500) + ((n-1)*(500 + 500);
// Simplify
distTraveledOfFirst = 600 + (99999*100);
distTraveledOfFirst = 600 + 9999900;
distTraveledOfFirst = 10000500;
// Distance Traveled On First Algorithm = 10,000,500ft
distTraveledOfSecond = 100 + 500 = 600;
// Distance Traveled On Second Algorithm = 600ft;
সালিসী মূল্যবোধের তুলনা
আমরা সহজেই দেখতে পাই যে 600 টি 10 মিলিয়নের চেয়ে অনেক কম। এখন, এটি সঠিক নয়, কারণ আমরা জানি না কোন র্যামের ঠিকানা বা যা থেকে ক্যাশে বা পৃষ্ঠা ফাইলের মধ্যে প্রতিটি দূরত্বের প্রতিটি কল অন্য অনেকগুলি অদেখা ভেরিয়েবলের কারণে হবে তার মধ্যে দূরত্বের প্রকৃত পার্থক্যটি আমরা জানি না। সবচেয়ে খারাপ পরিস্থিতি থেকে সচেতন হওয়া এবং এটিকে দেখার জন্য এটি কেবলমাত্র পরিস্থিতির একটি মূল্যায়ন।
এই সংখ্যাগুলি থেকে এটি প্রায় প্রদর্শিত হবে যেন অ্যালগোরিদম ওয়ান 99%আলগোরিদম টু এর চেয়ে ধীর হওয়া উচিত ; যাইহোক, এই মাত্র Boss'sঅংশ বা আলগোরিদিম দায়িত্ব এবং এটা প্রকৃত শ্রমিকদের জন্য অ্যাকাউন্ট নেই A, B, C, & Dএবং তারা কি একে এবং লুপ প্রতিটি পুনরাবৃত্তির উপর করতে হবে। সুতরাং বসের কাজটি মোট কাজকর্মের প্রায় 15 - 40% কাজ করে। শ্রমিকদের মাধ্যমে যে কাজটি করা হয় তার বেশিরভাগ গতি হারের পার্থক্যের অনুপাতকে প্রায় 50-70% রাখার দিকে কিছুটা বড় প্রভাব ফেলে
পর্যবেক্ষণ: - দুটি অ্যালগরিদমের মধ্যে পার্থক্য
এই পরিস্থিতিতে, এটি কাজ করা প্রক্রিয়াটির কাঠামো। এটি দেখায় যে কেস 2 সমান ফাংশন ঘোষণা এবং সংজ্ঞা যেখানে আংশিক অপ্টিমাইজেশান উভয় থেকে আরও দক্ষ যেখানে এটি কেবল নাম এবং পার্থক্য অনুসারে দূরত্বে পরিবর্তনশীল।
আমরা আরও দেখতে পেলাম যে কেস 1 এ ভ্রমণ করা মোট দূরত্ব কেস 2 এর তুলনায় অনেক বেশি দূরে এবং আমরা এই দূরত্বটিকে দুটি অ্যালগরিদমের মধ্যে আমাদের টাইম ফ্যাক্টর ভ্রমণ করে বিবেচনা করতে পারি । কেস 1 এর ক্ষেত্রে কেস 2 এর তুলনায় যথেষ্ট বেশি কাজ করা উচিত।
ASMউভয় ক্ষেত্রে যে নির্দেশাবলী প্রদর্শিত হয়েছিল তার প্রমাণ থেকে এটি পর্যবেক্ষণযোগ্য । কি ইতিমধ্যে এই মামলা সম্পর্কে নিদিষ্ট ছিল সাথে এই সত্য যে হিসাব নেই কেস 1 মনিব উভয়ের জন্য অপেক্ষা করতে হবে A& Cফিরে পেতে আগে তিনি ফিরে যেতে পারেন Aপ্রতিটি পুনরাবৃত্তির জন্য আবার। এটি এই সত্যের জন্যও দায়বদ্ধ নয় যে যদি Aবা Bখুব দীর্ঘ সময় নিচ্ছে তবে উভয় Bossএবং অন্যান্য কর্মী (গুলি) মৃত্যুদন্ড কার্যকর হওয়ার অপেক্ষায় রয়েছেন ।
ইন কেস 2 শুধুমাত্র এক হচ্ছে নিষ্ক্রিয় Bossপর্যন্ত শ্রমিক ফিরে পায়। এমনকি এটিরও অ্যালগরিদমের উপর প্রভাব রয়েছে।
ওপিএস সংশোধিত প্রশ্ন (গুলি)
সম্পাদনা: প্রশ্নটি কোনও প্রাসঙ্গিকতার প্রমাণিত হয়নি, কারণ আচরণটি মারাত্মকভাবে অ্যারে (এন) এর আকার এবং সিপিইউ ক্যাশে নির্ভর করে। সুতরাং যদি আরও আগ্রহ থাকে তবে আমি এই প্রশ্নটি পুনরায় বলি:
নিম্নলিখিত গ্রাফের পাঁচটি অঞ্চলের দ্বারা বর্ণিত বিভিন্ন ক্যাশে আচরণের দিকে পরিচালিত করে এমন বিশদ সম্পর্কে আপনি কি কিছু দৃ ?়দৃষ্টি দিতে পারেন?
এই সিপিইউগুলির জন্য অনুরূপ গ্রাফ সরবরাহ করে সিপিইউ / ক্যাশে আর্কিটেকচারের মধ্যে পার্থক্যগুলি চিহ্নিত করাও আকর্ষণীয় হতে পারে।
এই প্রশ্নগুলি সম্পর্কে
আমি কোনও সন্দেহ ছাড়াই প্রদর্শিত করেছি যেহেতু হার্ডওয়্যার এবং সফ্টওয়্যার জড়িত হওয়ার আগেই অন্তর্নিহিত সমস্যা রয়েছে।
এখন মেমরি পরিচালনা এবং পৃষ্ঠাগুলি ফাইল ইত্যাদির সাথে ক্যাশে করার ব্যবস্থা যা সমস্ত নিম্নলিখিতগুলির মধ্যে সিস্টেমের একীভূত সংস্থায় একসাথে কাজ করে:
The Architecture {হার্ডওয়্যার, ফার্মওয়্যার, কিছু এম্বেডড ড্রাইভার, কার্নেল এবং এএসএম নির্দেশাবলী সেট}
The OSফাইল এবং মেমরি ম্যানেজমেন্ট সিস্টেম, ড্রাইভার এবং রেজিস্ট্রি}
The Compiler {উত্স কোডটির অনুবাদ ইউনিট এবং অপ্টিমাইজেশন}
- এমনকি
Source Codeনিজেই এর স্বতন্ত্র অ্যালগরিদমের সেট (গুলি) সহ।
আমরা ইতিমধ্যে দেখতে পারেন একটি বোতলের যে প্রথম অ্যালগরিদম মধ্যে ঘটছে আগে আমরা এমনকি কোনো অবাধ সঙ্গে কোনো মেশিনে এটি প্রয়োগ নেই Architecture, OSএবং Programmable Languageদ্বিতীয় অ্যালগরিদম তুলনায়। একটি আধুনিক কম্পিউটারের অন্তর্নিহিত জড়িত হওয়ার আগে একটি সমস্যা ইতিমধ্যে রয়েছে।
শেষ ফলাফল
যাহোক; এটি বলার অপেক্ষা রাখে না যে এই নতুন প্রশ্নগুলির গুরুত্ব নেই কারণ তারা নিজেরাই এবং তারা সর্বোপরি একটি ভূমিকা পালন করে। তারা পদ্ধতিগুলি এবং সামগ্রিক পারফরম্যান্সকে প্রভাবিত করে এবং তাদের উত্তর (গুলি) এবং মন্তব্য (গুলি) দিয়েছেন এমন অনেকের বিভিন্ন গ্রাফ এবং মূল্যায়নের মাধ্যমে এটি স্পষ্ট হয়।
তোমাদের মধ্যে উপমা থেকে মনোযোগ দেওয়া যদি Bossও দুই শ্রমিক Aও Bযারা যান এবং থেকে প্যাকেজ পুনরুদ্ধার করতে ছিল C& Dযথাক্রমে এবং প্রশ্ন দুটি আলগোরিদিম গাণিতিক স্বরলিপি বিবেচনা করা; আপনি কম্পিউটারের হার্ডওয়্যার এবং সফ্টওয়্যার এর জড়িততা ছাড়াই দেখতে Case 2প্রায় 60%তুলনায় দ্রুত Case 1।
যখন আপনি এই অ্যালগরিদমগুলি কোনও উত্স কোডে প্রয়োগ করা, সংকলিত, অনুকূলিতকরণ এবং ওএসের মাধ্যমে কোনও হার্ডওয়্যারের কোনও অংশে তাদের ক্রিয়াকলাপ সম্পাদনের জন্য প্রয়োগ করার পরে গ্রাফগুলি এবং চার্টগুলি দেখেন, আপনি এমনকি পার্থক্যগুলির মধ্যে কিছুটা আরও অবনতি দেখতে পান এই অ্যালগরিদমে।
যদি Dataসেট মোটামুটি ছোট এটা প্রথমে একটি পার্থক্য সব যে খারাপ বলে মনে হচ্ছে না পারে। যাইহোক, Case 1আমার হয় 60 - 70%ধীর চেয়ে Case 2আমরা সময় মৃত্যুদন্ড পার্থক্য পরিপ্রেক্ষিতে এই ফাংশন বৃদ্ধি তাকান করতে পারেন:
DeltaTimeDifference approximately = Loop1(time) - Loop2(time)
//where
Loop1(time) = Loop2(time) + (Loop2(time)*[0.6,0.7]) // approximately
// So when we substitute this back into the difference equation we end up with
DeltaTimeDifference approximately = (Loop2(time) + (Loop2(time)*[0.6,0.7])) - Loop2(time)
// And finally we can simplify this to
DeltaTimeDifference approximately = [0.6,0.7]*Loop2(time)
এই আনুমানিকতা উভয় আলগরিদমিকভাবে এবং সফ্টওয়্যার অপ্টিমাইজেশন এবং মেশিনের নির্দেশাবলী জড়িত মেশিন অপারেশনগুলির মধ্যে এই দুটি লুপের মধ্যে গড় পার্থক্য।
যখন ডেটা সেটটি রৈখিকভাবে বৃদ্ধি পায়, তখন উভয়ের মধ্যে সময়ের মধ্যে পার্থক্য থাকে। যখন অ্যালগরিদম 1 অ্যালগরিদম 2 চেয়ে বেশি নিয়ে আসে যা স্পষ্ট হয়েছে Bossমধ্যে ভ্রমণ আগে পিছে সর্বাধিক দূরত্ব রয়েছে A& Cপ্রথম পুনরাবৃত্তির পর প্রতি পুনরাবৃত্তির সময় অ্যালগরিদম 2 Bossআছে ভ্রমণ করতে Aএকবার এবং তারপর সঙ্গে সম্পন্ন হওয়ার পর Aতিনি ভ্রমণ করেছেন সর্বাধিক দূরত্ব শুধুমাত্র এক সময় যখন থেকে যাচ্ছে Aকরার C।
Bossএকই সাথে দুটি একই কাজ করার দিকে মনোযোগ কেন্দ্রীভূত করার চেষ্টা করা এবং একই ধ্রুবক ক্রিয়াকলাপের দিকে মনোনিবেশ করার পরিবর্তে সেগুলি পিছনে পিছনে জাগ্রত করা তাকে দিনের শেষের দিকে বেশ ক্রুদ্ধ করবে যেহেতু তাকে ভ্রমণ করতে হয়েছে এবং দ্বিগুণ কাজ করতে হয়েছিল। সুতরাং আপনার বসকে একটি দ্বিখণ্ডিত বাধা দেওয়াতে পরিস্থিতিটির সুযোগটি হারাবেন না কারণ বসের পত্নী এবং বাচ্চারা এর প্রশংসা করবে না।
সংশোধন: সফটওয়্যার ইঞ্জিনিয়ারিং ডিজাইনের নীতিমালা
- লুপগুলির জন্য পুনরাবৃত্তির মধ্যে Local Stackএবং Heap Allocatedগণনাগুলির মধ্যে পার্থক্য এবং তাদের ব্যবহার, তাদের দক্ষতা এবং কার্যকারিতার মধ্যে পার্থক্য -
গাণিতিক অ্যালগরিদম যেটি আমি উপরে প্রস্তাব করেছি তা মূলত লুপগুলিতে প্রযোজ্য যেগুলি হিটে বরাদ্দকৃত ডেটাতে অপারেশন করে।
- ধারাবাহিক স্ট্যাক অপারেশন:
- যদি লুপগুলি স্ট্যাক ফ্রেমের মধ্যে থাকা একটি একক কোড ব্লক বা স্কোপের মধ্যে স্থানীয়ভাবে ডেটাতে ক্রিয়াকলাপ সম্পাদন করে তবে এটি এখনও সাজানোর জন্য প্রযোজ্য হবে, তবে মেমরির অবস্থানগুলি আরও ঘনিষ্ঠ যেখানে তারা সাধারণত ক্রমযুক্ত এবং দূরত্বে ভ্রমণ বা সম্পাদনের সময় পার্থক্যের পার্থক্য প্রায় নগণ্য। যেহেতু স্তূপের মধ্যে কোনও বরাদ্দ করা হচ্ছে না, স্মৃতিটি ছড়িয়ে নেই, এবং মেমরিটি রামের মধ্য দিয়ে আনা হচ্ছে না। মেমরিটি সাধারণত স্ট্যাক ফ্রেম এবং স্ট্যাক পয়েন্টারটির সাথে ক্রমযুক্ত হয়।
- যখন স্ট্যাকের উপর ক্রমাগত অপারেশন করা হচ্ছে, একটি আধুনিক প্রসেসর পুনরাবৃত্তিযোগ্য মান এবং ঠিকানাগুলিকে স্থানীয় ক্যাশে রেজিস্টারে রেখে এই মানগুলিকে ক্যাশে করবে। এখানে অপারেশন বা নির্দেশাবলীর সময়টি ন্যানো-সেকেন্ডের ক্রম অনুসারে।
- ধারাবাহিকভাবে গাদা বরাদ্দকৃত অপারেশন:
- আপনি যখন হিপ বরাদ্দ প্রয়োগ করতে শুরু করেন এবং প্রসেসরের সিপিইউ, বাস কন্ট্রোলার এবং রাম মডিউলগুলির আর্কিটেকচারের উপর নির্ভর করে পরপর কলগুলিতে মেমরি ঠিকানাগুলি আনতে হয় এবং অপারেশন বা সম্পাদনের সময় মাইক্রো থেকে ক্রম হতে পারে মিলিসেকেন্ড। ক্যাশেড স্ট্যাক অপারেশনের তুলনায়, এগুলি বেশ ধীর slow
- সিপিইউকে রামের কাছ থেকে মেমরি ঠিকানাটি আনতে হবে এবং সাধারণত সিপিইউতে থাকা অভ্যন্তরীণ ডেটা পাথ বা ডেটা বাসের তুলনায় সিস্টেম বাসের যে কোনও কিছুই ধীর গতির হয়।
সুতরাং যখন আপনি সেই ডেটার সাথে কাজ করছেন যা গাদা হতে হবে এবং আপনি লুপগুলিতে সেগুলি অনুসরণ করছেন, প্রতিটি ডেটা সেট এবং তার সাথে সম্পর্কিত অ্যালগরিদমগুলি তার নিজস্ব একক লুপের মধ্যে রাখা আরও দক্ষ। একা লুপের মধ্যে থাকা বিভিন্ন ডেটা সেটগুলির একাধিক ক্রিয়াকলাপ রেখে একটানা লুপগুলি ফ্যাক্ট করার চেষ্টা করার তুলনায় আপনি আরও ভাল অপ্টিমাইজেশন পাবেন।
স্ট্যাকের সাথে থাকা ডেটা দিয়ে এটি করা ঠিক আছে যেহেতু তারা প্রায়শই ক্যাশে থাকে তবে এমন ডেটার জন্য নয় যা এর মেমরি ঠিকানাটি প্রতিটি পুনরাবৃত্তিতে জিজ্ঞাসা করে।
এখানেই সফ্টওয়্যার ইঞ্জিনিয়ারিং এবং সফটওয়্যার আর্কিটেকচার ডিজাইন কার্যকর হয়। আপনার ডেটা কীভাবে সংগঠিত করতে হবে তা জানার ক্ষমতা, আপনার ডেটা কখন ক্যাশে করবেন তা জেনে রাখা, কখন আপনার ডেটাটি গিমে বরাদ্দ করতে হবে তা জেনে রাখা, কীভাবে আপনার অ্যালগরিদমগুলি ডিজাইন এবং প্রয়োগ করতে হবে এবং কখন এবং কোথায় তাদের কল করতে হবে তা জানার ক্ষমতা is
আপনার একই অ্যালগরিদম হতে পারে যা একই ডেটা সেটের সাথে সম্পর্কিত, তবে আপনি তার স্ট্যাক ভেরিয়েন্টের জন্য একটি বাস্তবায়ন নকশা এবং অন্যটি তার গাদা-বরাদ্দিত ভেরিয়েন্টের জন্য কেবলমাত্র উপরের ইস্যুটির কারণেই O(n)কাজ করতে গিয়ে অ্যালগরিদমের জটিলতা থেকে দেখা যায় want গাদা দিয়ে
আমি বছরের পর বছর ধরে যা লক্ষ্য করেছি তা থেকে অনেকে এই বাস্তবতাকে বিবেচনা করে না। তারা একটি নির্দিষ্ট অ্যালগরিদম ডিজাইন করার প্রবণতা রাখবে যা কোনও নির্দিষ্ট ডেটা সেটে কাজ করে এবং তারা স্থানীয়ভাবে ডেটা সেটটিকে স্ট্যাকের উপরে ক্যাশে রেখে দেওয়া বা এটি স্তূপে বরাদ্দ করা হয়েছিল তা নির্বিশেষে তারা এটি ব্যবহার করবে।
আপনি যদি সত্য অপ্টিমাইজেশন চান তবে হ্যাঁ এটি কোড সদৃশ মনে হতে পারে তবে সাধারণকরণের জন্য একই অ্যালগোরিদমের দুটি রূপ থাকা আরও দক্ষ। একটি স্ট্যাক অপারেশনের জন্য এবং অন্যটি হিপ অপারেশনের জন্য যা পুনরাবৃত্ত লুপগুলিতে সঞ্চালিত হয়!
এখানে ছদ্ম উদাহরণ রয়েছে: দুটি সহজ স্ট্রাক্ট, একটি অ্যালগরিদম।
struct A {
int data;
A() : data{0}{}
A(int a) : data{a}{}
};
struct B {
int data;
B() : data{0}{}
A(int b) : data{b}{}
}
template<typename T>
void Foo( T& t ) {
// do something with t
}
// some looping operation: first stack then heap.
// stack data:
A dataSetA[10] = {};
B dataSetB[10] = {};
// For stack operations this is okay and efficient
for (int i = 0; i < 10; i++ ) {
Foo(dataSetA[i]);
Foo(dataSetB[i]);
}
// If the above two were on the heap then performing
// the same algorithm to both within the same loop
// will create that bottleneck
A* dataSetA = new [] A();
B* dataSetB = new [] B();
for ( int i = 0; i < 10; i++ ) {
Foo(dataSetA[i]); // dataSetA is on the heap here
Foo(dataSetB[i]); // dataSetB is on the heap here
} // this will be inefficient.
// To improve the efficiency above, put them into separate loops...
for (int i = 0; i < 10; i++ ) {
Foo(dataSetA[i]);
}
for (int i = 0; i < 10; i++ ) {
Foo(dataSetB[i]);
}
// This will be much more efficient than above.
// The code isn't perfect syntax, it's only psuedo code
// to illustrate a point.
হ'ল ভেরিয়েন্ট বনাম স্ট্যাক ভেরিয়েন্টগুলির জন্য পৃথক বাস্তবায়ন করে আমি এটি উল্লেখ করছি। অ্যালগোরিদমগুলি এগুলি খুব বেশি গুরুত্ব দেয় না, এটি লুপিং স্ট্রাকচারগুলি যা আপনি তাদের এটিতে ব্যবহার করবেন।