আমি মনে করি যে প্রশ্নকারীর আরও পৃথক পৃথক উত্তর দেওয়া আরও সহায়ক হবে, কারণ আমি প্রশ্নগুলিতে এবং কয়েকটি উত্তর বা মন্তব্যে বেশ কয়েকটি অব্যক্ত অনুমান দেখি।
স্থানান্তরিতকরণ এবং গুণণের ফলাফলগত আপেক্ষিক রানটাইমের সি এর সাথে কোনও সম্পর্ক নেই, যখন আমি সি বলি, আমি কোনও নির্দিষ্ট প্রয়োগের উদাহরণটি বোঝাতে চাই না, যেমন জিসিসির সেই সংস্করণ নয়, তবে ভাষাটি। আমি এই বিজ্ঞাপনটি অযৌক্তিকভাবে গ্রহণ করা বলতে চাইছি না, তবে উদাহরণের জন্য একটি চূড়ান্ত উদাহরণ ব্যবহার করা: আপনি পুরোপুরি মান মেনে চলার সি সংকলকটি প্রয়োগ করতে পারেন এবং বহুগুণে এক ঘন্টা সময় নিতে পারে, যখন স্থানান্তরটি মিলিসেকেন্ডে লাগে - বা অন্যভাবে। আমি সি বা সি ++ তে এরকম কোনও পারফরম্যান্স বিধিনিষেধ সম্পর্কে সচেতন নই।
আপনি যুক্তি দিয়ে এই প্রযুক্তি সম্পর্কে যত্ন নাও করতে পারেন। আপনার উদ্দেশ্য সম্ভবত কেবলমাত্র গুণাবলীর তুলনায় শিফ্টগুলির তুলনামূলক কর্মক্ষমতা পরীক্ষা করে দেখার জন্য এবং আপনি সি বেছে নিয়েছিলেন, কারণ এটি সাধারণত নিম্ন স্তরের প্রোগ্রামিং ভাষা হিসাবে ধরা হয়, সুতরাং কেউ তার উত্স কোডটিকে আরও সঠিকভাবে সম্পর্কিত নির্দেশগুলিতে অনুবাদ করার আশা করতে পারে। এই জাতীয় প্রশ্নগুলি খুব সাধারণ এবং আমি মনে করি যে একটি উত্তরের উত্তরটি উল্লেখ করা উচিত যে সিতেও আপনার উত্স কোডটি কোনও নির্দিষ্ট ক্ষেত্রে যেমন ভাবতে পারে ঠিক তেমন নির্দেশাবলীতে অনুবাদ করে না। আমি আপনাকে নীচে কয়েকটি সংকলনের ফলাফল দিয়েছি।
এই জায়গাতেই এমন মন্তব্যগুলি আসল-বিশ্বের সফ্টওয়্যারটিতে এই সমতাটি স্থাপনের প্রয়োজনীয়তা নিয়ে প্রশ্ন আসে You এটি সাধারণত এই ধরণের অপ্টিমাইজেশনের প্রতিক্রিয়ায় আরও পাকা প্রকৌশলীদের কাছ থেকে পাবেন প্রতিক্রিয়াটির সাথে সামঞ্জস্য। আপনি যদি প্রোডাকশন কোডে বাইনারি শিফটগুলি গুণ এবং বিভাজনের একটি কম্বল উপায় হিসাবে ব্যবহার করেন, লোকেরা সম্ভবত আপনার কোডটি কুঁচকে যাবে এবং কিছুটা সংবেদনশীল প্রতিক্রিয়া অর্জন করবে ("আমি স্বর্গের জন্য জাভাস্ক্রিপ্ট সম্পর্কে এই অযৌক্তিক দাবিটি শুনেছি।") নবজাতক প্রোগ্রামারদের জন্য এটি অর্থবোধ করতে পারে না, যদি না তারা এই প্রতিক্রিয়ার কারণগুলি আরও ভালভাবে বুঝতে পারে।
এই কারণগুলি হ'ল এইরকম অপ্টিমাইজেশনের হ্রাসযোগ্য পাঠযোগ্যতা এবং নিরর্থকতার সংমিশ্রণ, কারণ আপনি ইতিমধ্যে তাদের আপেক্ষিক পারফরম্যান্সের তুলনা করে খুঁজে পেয়েছেন। তবে, আমি মনে করি না যে লোকেরা যদি এই গুণাবলীর পরিবর্তনের একমাত্র উদাহরণ যেমন অপটিমাইজেশনের উদাহরণ হত তবে লোকেরা তার প্রতিক্রিয়ার মতো তীব্র প্রতিক্রিয়া প্রকাশ করবে। আপনার মত প্রশ্নগুলি প্রায়শই বিভিন্ন আকারে এবং বিভিন্ন প্রসঙ্গে আসে। আমি মনে করি যে আরও সিনিয়র ইঞ্জিনিয়াররা আসলে এত দৃ strongly়তার সাথে কী প্রতিক্রিয়া দেখায়, কমপক্ষে আমার মাঝে মাঝে ছিল তা হ'ল লোকেরা কোড বেস জুড়ে এই ধরনের মাইক্রো-অপ্টিমাইজেশানকে উদারভাবে নিযুক্ত করলে ক্ষতির আরও বিস্তৃত ক্ষতির সম্ভাবনা রয়েছে। যদি আপনি মাইক্রোসফ্টের মতো কোনও সংস্থায় একটি বৃহত কোড বেসে কাজ করেন তবে আপনি অন্যান্য ইঞ্জিনিয়ারদের সোর্স কোড পড়তে বা এতে নির্দিষ্ট কোড সনাক্ত করার চেষ্টা করতে অনেক সময় ব্যয় করবেন। এটি এমনকি আপনার নিজের কোডও হতে পারে যা আপনি কয়েক বছরের সময়কে বোঝার চেষ্টা করবেন, বিশেষত অতিমাত্রায় কিছু সময় ব্যয় করা, যেমন যখন পেজারে থাকার পরে আপনি যখন কল পেয়েছিলেন তখন আপনাকে কোনও প্রোডাক্ট আউটেজ ঠিক করতে হবে when শুক্রবার রাতে ডিউটি, বন্ধুদের সাথে এক মজার রাতে বেরিয়ে যাবার জন্য ... আপনি কোডটি পড়ার জন্য যদি এতটা সময় ব্যয় করেন তবে আপনি এটি যথাসম্ভব পঠনযোগ্য হওয়ার প্রশংসা করবেন। আপনার প্রিয় উপন্যাসটি পড়ার কল্পনা করুন, তবে প্রকাশক তারা নতুন সংস্করণ প্রকাশের সিদ্ধান্ত নিয়েছে যেখানে তারা abbrv ব্যবহার করে। সমস্ত ডিম্বপ্রাণ পিএলসি বিসিএস আপনার থানক এটি এসসিএস। এটি অন্য ইঞ্জিনিয়ারদের আপনার কোডের প্রতিক্রিয়াগুলির অনুরূপ, যদি আপনি তাদের এই জাতীয় অনুকূলিতকরণগুলি ছড়িয়ে দেন। অন্যান্য উত্তরগুলি যেমন নির্দেশ করেছে, আপনি কী বোঝাতে চেয়েছেন তা পরিষ্কার করে বলা ভাল,
এমনকি সেই পরিবেশগুলিতে, যদিও আপনি নিজেকে একটি সাক্ষাত্কারের প্রশ্নটি সমাধান করতে পারেন যেখানে আপনি এই বা অন্য কোনও সমতাটি জানেন are এগুলি জানা খারাপ নয় এবং একজন ভাল ইঞ্জিনিয়ার বাইনারি স্থানান্তরিতের পাটিগণিতের প্রভাব সম্পর্কে সচেতন হন। মনে রাখবেন যে আমি এটি বলিনি যে এটি একটি ভাল প্রকৌশলী তৈরি করে, তবে একজন ভাল প্রকৌশলী আমার মতামত জানতে পারে। বিশেষত, আপনি এখনও এমন কোনও ম্যানেজার পেতে পারেন, সাধারণত আপনার সাক্ষাত্কারের লুপের শেষ দিকে, যিনি আপনাকে কোনও কোডিং প্রশ্নে এই স্মার্ট ইঞ্জিনিয়ারিং "কৌশল" প্রকাশের জন্য আনন্দের প্রত্যাশায় বিস্তৃতভাবে আপনার দিকে ঝুঁকবেন এবং প্রমাণ করবেন যে সে / সে এছাড়াও, একজন সচেতন প্রকৌশলী হিসাবে থাকতেন বা হতেন এবং একজন "পরিচালক" নন। এই পরিস্থিতিতে, কেবল মুগ্ধ হওয়ার চেষ্টা করুন এবং আলোকিত সাক্ষাত্কারের জন্য তাকে ধন্যবাদ জানাই।
কেন আপনি সি তে গতির পার্থক্য দেখেন নি? সম্ভবত উত্তরটি হ'ল এটি উভয়ই একই সমাবেশ কোডের ফলস্বরূপ:
int shift(int i) { return i << 2; }
int multiply(int i) { return i * 2; }
উভয় মধ্যে সংকলন করতে পারেন
shift(int):
lea eax, [0+rdi*4]
ret
জিসিসিতে অপ্টিমাইজেশন ছাড়াই, অর্থাত্ "-O0" পতাকাটি ব্যবহার করে আপনি এটি পেতে পারেন:
shift(int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
mov eax, DWORD PTR [rbp-4]
sal eax, 2
pop rbp
ret
multiply(int):
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], edi
mov eax, DWORD PTR [rbp-4]
add eax, eax
pop rbp
ret
আপনি দেখতে পাচ্ছেন, জিসিসিতে "-O0" পাস করার অর্থ এই নয় যে এটি কী ধরণের কোড তৈরি করে তা কিছুটা স্মার্ট হবে না। বিশেষত, খেয়াল করুন যে এমনকি এই ক্ষেত্রেও সংকলকটি একটি বহুগুণ নির্দেশাবলীর ব্যবহার এড়িয়ে চলে। আপনি একই সংখ্যাটি অন্য সংখ্যার শিফট এবং এমন দুটি সংখ্যার দ্বারা গুণনের ক্ষেত্রেও পুনরাবৃত্তি করতে পারেন যা দুটির শক্তি নয়। সম্ভাবনাগুলি হ'ল আপনার প্ল্যাটফর্মে আপনি শিফট এবং সংযোজনগুলির সংমিশ্রণ দেখতে পাবেন তবে কোনও গুণফল নেই। সংকলকটি স্পষ্টতই সেই সমস্ত ক্ষেত্রে গুণগুলি ব্যবহার এড়ানোর জন্য এটি একটি কাকতালীয় মত বলে মনে হচ্ছে যদি গুণ এবং শিফটে সত্যই একই ব্যয় হয়, তাই না? তবে আমি প্রমাণের জন্য অনুমান সরবরাহ করার অর্থ নয়, তাই আসুন আমরা এগিয়ে যাই।
আপনি উপরের কোডটি দিয়ে আপনার পরীক্ষাটি পুনরায় চালু করতে পারেন এবং দেখতে পান যে আপনি এখন একটি গতির পার্থক্য লক্ষ্য করছেন। তারপরেও আপনি শিফ্ট বনাম গুনটির পরীক্ষা করছেন না, যেমন আপনি কোনও গুণনের অনুপস্থিতিতে দেখতে পাচ্ছেন, তবে যে কোডটি জিসিসির দ্বারা শিফ্টের সি ক্রিয়াকলাপের জন্য নির্দিষ্ট একটি পতাকা দিয়ে তৈরি করা হয়েছিল এবং একটি নির্দিষ্ট উদাহরণে গুণিত হবে । সুতরাং, অন্য পরীক্ষায় আপনি অ্যাসেম্বলি কোডটি হাত দ্বারা সম্পাদনা করতে পারেন এবং পরিবর্তে "গুণ" পদ্ধতিতে কোডটিতে একটি "ইমুল" নির্দেশ ব্যবহার করতে পারেন।
আপনি যদি সংকলকের সেই কয়েকটি স্মার্টকে পরাভূত করতে চেয়েছিলেন তবে আপনি আরও সাধারণ শিফট এবং গুণক পদ্ধতিটি সংজ্ঞায়িত করতে পারেন এবং এরকম কিছু দিয়ে শেষ করবেন:
int shift(int i, int j) { return i << j; }
int multiply(int i, int j) { return i * j; }
যা নিম্নলিখিত সমাবেশ কোড উত্পন্ন করতে পারে:
shift(int, int):
mov eax, edi
mov ecx, esi
sal eax, cl
ret
multiply(int, int):
mov eax, edi
imul eax, esi
ret
এখানে অবশেষে আমরা পেয়েছি, এমনকি জিসিসি ৪.৯-এর সর্বোচ্চ অপ্টিমাইজেশন স্তরেও, আপনি যখন প্রাথমিকভাবে আপনার পরীক্ষাটি শুরু করেছিলেন তখন সমাবেশ নির্দেশাবলীতে আপনি যে ধারণাটি প্রত্যাশা করেছিলেন তা প্রকাশ পেতে পারে। আমি মনে করি যে নিজেই পারফরম্যান্স অপটিমাইজেশনের একটি গুরুত্বপূর্ণ পাঠ হতে পারে। আমাদের কোডটিতে কংক্রিটের ধ্রুবকগুলির জন্য পরিবর্তকের পরিবর্তনে এটি তৈরি করা পার্থক্যটি আমরা দেখতে পাই, সংকলক প্রয়োগ করতে সক্ষম স্মার্টগুলির ক্ষেত্রে। শিফ্ট-মাল্টিপল প্রতিস্থাপনের মতো মাইক্রো-অপ্টিমাইজেশানগুলি হ'ল কিছু নিম্ন-স্তরের অপ্টিমাইজেশন যা সাধারণত কোনও সংকলক সহজেই নিজের দ্বারা করতে পারে do অন্যান্য অপ্টিমাইজেশানগুলি যা কার্য সম্পাদনে আরও বেশি প্রভাবিত হয় সেগুলির একটি বোঝার প্রয়োজন কোডের উদ্দেশ্য সম্পর্কেএটি প্রায়শই সংকলক দ্বারা অ্যাক্সেসযোগ্য হয় না বা কেবল কিছু হিউরিস্টিক দ্বারা অনুমান করা যায়। আপনি এখানে সফ্টওয়্যার ইঞ্জিনিয়ার হিসাবে এসেছেন এবং এটি অবশ্যই সাধারণত শিফ্টের সাথে গুণকে প্রতিস্থাপন করে না। এটিতে এমন কোনও পরিষেবাদির জন্য অনর্থক কল এড়ানো যেমন I / O উত্পাদন করে এবং কোনও প্রক্রিয়া অবরুদ্ধ করতে পারে তার সাথে জড়িত। আপনি যদি আপনার হার্ডডিস্কে বা godশ্বর নিষেধ করেন তবে কিছু অতিরিক্ত ডেটার জন্য রিমোট ডাটাবেসে আপনি ইতিমধ্যে স্মৃতিতে যা পেয়েছেন তা থেকে উত্পন্ন হতে পারে, আপনি অপেক্ষা করার সময়টি মিলিয়ন নির্দেশাবলীর কার্যকারিতা ছাড়িয়ে যায় we এখন, আমি মনে করি আমরা আপনার মূল প্রশ্ন থেকে কিছুটা দূরে সরে এসেছি, তবে আমি মনে করি এটি একটি প্রশ্নকারীর দিকে ইঙ্গিত করা হয়েছে, বিশেষত যদি আমরা মনে করি যে কেউ সবেই কোডটির অনুবাদ এবং সম্পাদনের বিষয়ে উপলব্ধি অর্জন করতে শুরু করেছে,
তাহলে, কোনটি দ্রুত হবে? আমি মনে করি এটি একটি ভাল পদ্ধতির যা আপনি প্রকৃতপক্ষে পারফরম্যান্সের পার্থক্য পরীক্ষা করার জন্য বেছে নিয়েছিলেন। সাধারণভাবে কিছু কোড পরিবর্তনের রানটাইম পারফরম্যান্স দ্বারা অবাক হওয়া সহজ। এমন অনেক কৌশল রয়েছে যা আধুনিক প্রসেসর নিয়োগ করে এবং সফ্টওয়্যারগুলির মধ্যে মিথস্ক্রিয়াও জটিল হতে পারে। এমনকি যদি কোনও পরিস্থিতিতে নির্দিষ্ট পরিবর্তনের জন্য আপনার উপকারী কার্যকারিতা ফলাফল পাওয়া উচিত, তবে আমি মনে করি যে এই ধরণের পরিবর্তনটি সর্বদা পারফরম্যান্স বেনিফিট অর্জন করবে এই সিদ্ধান্তে নেওয়া বিপজ্জনক। আমি মনে করি যে এই জাতীয় পরীক্ষাগুলি একবার চালানো বিপজ্জনক, বলুন "ঠিক আছে, এখন আমি জানি কোনটি দ্রুত!" এবং তারপরে নির্বিচারে আপনার পরিমাপ পুনরাবৃত্তি না করে উত্পাদন কোডে একই অপটিমাইজেশন প্রয়োগ করুন।
তাহলে শিফটটি যদি গুণণের চেয়ে দ্রুত হয়? কেন এটি সত্য হবে ইঙ্গিত অবশ্যই আছে। জিসিসি, যেমন আপনি উপরে দেখতে পারেন, মনে হয় (এমনকি অপ্টিমাইজেশন ছাড়াই) মনে হয় যে অন্যান্য নির্দেশাবলীর পক্ষে সরাসরি গুণকে এড়ানো একটি ভাল ধারণা। ইন্টেল 64 এবং IA-32 আর্কিটেকচারের অপ্টিমাইজেশান রেফারেন্স ম্যানুয়াল আপনি CPU- র নির্দেশাবলী আপেক্ষিক খরচ একটি ধারণা দিতে হবে। আর একটি সংস্থান, নির্দেশের ল্যাটেন্সি এবং থ্রুপুট সম্পর্কে আরও বেশি কেন্দ্রীভূত হ'ল http://www.agner.org/optimize/in تعمیر_tables.pdf। মনে রাখবেন যে তারা নিখুঁত রানটাইমের পূর্বাভাসকারী নয়, তবে একে অপরের সাথে সম্পর্কিত নির্দেশাবলীর কার্যকারিতা। কড়া লুপে, যেমন আপনার পরীক্ষাটি অনুকরণ করছে, "থ্রুপুট" এর মেট্রিকটি সবচেয়ে প্রাসঙ্গিক হওয়া উচিত। প্রদত্ত নির্দেশনা কার্যকর করার সময় এটি একটি চক্রের সংখ্যা যা সাধারণত একটি কার্যকরকরণ ইউনিট বেঁধে দেওয়া হয়।
তাহলে শিফটটি গুণণের চেয়ে দ্রুত না হলে কী হবে? যেমন আমি আগেই বলেছি, আধুনিক স্থাপত্যগুলি বেশ জটিল হতে পারে এবং শাখার পূর্বাভাস, ক্যাশিং, পাইপলাইনিং এবং সমান্তরাল এক্সিকিউশন ইউনিটগুলির মতো জিনিসগুলি সময়ে সময়ে দুটি লজিক্যালি সমতুল্য টুকরাগুলির আপেক্ষিক কার্য সম্পাদনকে ভবিষ্যদ্বাণী করা কঠিন করে তুলতে পারে। আমি সত্যিই এটির উপর জোর দিতে চাই, কারণ এখান থেকেই আমি এই জাতীয় প্রশ্নের সুনির্দিষ্ট জবাব এবং জনগণের শিবিরের সাথে পুরোপুরি খুশী নই যে একেবারে সত্য (আর) নয় যে স্থানান্তরটি গুণণের চেয়ে দ্রুত।
না, যতদূর আমি অবগত যে আমরা 1970 এর দশকে কিছু গোপন ইঞ্জিনিয়ারিং সস উদ্ভাবন করি নি বা যখনই হঠাৎ করে একটি গুণক ইউনিট এবং কিছুটা শিফটারের ব্যয়ের পার্থক্যটি বাতিল করতে পারি। লজিক্যাল গেটগুলির ক্ষেত্রে এবং অবশ্যই লজিকাল অপারেশনের ক্ষেত্রে একটি সাধারণ গুণ, অনেকগুলি স্থাপত্যে বহু পরিস্থিতিতে ব্যারেল শিফ্টার স্থানান্তর চেয়ে আরও জটিল। এটি কীভাবে একটি ডেস্কটপ কম্পিউটারে সামগ্রিক রানটাইমের অনুবাদ করে কিছুটা অস্বচ্ছ হতে পারে। সেগুলি নির্দিষ্ট প্রসেসরে কীভাবে প্রয়োগ করা হয় তা আমি নিশ্চিতভাবে জানি না, তবে এখানে একটি গুণটির ব্যাখ্যা রয়েছে: আধুনিক সিপিইউতে যোগের সাথে পূর্ণসংখ্যার গুণটি কি একই গতি?
যদিও এখানে ব্যারেল শিফটারের ব্যাখ্যা রয়েছে । পূর্ববর্তী অনুচ্ছেদে আমি যে নথিগুলি রেফারেন্স করেছি সেগুলি সিপিইউ নির্দেশাবলীর প্রক্সি দ্বারা অপারেশনগুলির তুলনামূলক ব্যয় সম্পর্কে অন্য দৃষ্টিভঙ্গি দেয়। ইন্টেল-এ থাকা প্রকৌশলীরা প্রায়শই একই জাতীয় প্রশ্ন পেতে পারে বলে মনে হয়: পূর্ণসংখ্যার গুণিতকরণের জন্য इंटেল বিকাশকারী অঞ্চল ফোরাম ক্লক চক্র এবং মূল 2 যুগল প্রসেসরের সংযোজন
হ্যাঁ, বেশিরভাগ বাস্তব-জীবনের পরিস্থিতিতে এবং প্রায় অবশ্যই জাভাস্ক্রিপ্টে, পারফরম্যান্সের জন্য এই সমতাটি কাজে লাগানোর চেষ্টা সম্ভবত একটি নিরর্থক উদ্যোগ। তবে, এমনকি আমরা যদি গুণনের নির্দেশাবলী ব্যবহার করতে বাধ্য করি এবং রান-টাইমে কোনও পার্থক্য না দেখি, এটি আমাদের ব্যবহৃত ব্যয় মেট্রিকের প্রকৃতির কারণে সুনির্দিষ্ট হতে পারে, এবং ব্যয়ের কোনও পার্থক্য নেই বলেই নয়। এন্ড-টু-এন্ড রানটাইমটি একটি মেট্রিক এবং এটি যদি কেবল আমাদের যত্ন নেওয়া হয় তবে সবকিছু ঠিক আছে। তবে এর অর্থ এই নয় যে গুণ এবং স্থানান্তরিতকরণের মধ্যে সমস্ত ব্যয়ের পার্থক্য কেবল অদৃশ্য হয়ে গেছে। এবং আমি মনে করি যে এই ধারণাটি কোনও প্রশ্নকারীর কাছে জড়িত বা অন্যথায়, এই ধারণাটি পৌঁছে দেওয়ার পক্ষে অবশ্যই সঠিক ধারণা নয় যা স্পষ্টতই কেবল আধুনিক কোডের রান-টাইম এবং ব্যয়ের সাথে জড়িত উপাদানগুলির একটি ধারণা পেতে শুরু করেছে। ইঞ্জিনিয়ারিং সর্বদা ট্রেড অফ সম্পর্কে। অনুসন্ধানকারীরা এবং আধুনিক প্রসেসরগুলি কার্যকর করার সময়টি কার্যকর করার সময় কীভাবে ট্রেড অফস ব্যবহার করেছে তা ব্যবহারকারীরা হিসাবে দেখা শেষ হওয়ার পরে আমরা আরও বিচিত্র উত্তর পেতে পারি। এবং আমি মনে করি "যদি এটি কেবলমাত্র প্রকৃত হয় না" এর চেয়ে আরও আলাদা উত্তর পাওয়া যায় তবে আমরা যদি কম ইঞ্জিনিয়ারদের মাইক্রো-অপ্টিমাইজড কোডটি পাঠযোগ্যতা অপসারণের পরীক্ষা করতে দেখতে চাই তবে এটি "অপ্টিমাইজেশন" এর প্রকৃতির আরও সাধারণ বোঝার দরকার পড়ে তারিখের বাইরে কিছু নির্দিষ্ট উদাহরণকে উল্লেখ না করে এর বিভিন্ন, বিভিন্ন অবতার স্পট করুন।