সম্পাদনা:
একটি উদাহরণ যুক্ত করা হয়েছে যা আইফ-অন্য বিবৃতি দিয়ে করা যায় তবে শর্তসাপেক্ষ অপারেটর নয়।
উত্তরের আগে দয়া করে দেখে নিন [ কোনটি দ্রুত? ] মিঃ লিপার্টের ব্লগে। এবং আমি মনে করি মিঃ এরেসনেমেজের উত্তরটি এখানে সবচেয়ে সঠিক।
আমি একটি উচ্চ স্তরের প্রোগ্রামিং ভাষার সাথে আমাদের মনে রাখা উচিত এমন কিছু উল্লেখ করার চেষ্টা করছি।
প্রথমে, আমি কখনও শুনিনি যে শর্তসাপেক্ষ অপারেটর দ্রুত এবং সি -এ-অন্য বিবৃতি দিয়ে সমান পারফরম্যান্স বলে মনে করা হচ্ছে ♯ ।
কারণটি সহজ এটি যদি অন্য-বিবৃতিটির সাথে কোনও অপারেশন না থাকে তবে:
if (i > 0)
{
value += 2;
}
else
{
}
শর্তসাপেক্ষ অপারেটরের প্রয়োজনীয়তা হ'ল উভয় পক্ষের সাথে একটি মান থাকতে হবে , এবং সিওতে এটি উভয় পক্ষের :
একই ধরণের থাকতে হবে। এটি কেবল যদি-অন্য বিবৃতি থেকে আলাদা করে তোলে। সুতরাং আপনার প্রশ্নটি এমন প্রশ্নে পরিণত হয়েছে যে মেশিন কোডের নির্দেশনা কীভাবে উত্পন্ন হয় যাতে পারফরম্যান্সের পার্থক্য।
শর্তসাপেক্ষ অপারেটরের সাথে, শব্দার্থভাবে এটি হ'ল:
অভিব্যক্তি যা যা মূল্যায়ন করা হোক না কেন, এর একটি মান আছে।
তবে যদি-অন্য বিবৃতি দিয়ে:
যদি অভিব্যক্তিটি সত্য হিসাবে মূল্যায়ন করা হয় তবে কিছু করুন; যদি না হয়, অন্য একটি কাজ।
কোনও মান অগত্যা-অন্য-বিবৃতিতে জড়িত নয়। আপনার অনুমান কেবল অপ্টিমাইজেশনের মাধ্যমেই সম্ভব।
তাদের মধ্যে পার্থক্য প্রদর্শনের জন্য আরেকটি উদাহরণ নীচের মত হবে:
var array1=new[] { 1, 2, 3 };
var array2=new[] { 5, 6, 7 };
if(i>0)
array1[1]=4;
else
array2[2]=4;
উপরের কোডটি সংকলন করে, তবে, শর্তসাপেক্ষ অপারেটরের সাথে যদি অন্য বিবৃতিটি কেবল সংকলন করে না:
var array1=new[] { 1, 2, 3 };
var array2=new[] { 5, 6, 7 };
(i>0?array1[1]:array2[2])=4; // incorrect usage
আপনি যখন একই জিনিসটি করেন তখন শর্তসাপেক্ষ অপারেটর এবং যদি-অন্য বিবৃতিগুলি ধারণাগত হয় তবে এটি সম্ভবত সি এর শর্তসাপেক্ষ অপারেটরের সাথে আরও দ্রুততর , যেহেতু সি প্ল্যাটফর্মের সমাবেশের আরও কাছাকাছি।
আপনার সরবরাহিত মূল কোডটির জন্য, শর্তসাপেক্ষ অপারেটরটি ফোরচ-লুপে ব্যবহৃত হয়, যা তাদের মধ্যে পার্থক্য দেখার জন্য বিষয়গুলিকে গণ্ডগোল করে। সুতরাং আমি নিম্নলিখিত কোড প্রস্তাব করছি:
public static class TestClass {
public static void TestConditionalOperator(int i) {
long value=0;
value+=i>0?2:3;
}
public static void TestIfElse(int i) {
long value=0;
if(i>0) {
value+=2;
}
else {
value+=3;
}
}
public static void TestMethod() {
TestConditionalOperator(0);
TestIfElse(0);
}
}
এবং নীচে অপ্টিমাইজড এবং না আইএল দুটি সংস্করণ। যেহেতু এগুলি দীর্ঘ, আমি প্রদর্শন করতে একটি চিত্র ব্যবহার করছি, ডান হাতটি অনুকূলিত:
(Fullsize চিত্র দেখতে ক্লিক করুন.)
কোডের উভয় সংস্করণে, শর্তসাপেক্ষ অপারেটরের আইএল-যদি অন্য বিবৃতিটির চেয়ে কম দেখায় এবং অবশেষে উত্পন্ন মেশিন কোডের সন্দেহ রয়েছে there নীচে উভয় পদ্ধতির নির্দেশাবলী দেওয়া হয়েছে, এবং পূর্ববর্তী চিত্রটি অপটিমাইজড, পরবর্তীটিটি অনুকূলিত একটি:
পরবর্তীকালে, হলুদ ব্লকটি কোড কেবল তখনই কার্যকর হয় যদি i<=0
এবং নীল ব্লকটি কখন হয় i>0
। নির্দেশাবলীর উভয় সংস্করণে, যদি-অন্য বিবৃতিটি ছোট হয়।
নোট করুন, বিভিন্ন নির্দেশাবলীর জন্য, [ সিপিআই ] অগত্যা এক নয়। যৌক্তিকভাবে, অভিন্ন নির্দেশের জন্য, আরও নির্দেশাবলীর জন্য দীর্ঘতর চক্র ব্যয় হয়। তবে যদি নির্দেশনা আনার সময় এবং পাইপ / ক্যাশেও বিবেচনায় নেওয়া হয়, তবে মৃত্যুদন্ডের আসল মোট সময়টি প্রসেসরের উপর নির্ভর করে। প্রসেসর এছাড়াও শাখা পূর্বাভাস করতে পারেন।
আধুনিক প্রসেসরগুলির আরও বেশি কোর রয়েছে, এটির সাথে জিনিসগুলি আরও জটিল হতে পারে। আপনি যদি একটি ইন্টেল প্রসেসর ব্যবহারকারী হয়ে থাকেন তবে আপনি [ ®৪ এবং আইএ -32 আর্কিটেকচার অপ্টিমাইজেশন রেফারেন্স ম্যানুয়াল ] দেখতে পাওয়া যেতে পারে।
আমি জানি না কোনও হার্ডওয়্যার-প্রয়োগিত সিএলআর ছিল কিনা, তবে হ্যাঁ, আপনি সম্ভবত শর্তসাপেক্ষ অপারেটরের সাথে দ্রুততর হবেন কারণ আইএল স্পষ্টতই কম।
দ্রষ্টব্য: সমস্ত মেশিন কোড x86 এর।
DateTime
কর্মক্ষমতা পরিমাপ করতে ব্যবহার করবেন না । ব্যবহারStopwatch
। এরপরে, সময়টি বরং আরও দীর্ঘ - এটি পরিমাপ করার জন্য খুব কম সময়।