আমি সম্প্রতি একটি ব্যক্তিগত প্রকল্পে কাজ করছি যখন আমি একটি বিজোড় সমস্যাটি নিয়ে হোঁচট খেয়েছি।
খুব কড়া লুপে আমার 0 এবং 15 এর মধ্যে একটি মান সহ পূর্ণসংখ্যা রয়েছে 0, 5, 12, এবং 13 এর মান 0, 1, 8, এবং 9 এবং 1 এর জন্য আমাকে 1 পাওয়া দরকার।
আমি কয়েকটি বিকল্প যাচাই করতে গডবোল্টে পরিণত হয়েছিল এবং অবাক হয়ে গিয়েছিলাম যে দেখে মনে হয়েছিল যে সংকলকটি যদি কোনও সুইচ স্টেটমেন্টটিকে ইফ চেইনের মতো একইভাবে অনুকূলিত করতে পারে না।
লিঙ্কটি এখানে: https://godbolt.org/z/WYVBFl
কোডটি হ'ল:
const int lookup[16] = {-1, -1, 0, 0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0};
int a(int num) {
return lookup[num & 0xF];
}
int b(int num) {
num &= 0xF;
if (num == 0 || num == 1 || num == 8 || num == 9)
return -1;
if (num == 4 || num == 5 || num == 12 || num == 13)
return 1;
return 0;
}
int c(int num) {
num &= 0xF;
switch (num) {
case 0: case 1: case 8: case 9:
return -1;
case 4: case 5: case 12: case 13:
return 1;
default:
return 0;
}
}
আমি ভেবেছিলাম যে খ এবং সি একই ফলাফল দেবে এবং আমি আশা করছিলাম যে আমি বিট-হ্যাকগুলি নিজেই কার্যকর প্রয়োগ নিয়ে আসতে পারি যেহেতু আমার সমাধান (স্যুইচ বিবৃতি - অন্য আকারে) মোটামুটি ধীর ছিল।
অদ্ভুতভাবে, b
বিট-হ্যাকগুলিতে সংকলন করা c
হয়েছিল যখন হয় a
লক্ষ্যমাত্রা হার্ডওয়ারের উপর নির্ভর করে কোনওরকম বেশ আন-অপটিমাইজড বা হ্রাস পেয়েছে case
এই বৈষম্য কেন কেউ ব্যাখ্যা করতে পারেন? এই কোয়েরিটি অনুকূলিত করার 'সঠিক' উপায় কী?
সম্পাদনা করুন:
শোধন
আমি চাই যে স্যুইচ সমাধানটি দ্রুত, বা একইভাবে "পরিষ্কার" সমাধান হোক। তবে আমার মেশিনে অপ্টিমাইজেশানগুলি সংকলনের সময় যদি সমাধানটি উল্লেখযোগ্যভাবে দ্রুত হয়।
আমি প্রদর্শনের জন্য একটি দ্রুত প্রোগ্রাম লিখেছি এবং টিআইওর স্থানীয় ফলাফল হিসাবে আমি একই ফলাফল পেয়েছি: অনলাইনে চেষ্টা করে দেখুন!
দেখার static inline
টেবিলটি কিছুটা গতি বাড়িয়েছে: অনলাইনে চেষ্টা করে দেখুন!
if
এখনও মারধর করে switch
(অদ্ভুতভাবে চেহারা আরও দ্রুত হয়ে যায়) [অনুসরণ করতে টিআইও]
-O3
, এবং এটি কম্পাইলc
সম্ভবত তদপেক্ষা মন্দ কিছুর জন্যa
বাb
(c
দুই শর্তসাপেক্ষ জাম্প প্লাস কয়েক বিট হেরফেরের, বনাম শুধুমাত্র একটি শর্তাধীন লাফ এবং জন্য সহজ বিট manip ছিলb
), কিন্তু এখনও আইটেম পরীক্ষা করে নিষ্পাপ আইটেমের চেয়ে ভাল। আমি নিশ্চিত না যে আপনি এখানে সত্যই যা চাইছেন; সহজ সত্য যে একটি সর্বোচ্চকরন কম্পাইলার চালু করতে পারেন হয় কোনো মধ্যে এগুলোর কোনো অন্যদের যদি এটা তা চয়ন তাই হয়, এবং সেখানে এটি বা না হবে কি জন্য কোন ধরাবাঁধা নিয়ম আছে।