মনে রাখবেন যে নিম্নলিখিতটি কেবল নেটিভ এবং জেআইটি সংকলনের মধ্যে পার্থক্য তুলনা করে এবং কোনও নির্দিষ্ট ভাষা বা ফ্রেমওয়ার্কের বিশদটি আবরণ করে না। এর বাইরে কোনও নির্দিষ্ট প্ল্যাটফর্ম বেছে নেওয়ার বৈধ কারণ থাকতে পারে।
আমরা যখন দাবি করি যে নেটিভ কোডটি দ্রুততর, আমরা জাইটি সংকলিত কোড বনাম স্থানীয়ভাবে সংকলিত কোডের সাধারণ ব্যবহারের ক্ষেত্রে কথা বলছি , যেখানে একটি জেআইটি সংকলিত অ্যাপ্লিকেশনটির সাধারণ ব্যবহারটি তাত্ক্ষণিক ফলাফল সহ ব্যবহারকারী দ্বারা চালিত করা হবে (যেমন, না প্রথমে সংকলকের অপেক্ষায়)। সেক্ষেত্রে, আমি মনে করি না যে কেউ সোজা মুখের সাথে দাবি করতে পারে, যে জেআইটি সংকলিত কোডটি স্থানীয় কোডের সাথে মেলে বা বিট করতে পারে।
ধরে নেওয়া যাক আমাদের কিছু প্রোগ্রাম এক্স ভাষায় লিখিত একটি প্রোগ্রাম রয়েছে এবং আমরা এটি একটি দেশীয় সংকলক এবং আবার জেআইটি সংকলক দিয়ে সংকলন করতে পারি। প্রতিটি কাজের প্রবাহে একই পদক্ষেপ জড়িত থাকে, যা (কোড -> মধ্যবর্তী প্রতিনিধিত্ব -> মেশিন কোড -> সম্পাদন) হিসাবে সাধারণীকরণ করা যায়। দুটির মধ্যে বড় পার্থক্য হ'ল কোন ধাপটি ব্যবহারকারী দ্বারা দেখা হয় এবং কোনটি প্রোগ্রামার দ্বারা দেখা হয়। নেটিভ সংকলন সহ, প্রোগ্রামার এক্সিকিউশন স্টেজ ব্যতীত অন্য সব দেখতে পাবে, তবে জেআইটি সলিউশন সহ, মেশিন কোডের সংকলনটি ব্যবহারকারীর দ্বারা এক্সিকিউশন ছাড়াও দেখা যায়।
দাবিটি যে এ-বি চেয়ে দ্রুততর হয় প্রোগ্রামটি চালানোর জন্য নেওয়া সময়ের কথা উল্লেখ করে যা ব্যবহারকারী দেখেছে । যদি আমরা ধরে নিই যে উভয় কোডের টুকরোগুলি এক্সিকিউশন পর্যায়ে একইরূপে সঞ্চালিত হয়, আমাদের অবশ্যই ধরে নিতে হবে যে JIT এর কাজ প্রবাহটি ব্যবহারকারীটির চেয়ে ধীর গতিতে রয়েছে, কারণ তাকে অবশ্যই মেশিন কোডে সংকলনের সময় T দেখতে হবে, যেখানে T> ০. সুতরাং , ব্যবহারকারীর কাছে দেশীয় কাজের প্রবাহের মতো কাজ করার জন্য জেআইটি কাজের প্রবাহের যে কোনও সম্ভাবনার জন্য, আমাদের অবশ্যই কোডটির নির্বাহের সময় হ্রাস করতে হবে, যেমন মেশিন কোডে এক্সিকিউশন + সংকলন কেবল এক্সিকিউশন পর্যায়ে কম হয় নেটিভ কাজ প্রবাহ। এর অর্থ আমাদের দেশীয় সংকলনের চেয়ে JIT সংকলনে কোডটি আরও ভাল করতে হবে optim
এটি তবে অপরিহার্য, যেহেতু এক্সিকিউশনকে গতি বাড়ানোর জন্য প্রয়োজনীয় অপ্টিমাইজেশানগুলি সম্পাদন করার জন্য, আমাদের অবশ্যই মেশিন কোডের পর্যায়ে সংকলনে আরও বেশি সময় ব্যয় করতে হবে, এবং এইভাবে, অপ্টিমাইজড কোডের ফলাফল হিসাবে আমরা যে কোনও সময় সংরক্ষণ করি তা আসলে হারিয়ে যায়, আমরা এটি সংকলন যোগ। অন্য কথায়, একটি জেআইটি ভিত্তিক সমাধানের "স্লোথনেস" কেবলমাত্র জেআইটি সংকলনের জন্য যুক্ত সময় নয়, তবে সেই সংকলনের দ্বারা উত্পন্ন কোডটি একটি দেশীয় সমাধানের চেয়ে ধীর সম্পাদন করে।
আমি একটি উদাহরণ ব্যবহার করব: বরাদ্দ নিবন্ধন করুন। যেহেতু মেমরি অ্যাক্সেস রেজিস্টার অ্যাক্সেসের চেয়ে কয়েক হাজার গুণ কম ধীরে, আমরা আদর্শভাবে যেখানেই সম্ভব রেজিস্টারগুলি ব্যবহার করতে চাই এবং যতটা সম্ভব মেমরির অ্যাক্সেস পেতে পারি তবে আমাদের সীমিত সংখ্যক রেজিস্ট্রার রয়েছে, এবং আমাদের যখন প্রয়োজন তখন আমাদের মেমরির মধ্যে রাজ্য ছড়িয়ে দিতে হবে একটি রেজিস্টার যদি আমরা একটি রেজিস্টার বরাদ্দকরণ অ্যালগরিদম ব্যবহার করি যা গণনা করতে 200 মিমি লাগে, এবং ফলস্বরূপ আমরা কার্যকর করতে 2 মিমি সঞ্চয় করি - আমরা একটি জেআইটি সংকলকটির জন্য সময়ের সেরা ব্যবহার করছি না। চাইটিনের অ্যালগরিদমের মতো সমাধান, যা অত্যন্ত অনুকূলিত কোড তৈরি করতে পারে তা অনুপযুক্ত।
জেআইটি সংকলকের ভূমিকা হ'ল সংকলনের সময় এবং উত্পাদিত কোডের মানের মধ্যে সেরা ভারসাম্য রক্ষা করা, তবে, দ্রুত সংকলনের সময় বড় পক্ষপাত সহ, যেহেতু আপনি ব্যবহারকারীকে অপেক্ষা করতে চান না। কোডটি কার্যকর করা কোডটি পারফরম্যান্স জেআইটি ক্ষেত্রে ধীর, কারণ নেটিভ সংকলক কোডটি অনুকূলকরণের ক্ষেত্রে সময় দ্বারা আবদ্ধ (বেশি) সীমাবদ্ধ নয়, তাই সেরা অ্যালগরিদমগুলি ব্যবহার করতে মুক্ত is কোনও জেআইটি সংকলকটির সামগ্রিক সংকলন + সম্পাদন কেবল দেশীয় সংকলিত কোডের জন্য কার্যকর করার সময়কে কার্যকর করতে পারে।
তবে আমাদের ভিএমগুলি কেবল জেআইটি সংকলনের মধ্যে সীমাবদ্ধ নয়। তারা সামনের সময়ের সংকলন কৌশল, ক্যাশিং, হট অদলবদল এবং অভিযোজিত অপ্টিমাইজেশন নিয়োগ করে। সুতরাং আসুন আমরা আমাদের দাবিটি পরিমার্জন করি যে ব্যবহারকারীটি যা দেখায় তা হ'ল এবং প্রোগ্রামটি কার্যকর করার জন্য নেওয়া সময়ের মধ্যে সীমাবদ্ধ করে (ধরে নিন যে আমরা এওটি সংকলন করেছি)। আমরা কার্যকরভাবে কোডটি দেশীয় সংকলকের সমতুল্য করতে পারি (বা সম্ভবত আরও ভাল?) ভিএমগুলির জন্য একটি বড় দাবি হ'ল তারা আরও ভাল মানের কোড তৈরি করতে সক্ষম হতে পারে তবে একটি নেটিভ সংকলক, কারণ এতে আরও তথ্যের অ্যাক্সেস থাকে - চলমান প্রক্রিয়া যেমন যেমন কোনও নির্দিষ্ট ফাংশন কতবার কার্যকর হতে পারে। ভিএম তারপরে হট অদলবদলের মাধ্যমে সর্বাধিক প্রয়োজনীয় কোডটিতে অভিযোজিত অপ্টিমাইজেশন প্রয়োগ করতে পারে।
যদিও এই যুক্তি নিয়ে একটি সমস্যা আছে - এটি ধরে নিয়েছে যে প্রোফাইল-গাইডেন্সড অপটিমাইজেশন এবং এর মতো ভিএমএসের কাছে অনন্য কিছু, যা সত্য নয়। আমরা এটিকে দেশীয় সংকলনেও প্রয়োগ করতে পারি - প্রোফাইল প্রয়োগের সক্ষম সহ আমাদের অ্যাপ্লিকেশনটি সংকলন করে, তথ্য রেকর্ডিং করে এবং সেই প্রোফাইলটি দিয়ে অ্যাপ্লিকেশনটি পুনরায় সংকলন করে। সম্ভবত এটি উল্লেখ করার মতো মূল্য হ'ল কোড হট অদলবদল এমন কিছু নয় যা কেবল একটি জেআইটি সংকলকই করতে পারে, আমরা এটি স্থানীয় কোডের জন্যই করতে পারি - যদিও এটি করার জন্য জেআইটি ভিত্তিক সমাধানগুলি আরও সহজলভ্য, এবং বিকাশকারীর পক্ষে আরও সহজ। সুতরাং বড় প্রশ্নটি হ'ল: কোনও ভিএম আমাদের এমন কিছু তথ্য সরবরাহ করতে পারে যা দেশী সংকলন করতে পারে না, যা আমাদের কোডের কার্যকারিতা বাড়িয়ে তুলতে পারে?
আমি নিজে এটি দেখতে পাচ্ছি না। আমরা একটি সাধারণ ভিএম এর বেশিরভাগ কৌশলগুলি নেটিভ কোডেও প্রয়োগ করতে পারি - যদিও প্রক্রিয়াটি আরও জড়িত। একইভাবে, আমরা নেটিভ সংকলকের যেকোনও অপ্টিমাইজেশানটি কোনও ভিএম-তে ফিরে যেতে পারি যা এওটি সংকলন বা অভিযোজিত অপ্টিমাইজেশান ব্যবহার করে। বাস্তবতাটি হ'ল স্থানীয়ভাবে চালিত কোডের মধ্যে পার্থক্য এবং ভিএম-তে যে রান হয় তা আমাদের বিশ্বাস করার মতো বড় নয়। চূড়ান্তভাবে তারা একই ফলাফলের দিকে নিয়ে যায়, তবে তারা সেখানে পৌঁছানোর জন্য পৃথক পদ্ধতি গ্রহণ করে। ভিএম অপ্টিমাইজড কোড তৈরি করতে পুনরাবৃত্তি পদ্ধতির ব্যবহার করে, যেখানে দেশীয় সংকলক এটি শুরু থেকেই আশা করে (এবং পুনরাবৃত্ত পদ্ধতির সাহায্যে উন্নত করা যেতে পারে)।
একজন সি ++ প্রোগ্রামার যুক্তিযুক্ত হতে পারে যে তাকে গেট-গো থেকে অপ্টিমাইজেশন প্রয়োজন, এবং কোনও ভিএম-র জন্য কীভাবে কীভাবে করা যায় তা নির্ধারণ করার জন্য অপেক্ষা করা উচিত নয় if যদিও এটি সম্ভবত আমাদের বর্তমান প্রযুক্তির একটি বৈধ পয়েন্ট, কারণ আমাদের ভিএমগুলিতে অপ্টিমাইজেশনের বর্তমান স্তরটি দেশীয় কম্পাইলাররা যা দিতে পারে তার চেয়ে নিকৃষ্ট - তবে আমাদের ভিএমগুলিতে এওটি সমাধানগুলি উন্নত করা ইত্যাদি যদি সর্বদা এটি না হয় etc.