প্রথমত, বেশিরভাগ জেভিএমগুলিতে একটি সংকলক অন্তর্ভুক্ত থাকে, সুতরাং "ব্যাখ্যা করা বাইটকোড" আসলে বেশ বিরল (কমপক্ষে বেঞ্চমার্ক কোডে - এটি বাস্তব জীবনে তেমন বিরল নয়, যেখানে আপনার কোড সাধারণত কয়েকটি তুচ্ছ লুপের চেয়ে বেশি হয় যা প্রায়শই পুনরাবৃত্তি হয় get )।
দ্বিতীয়ত, জড়িত বেশিরভাগ মানদণ্ডগুলি বেশ পক্ষপাতদুষ্ট বলে মনে হয় (উদ্দেশ্য বা অক্ষমতা দ্বারা, আমি সত্যিই বলতে পারি না)। উদাহরণস্বরূপ, কয়েক বছর আগে আমি পোস্ট করেছি যে কোনও লিঙ্ক থেকে লিঙ্কযুক্ত কিছু উত্স কোডের দিকে তাকিয়েছিলাম। এটির মতো কোড ছিল:
init0 = (int*)calloc(max_x,sizeof(int));
init1 = (int*)calloc(max_x,sizeof(int));
init2 = (int*)calloc(max_x,sizeof(int));
for (x=0; x<max_x; x++) {
init2[x] = 0;
init1[x] = 0;
init0[x] = 0;
}
যেহেতু calloc
ইতিমধ্যে শূন্যযুক্ত মেমরি সরবরাহ করে তাই for
লুপটিকে আবার শূন্য করতে ব্যবহার করা অবশ্যই অব্যর্থ। এটি (অন্যথায় যদি মেমোরি পরিবেশন করে) অন্য ডেটা দিয়ে মেমরিটি পূরণ করে (এবং এটির উপর নির্ভরতা শূন্য হওয়ার কোনও কারণ নেই) অনুসরণ করা হয়েছিল, সুতরাং সমস্ত শূন্যস্থান যাইহোক সম্পূর্ণ অপ্রয়োজনীয় ছিল। উপরের কোডটি একটি সাধারণ malloc
(যেমন কোনও বুদ্ধিমান ব্যক্তি দিয়ে শুরু করা উচিত) দিয়ে প্রতিস্থাপন করা জাভা সংস্করণকে (যথেষ্ট স্মৃতিতে প্রসারিত, যদি বিস্তৃত প্রশস্ত মার্জিন দ্বারা) যথেষ্ট পরিমাণে সি ++ সংস্করণের গতি উন্নত করে।
methcall
আপনার শেষ লিঙ্কে ব্লগ এন্ট্রিতে ব্যবহৃত বেঞ্চমার্কটি বিবেচনা করুন (অন্য উদাহরণের জন্য) । নাম সত্ত্বেও (এবং কীভাবে জিনিসগুলি এমনকি দেখতেও পারে) সত্ত্বেও, এর সি ++ সংস্করণ আসলে পদ্ধতি কল ওভারহেড সম্পর্কে মোটেই বেশি পরিমাপ করছে না । কোডটির যে অংশটি সমালোচনামূলক হয়ে উঠেছে তা টগল শ্রেণিতে রয়েছে:
class Toggle {
public:
Toggle(bool start_state) : state(start_state) { }
virtual ~Toggle() { }
bool value() {
return(state);
}
virtual Toggle& activate() {
state = !state;
return(*this);
}
bool state;
};
সমালোচনা অংশটি পরিণত হয় state = !state;
। যখন আমরা রাষ্ট্রটির int
পরিবর্তে কোডটিকে পরিবর্তিত করতে কোডটি পরিবর্তন করি তখন কী হয় তা বিবেচনা করুন bool
:
class Toggle {
enum names{ bfalse = -1, btrue = 1};
const static names values[2];
int state;
public:
Toggle(bool start_state) : state(values[start_state])
{ }
virtual ~Toggle() { }
bool value() { return state==btrue; }
virtual Toggle& activate() {
state = -state;
return(*this);
}
};
এই সামান্য পরিবর্তন সামগ্রিক গতি প্রায় 5: 1 মার্জিন দ্বারা উন্নত করে । যদিও বেঞ্চমার্কটি পদ্ধতি কলের সময়টি পরিমাপের উদ্দেশ্যে করা হয়েছিল , বাস্তবে এটি যা পরিমাপ করছিল তার বেশিরভাগ সময়ই ছিল int
এবং মধ্যে রূপান্তর করার সময় bool
। আমি অবশ্যই একমত হব যে মূল দ্বারা প্রদর্শিত অদক্ষতা দুর্ভাগ্যজনক - তবে সত্যিকারের কোডটিতে এটি খুব কমই দেখা যাচ্ছে এবং যখন / যদি এটি উত্থাপিত হয় তখন যে স্বাচ্ছন্দ্যের সাথে এটি স্থির করা যায়, তা মনে করার জন্য আমার একটা কঠিন সময় আছে এটি অনেক অর্থ হিসাবে।
যদি কেউ জড়িত মাপদণ্ডগুলি পুনরায় চালানোর সিদ্ধান্ত নেয়, তবে আমার আরও যোগ করা উচিত যে জাভা সংস্করণটি উত্পন্ন করে তুলনায় প্রায় সমান তুচ্ছ পরিবর্তন রয়েছে (বা কমপক্ষে এক সময় উত্পাদিত হয়েছিল - আমি একটি দিয়ে পরীক্ষাগুলি পুনরায় চালিত করি নি) তারা এখনও করছে তা নিশ্চিত করার জন্য সাম্প্রতিক জেভিএম) জাভা সংস্করণেও যথেষ্ট পরিমাণে উন্নতি করেছে। জাভা সংস্করণটিতে একটি এনথটিগল :: অ্যাক্টিভেট () রয়েছে যা দেখতে এরকম দেখাচ্ছে:
public Toggle activate() {
this.counter += 1;
if (this.counter >= this.count_max) {
this.state = !this.state;
this.counter = 0;
}
return(this);
}
this.state
সরাসরি কারসাজির পরিবর্তে বেস ফাংশনটিতে এটি কল করা যথেষ্ট গতির উন্নতি দেয় (পরিবর্তিত সি ++ সংস্করণটি রাখার জন্য যথেষ্ট না হলেও)।
সুতরাং, আমরা যা শেষ করব তা হ'ল ব্যাখ্যা করা বাইট কোডগুলি সম্পর্কে বনাম ever উভয়ই অর্থবহ ফলাফল দিচ্ছে না।
আমার নিজের অভিজ্ঞতাটি হ'ল সমানভাবে অভিজ্ঞ প্রোগ্রামাররা অপ্টিমাইজ করার ক্ষেত্রে সমান মনোযোগ দিচ্ছে, সি ++ জাভাটিকে আরও বেশি বার পরাজিত করবে না - তবে (অন্তত এই দু'জনের মধ্যে), প্রোগ্রামার এবং ডিজাইনের মতো ভাষা খুব কমই ততটা পার্থক্য আনবে। যে মানদণ্ডগুলি উদ্ধৃত করা হচ্ছে সেগুলি তাদের লেখকদের (ইন) দক্ষতা / (ডিস্ক) সম্পর্কে সতর্কতা সম্পর্কে আরও জানায় যেগুলি তারা বেঞ্চমার্কের কাছে পূর্ববর্তী ভাষাগুলির তুলনায় বেশি করে।
[সম্পাদনা করুন: উপরে এক জায়গায় যেমন বোঝানো হয়েছে তবে আমার সম্ভবত যতটা সরাসরি হওয়া উচিত তা কখনই বলা হয়নি, আমি যে ফলাফলগুলি উদ্ধৃত করছি সেগুলি হ'ল আমি যখন ~ 5 বছর আগে এটি পরীক্ষা করেছিলাম তখন সি ++ এবং জাভা বাস্তবায়ন যা সেই সময়ে বর্তমান ছিল । আমি বর্তমান বাস্তবায়নগুলি দিয়ে পরীক্ষাগুলি পুনরায় চালিত করিনি। তবে এক নজরে ইঙ্গিত দেয় যে কোডটি ঠিক করা হয়নি, সুতরাং যে সমস্ত পরিবর্তন হয়েছে তা কোডের সমস্যাগুলি আচ্ছাদন করার সংকলকটির ক্ষমতা ছিল]]
তবে আমরা যদি জাভা উদাহরণগুলিকে অগ্রাহ্য করি তবে সংক্ষেপিত কোডের চেয়ে দ্রুত ব্যাখ্যা করা কোডটির পক্ষে সম্ভব (যদিও কিছুটা কঠিন এবং কিছুটা অস্বাভাবিক)।
এটির স্বাভাবিক উপায়টি হ'ল কোডটি ব্যাখ্যা করা হচ্ছে মেশিন কোডের চেয়ে অনেক বেশি কমপ্যাক্ট, বা এটি কোনও সিপিইউতে চলছে যা কোড ক্যাশের চেয়ে বড় ডেটা ক্যাশে রয়েছে।
এই জাতীয় ক্ষেত্রে, একটি ছোট দোভাষী (উদাহরণস্বরূপ, ফোর্থ বাস্তবায়নের অভ্যন্তরীণ দোভাষী) কোড ক্যাশে পুরোপুরি ফিট করতে সক্ষম হতে পারে এবং যে প্রোগ্রামটির ব্যাখ্যা দিচ্ছে তা ডেটা ক্যাশে পুরোপুরি ফিট করে। ক্যাশে সাধারণত কমপক্ষে 10 এর একটি ফ্যাক্টর দ্বারা প্রধান মেমোরির চেয়ে দ্রুত হয় এবং প্রায়শই অনেক বেশি (100 এর ফ্যাক্টরটি বিশেষভাবে বিরল আর হয় না)।
সুতরাং, যদি ক্যাশের এন এর কোনও উপাদান দ্বারা প্রধান মেমরির চেয়ে দ্রুত হয় এবং প্রতিটি বাইট কোডটি প্রয়োগ করতে এন মেশিন কোড নির্দেশাবলীর চেয়ে কম লাগে, বাইট কোডটি জিততে হবে (আমি সরল করছি, তবে আমি মনে করি সাধারণ ধারণাটি এখনও হওয়া উচিত আপত্তি করা)।