না, তবে হ্যাঁ, তবে অন্যভাবে হতে পারে তবে না।
লোকেরা ইতিমধ্যে চিহ্নিত করেছে, (এমন একটি ভাষা ধরে নেওয়া যেখানে সংযোজন বাম-সহযোগী, যেমন সি, সি ++, সি # বা জাভা) এক্সপ্রেশনটি ((1 + 2) + 3)
হুবহু সমান 1 + 2 + 3
। তারা সোর্স কোডে কিছু লেখার বিভিন্ন উপায়, যার ফলে ফলাফলের মেশিন কোড বা বাইট কোডের শূন্য প্রভাব পড়ে।
ফলস্বরূপ ফলাফলটি একটি নির্দেশ হতে চলেছে যেমন দুটি রেজিস্টার যুক্ত করুন এবং তারপরে তৃতীয়টি যুক্ত করুন, বা একটি স্ট্যাক থেকে দুটি মান নিন, এটি যুক্ত করুন, পিছনে চাপুন, তারপরে এটি এবং অন্যটি নিয়ে যান এবং এগুলিতে যোগ করুন বা তিনটি রেজিস্টার যুক্ত করুন একক ক্রিয়াকলাপ, বা পরবর্তী স্তরে (মেশিন কোড বা বাইট কোড) সবচেয়ে বুদ্ধিমান কিসের উপর নির্ভর করে তিনটি সংখ্যা যোগ করার জন্য অন্য কোনও উপায়। বাইট কোডের ক্ষেত্রে, ফলস্বরূপ সম্ভবত এটির সাথে একই রকম পুনর্গঠন হবে under উদাহরণস্বরূপ এর আইএল সমতুল্য (যা একটি স্ট্যাকের বোঝা একটি সিরিজ হবে, এবং জোড় জোড় যোগ করতে হবে এবং তারপরে ফলাফলটি পিছনে ঠেলে দেবে) মেশিন কোড স্তরে সেই যুক্তির সরাসরি অনুলিপি না ঘটায়, তবে প্রশ্নযুক্ত মেশিনের জন্য আরও বুদ্ধিমান কিছু।
তবে আপনার প্রশ্নের আরও কিছু আছে।
যে কোনও বুদ্ধিমান সি, সি ++, জাভা, বা সি # সংকলকের ক্ষেত্রে, আপনি যে বিবৃতি দিয়েছেন তার উভয়টির ফলাফলই ঠিক একই ফলাফল হিসাবে প্রত্যাশা করব:
int a = 6;
আক্ষরিক উপর গণিত করতে ফলাফল কোড কেন সময় নষ্ট করা উচিত? প্রোগ্রামের অবস্থায় কোন পরিবর্তন ফল করা বন্ধ করে দেবে 1 + 2 + 3
হচ্ছে 6
, যাতে এটা কি কোডে যেতে হবে মৃত্যুদন্ড কার্যকর করা হচ্ছে। প্রকৃতপক্ষে, এমনকি এটিও নয় (আপনি সেই 6টির সাথে কী করছেন তার উপর নির্ভর করে, সম্ভবত আমরা পুরো জিনিসটি ফেলে দিতে পারি; এমনকি সি # এর দর্শনের সাথে "ভারীভাবে অনুকূলিত হবেন না, যেহেতু জিটারটি যেভাবেই এটি অনুকূল করে তুলবে" হয় তা প্রকাশ করবে) এর সমতুল্য int a = 6
বা কেবল অপ্রয়োজনীয় হিসাবে পুরো জিনিসটিকে ফেলে দেয়)।
এটি যদিও আপনাকে আপনার প্রশ্নের সম্ভাব্য বর্ধনের দিকে নিয়ে যায়। নিম্নোক্ত বিবেচনা কর:
int a = (b - 2) / 2;
/* or */
int a = (b / 2)--;
এবং
int c;
if(d < 100)
c = 0;
else
c = d * 31;
/* or */
int c = d < 100 ? 0 : d * 32 - d
/* or */
int c = d < 100 && d * 32 - d;
/* or */
int c = (d < 100) * (d * 32 - d);
(দ্রষ্টব্য, এই শেষ দুটি উদাহরণ বৈধ সি # নয়, অন্যদিকে এখানে সমস্ত কিছু রয়েছে এবং সেগুলি সি, সি ++ এবং জাভাতে বৈধ)
এখানে আবার আমরা আউটপুট শর্তাবলী ঠিক সমতুল্য কোড আছে। যেহেতু এগুলি ধ্রুবক প্রকাশ নয়, সেগুলি সংকলনের সময় গণনা করা হবে না। এটি সম্ভব যে একটি ফর্ম অন্যর চেয়ে দ্রুত। কোনটি দ্রুত? এটি প্রসেসরের উপর নির্ভর করবে এবং সম্ভবত রাজ্যের কিছু বরং স্বেচ্ছাচারী পার্থক্যের উপর নির্ভর করবে (বিশেষত যেহেতু যদি কেউ দ্রুত হয় তবে এটি খুব বেশি দ্রুত হওয়ার সম্ভাবনা নেই)।
এবং এগুলি আপনার প্রশ্নের সাথে পুরোপুরি সম্পর্কিত নয়, কারণ তারা বেশিরভাগ ক্ষেত্রে ধারণাগতভাবে কিছু করা হয় এমন ক্রমের মধ্যে পার্থক্য সম্পর্কে ।
তাদের প্রত্যেকটিতে সন্দেহ হওয়ার কারণ রয়েছে যে একজনের চেয়ে অন্যটির চেয়ে দ্রুত গতি হতে পারে। একক হ্রাস একটি বিশেষায়িত নির্দেশনা (b / 2)--
থাকতে পারে , তাই সত্যিই চেয়ে দ্রুত হতে পারে (b - 2) / 2
। d * 32
সম্ভবত দ্রুত তা বাঁক দ্বারা উত্পাদিত যেতে পারে d << 5
উপার্জন তাই d * 32 - d
যতো তাড়াতাড়ি d * 31
। শেষ দুটি মধ্যে পার্থক্য বিশেষ আকর্ষণীয়; একটি কিছু ক্ষেত্রে কিছু প্রসেসিং এড়িয়ে যেতে দেয় তবে অন্যটি শাখার ভুল পূর্বাভাসের সম্ভাবনা এড়িয়ে চলে।
সুতরাং, এটি আমাদের দুটি প্রশ্ন রেখে গেছে: ১. আসলেই কি একজনের তুলনায় অন্যটি দ্রুত হয়? ২. কোনও সংকলক কি ধীর গতিতে দ্রুত রূপান্তর করবে?
এবং উত্তর 1। এটি নির্ভর করে। 2. হতে পারে।
বা প্রসারিত করতে, এটি নির্ভর করে কারণ এটি প্রশ্নে প্রসেসরের উপর নির্ভর করে। অবশ্যই সেখানে প্রসেসরের অস্তিত্ব রয়েছে যেখানে একের সাদামাটা মেশিন-কোড অপরটির সাদামাটা মেশিন-কোডের তুলনায় দ্রুততর হবে। ইলেক্ট্রনিক কম্পিউটিংয়ের ইতিহাস চলাকালীন, এর আগে কখনও দ্রুত ছিল না, (বিশেষত ব্রাঞ্চের ভুল-ভবিষ্যদ্বাণীকারী উপাদানগুলি যখন পাইপলাইনযুক্ত সিপিইউগুলি বেশি দেখা যায় তখন অনেকের সাথেই প্রাসঙ্গিক ছিল না)।
এবং সম্ভবত, কারণ বিভিন্ন অপটিমাইজেশনের একটি গুচ্ছ রয়েছে যা সংকলকগুলি (এবং জিটটারগুলি, এবং স্ক্রিপ্ট-ইঞ্জিনগুলি) করবে এবং কিছু ক্ষেত্রে কিছুটা বাধ্যতামূলক করা হতে পারে, আমরা সাধারণত যৌক্তিক সমতুল্য কোডের কিছু অংশ খুঁজে পেতে সক্ষম হব যে এমনকি সবচেয়ে নিখুঁত সংকলকটিরও ঠিক একই ফলাফল এবং কিছু যুক্তিযুক্ত সমতুল্য কোডের কিছু টুকরো রয়েছে যেখানে এমনকি সর্বাধিক পরিশীলিতরা অন্যটির চেয়ে একটির জন্য দ্রুত কোড তৈরি করে (এমনকি আমাদের পয়েন্টটি প্রমাণ করতে পুরোপুরি প্যাথলজিকাল কিছু লিখতে হবে এমনকি)।
এটি খুব ক্ষুদ্রতর অপ্টিমাইজেশান উদ্বেগের মতো বলে মনে হতে পারে,
না। আমি এখানে যা দিচ্ছি তার চেয়ে আরও জটিল পার্থক্য থাকা সত্ত্বেও এটি একেবারে এক মুহুর্তের উদ্বেগের মতো বলে মনে হচ্ছে যার অপ্টিমাইজেশানের সাথে কোনও সম্পর্ক নেই। যদি কিছু হয় তবে এটি হতাশার বিষয় যেহেতু আপনার সন্দেহ হয় যে পড়া ((1 + 2) + 3
সহজতর পড়ার চেয়ে ধীর হতে পারে 1 + 2 + 3
।
তবে সি ++ সি / জাভা / ... এর উপরে সি ++ নির্বাচন করা সর্বোত্তমতা (আইএমএইচও) about
যদি সি -+ বা জাভার উপরে সি ++ বাছাই করা সত্যই হয় তবে আমি বলতে চাই যে লোকেরা তাদের স্ট্রস্ট্রপ এবং আইএসও / আইসিসি 14882 এর অনুলিপিটি পোড়াতে পারে এবং আরও কিছু এমপি 3 বা কোনও কিছুর জন্য জায়গা ছেড়ে দেওয়ার জন্য তাদের সি ++ সংকলকটির জায়গাটি খালি করতে হবে।
এই ভাষার একে অপরের চেয়ে আলাদা সুবিধা রয়েছে advant
এর মধ্যে একটি হ'ল সি ++ মেমরির ব্যবহারে এখনও সাধারণভাবে দ্রুত এবং হালকা। হ্যাঁ, এমন কয়েকটি উদাহরণ রয়েছে যেখানে সি # এবং / বা জাভা দ্রুত এবং / অথবা মেমরির প্রয়োগের আরও বেশি সময় লাগবে এবং প্রযুক্তিগুলির উন্নতি হওয়ায় এগুলি আরও সাধারণ হয়ে উঠছে, তবে আমরা এখনও সি ++ তে লিখিত গড় প্রোগ্রামটি আশা করতে পারি একটি ছোট এক্সিকিউটেবল যা তার কাজটি দ্রুত করে এবং এই দুটি ভাষার যে কোনওটির তুলনায় কম মেমরি ব্যবহার করে।
এটি অপ্টিমাইজেশন নয়।
অপ্টিমাইজেশানটি কখনও কখনও "জিনিসগুলিকে আরও দ্রুত করা" বোঝাতে ব্যবহৃত হয়। এটি বোধগম্য, কারণ প্রায়শই যখন আমরা "অপ্টিমাইজেশন" সম্পর্কে কথা বলি তখন আমরা প্রকৃতপক্ষে জিনিসগুলিকে দ্রুততর করে তোলার বিষয়ে কথা বলি, এবং তাই একজনের পক্ষে অন্যের পক্ষে একটি শর্টহ্যান্ড হয়ে গেছে এবং আমি স্বীকার করব যে আমি এই শব্দটি নিজেই অপব্যবহার করেছি।
"জিনিসগুলি দ্রুত যেতে" এর সঠিক শব্দটি অপ্টিমাইজেশন নয় । এখানে সঠিক শব্দটি উন্নতি । আপনি যদি কোনও প্রোগ্রামে পরিবর্তন করেন এবং একমাত্র অর্থপূর্ণ পার্থক্যটি এটি এখন দ্রুত হয় তবে এটি কোনওভাবেই অনুকূলিত হয়নি, এটি আরও ভাল।
অনুকূলতা হ'ল যখন আমরা কোনও নির্দিষ্ট দিক এবং / অথবা নির্দিষ্ট ক্ষেত্রে বিবেচনা করে উন্নতি করি। সাধারণ উদাহরণগুলি হ'ল:
- এটি এখন একটি ব্যবহারের ক্ষেত্রে দ্রুত, তবে অন্যটির জন্য ধীর।
- এটি এখন দ্রুত, তবে আরও মেমরি ব্যবহার করে।
- এটি এখন মেমরির উপর হালকা তবে ধীর।
- এটি এখন দ্রুত, তবে বজায় রাখা আরও শক্ত।
- এটি রক্ষণাবেক্ষণ করা এখন সহজ তবে ধীর।
এই জাতীয় মামলাগুলি ন্যায়সঙ্গত হবে যদি, উদাহরণস্বরূপ:
- দ্রুত ব্যবহারের ক্ষেত্রে আরও সাধারণ বা আরও মারাত্মকভাবে বাধা দেওয়া শুরু হয়।
- প্রোগ্রামটি অগ্রহণযোগ্যভাবে ধীর ছিল এবং আমরা প্রচুর র্যাম মুক্ত।
- প্রোগ্রামটি একটি স্থবিরতায় গ্রাইন্ডিং ছিল কারণ এটি এত বেশি র্যাম ব্যবহার করে যা এটির সুপার-দ্রুত প্রক্রিয়াজাতকরণের চেয়ে অদলবদল করতে বেশি সময় ব্যয় করে।
- প্রোগ্রামটি অগ্রহণযোগ্যভাবে ধীর ছিল এবং কোডটি বোঝা আরও ভাল।
- প্রোগ্রামটি এখনও গ্রহণযোগ্যভাবে দ্রুত, এবং আরও বোধগম্য কোড-বেসটি বজায় রাখার জন্য কম সস্তা এবং অন্যান্য উন্নতি আরও সহজেই করার সুযোগ দেয়।
তবে, এই ধরনের ক্ষেত্রে অন্যান্য পরিস্থিতিতেও ন্যায়সঙ্গত হবে না: কোডটি নিখুঁত অবর্ণনীয় মানের দ্বারা পরিমাপের দ্বারা উন্নত করা হয়নি, এটি একটি বিশেষ ক্ষেত্রে আরও ভাল করা হয়েছে যা এটি একটি নির্দিষ্ট ব্যবহারের জন্য আরও উপযুক্ত করে তোলে; অপ্টিমাইজ করা।
ভাষা নির্বাচনের এখানে একটি প্রভাব রয়েছে, কারণ গতি, মেমরির ব্যবহার এবং পাঠযোগ্যতা সকলেই এর দ্বারা প্রভাবিত হতে পারে তবে অন্যান্য সিস্টেমের সাথে সামঞ্জস্যতা, গ্রন্থাগারের উপস্থিতি, রানটাইমের উপস্থিতি, প্রদত্ত অপারেটিং সিস্টেমে সেই রানটাইমগুলির পরিপক্কতা (আমার পাপগুলির জন্য আমি কোনওভাবেই লিনাক্স এবং অ্যান্ড্রয়েডকে আমার প্রিয় ভাষা হিসাবে ওএস ও সি # আমার প্রিয় ভাষা হিসাবে শেষ করেছি, এবং মনো যখন দুর্দান্ত, তবে আমি এখনও এইটির বিরুদ্ধে বেশ কিছুটা এগিয়ে এসেছি)।
"সি ++ এর উপরে সি # / জাভা / ... নির্বাচন করা সর্বোত্তম অনুকূলকরণ" বলার অর্থ কেবল তখনই বোধগম্য হয় যদি আপনি মনে করেন যে সি ++ সত্যই সফল হয়, কারণ অপ্টিমাইজেশনটি "সত্ত্বেও ... আরও ভাল" নয় "not আপনি যদি মনে করেন যে সি ++ নিজেই থাকা সত্ত্বেও আরও ভাল, তবে আপনার শেষ জিনিসটি হ'ল এই জাতীয় মিনিটের সম্ভাব্য মাইক্রো অপ্টগুলি সম্পর্কে চিন্তা করা উচিত। প্রকৃতপক্ষে, আপনি সম্ভবত এটিকে একেবারেই পরিত্যাগ করা ভাল; হ্যাপি হ্যাকারগুলিও এটির জন্য অনুকূলিতকরণের একটি গুণ!
তবে, যদি আপনি "আমি সি +++ পছন্দ করি এবং এটি সম্পর্কে আমি যে বিষয়গুলি পছন্দ করি তার মধ্যে একটি অতিরিক্ত চক্র নিঃসরণ করে" বলে ঝুঁকে থাকে, তবে এটি আলাদা বিষয়। এটি এখনও এমন একটি ক্ষেত্রে রয়েছে যে মাইক্রো-অপ্টগুলি কেবল তখনই তার পক্ষে মূল্যবান যখন তারা একটি রিফ্লেক্সেভ অভ্যাস হতে পারে (অর্থাৎ, আপনি যেভাবে প্রাকৃতিকভাবে কোডিংয়ের দিকে ঝোঁকেন তার ধীরের তুলনায় এটি আরও দ্রুততর হবে)। অন্যথায় তারা এমনকি অকালীন অপটিমাইজেশন নয়, তারা অকাল হতাশাবোধ যা কেবল পরিস্থিতিকে আরও খারাপ করে তোলে।