সিসি ৪.7.২ এবং সি ++ এর জন্য ঝাঁকুনি ৩.২ সহ আমার কিছু সংক্ষিপ্ত অনুসন্ধানগুলি এখানে রয়েছে।
আপডেট: জিসিসি 4.8.1 ভি ঝনঝন 3.3 তুলনা নীচে সংযুক্ত।
আপডেট: জিসিসি 4.8.2 ভি ঝনঝন 3.4 তুলনা এতে যুক্ত করা হয়।
আমি একটি ওএসএস সরঞ্জাম বজায় রাখি যা জিসিসি এবং ক্ল্যাং উভয় এবং উইন্ডোজের জন্য মাইক্রোসফ্টের সংকলক সহ লিনাক্সের জন্য নির্মিত। সরঞ্জামটি, কোয়ান, সি / সি ++ উত্স ফাইল এবং এর কোডডলাইনগুলির একটি প্রিপ্রোসেসর এবং বিশ্লেষক: এটির পুনরাবৃত্ত-বংশদ্ভুত পার্সিং এবং ফাইল হ্যান্ডলিং সম্পর্কিত গণ্যমান্য প্রোফাইল মেজরিগুলি। বিকাশ শাখা (যার কাছে এই ফলাফলগুলি অন্তর্ভুক্ত) বর্তমানে প্রায় 90 টি ফাইলে প্রায় 11 কে এলওসি রয়েছে। এটি এখন কোড করা হয়েছে, সি ++ তে বহুবর্ষ এবং টেম্পলেট সমৃদ্ধ এবং হ্যাক-একসাথে সি-মুভিং শব্দার্থক শব্দগুলি স্পষ্টভাবে শোষণ করা যায় না, এমন অনেক অতীতের অতীত দ্বারা এখনও অনেকগুলি প্যাচগুলিতে ছড়িয়ে পড়ে। এটি একক থ্রেডযুক্ত। আমি এটির অনুকূলকরণের জন্য কোনও গুরুতর প্রচেষ্টা নিবেদিত করি নি, যদিও "আর্কিটেকচার" এতটাই টুডো রয়ে গেছে।
আমি ক্ল্যাং কেবল পরীক্ষামূলক সংকলক হিসাবে 3.2 এর আগে নিয়োগ করেছি কারণ এর উচ্চতর সংকলন গতি এবং ডায়াগোনস্টিকস সত্ত্বেও, এর সি ++ 11 স্ট্যান্ডার্ড সমর্থন কোয়ান দ্বারা ব্যবহৃত ক্ষেত্রে সমসাময়িক জিসিসি সংস্করণকে পিছিয়ে ফেলেছে। ৩.২ সহ এই ফাঁকটি বন্ধ হয়ে গেছে।
আমার লিনাক্স পরীক্ষার বর্তমান কোয়ান ডেভলপমেন্ট প্রসেসগুলির জন্য প্রায় এক-ফাইলের পার্সার টেস্ট-কেসের সংমিশ্রণে 70K উত্স ফাইল, স্ট্রেস টেস্টের সংখ্যা বিশিষ্ট ফাইল এবং দৃশ্যের পরীক্ষাগুলি <1K ফাইল গ্রহণ করে। পরীক্ষার ফলাফলের প্রতিবেদন করার পাশাপাশি, জোতা জমা হয়ে যায় এবং মোট পরিমাণে ব্যবহৃত ফাইলের পরিমাণ প্রদর্শন করে এবং রান সময়টি কোয়ানে ব্যবহৃত হয় (এটি কেবল প্রতিটি ক্যান কমান্ড লাইনকে লিনাক্স time
কমান্ডের মধ্যে দিয়ে যায় এবং ক্যাপচার করে এবং উল্লিখিত সংখ্যাগুলি সংযোজন করে)। সময়গুলি এই বিষয়টির দ্বারা স্বচ্ছ হয় যে 0 টি পরিমাপযোগ্য সময় লাগে এমন যে কোনও পরীক্ষাগুলি সমস্ত 0 টি যুক্ত করে, তবে এই জাতীয় পরীক্ষার অবদান নগণ্য। সময়সীমার পরিসংখ্যানগুলি এর make check
মতো শেষে প্রদর্শিত হবে :
coan_test_timer: info: coan processed 70844 input_files.
coan_test_timer: info: run time in coan: 16.4 secs.
coan_test_timer: info: Average processing time per input file: 0.000231 secs.
আমি পরীক্ষার জোতা পারফরম্যান্সকে GCC 4.7.2 এবং Clang 3.2 এর মধ্যে তুলনা করেছি, সংকলক ব্যতীত সমস্ত কিছুই সমান। কলঙ্ক ৩.২ অনুসারে, আমার আর জিডিসি সংকলন এবং ঝনঝন বিকল্পগুলি সংকলন করবে এমন কোড ট্র্যাক্টের মধ্যে আর কোনও প্রিপ্রোসেসর পার্থক্য প্রয়োজন। আমি প্রতিটি ক্ষেত্রে একই সি ++ লাইব্রেরি (জিসিসি) তৈরি করেছি এবং একই টার্মিনাল সেশনে পরপর সমস্ত তুলনা চালিয়েছি।
আমার রিলিজ বিল্ডের জন্য ডিফল্ট অপ্টিমাইজেশন স্তরটি -O2। আমি সফলভাবে বিল্ডগুলি -O3 এও পরীক্ষা করেছি। আমি প্রতিটি কনফিগারেশন ব্যাক-টু ব্যাক 3 বার পরীক্ষা করেছি এবং নিম্নলিখিত ফলাফলগুলি সহ 3 টি ফলাফলের গড় গড়েছি। ডেটা-সেলে থাকা সংখ্যাটি হ'ল প্রতিটি ~ 70K ইনপুট ফাইলগুলি পড়ার (আউটপুট এবং ডায়াগোনস্টিকস পড়ুন, পার্স করতে এবং লিখতে) প্রক্রিয়াকরণের জন্য কোয়ান দ্বারা নির্বাহযোগ্য মাইক্রোসেকেন্ডের সংখ্যা।
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.7.2 | 231 | 237 |0.97 |
----------|-----|-----|-----|
Clang-3.2 | 234 | 186 |1.25 |
----------|-----|-----|------
GCC/Clang |0.99 | 1.27|
যে কোনও নির্দিষ্ট অ্যাপ্লিকেশনটিতে এমন একটি বৈশিষ্ট্য রয়েছে যা সংকলকটির শক্তি বা দুর্বলতার প্রতি অন্যায়ভাবে খেলতে পারে। কঠোর বেঞ্চমার্কিং বিভিন্ন অ্যাপ্লিকেশন নিয়োগ করে। সেই বিষয়টি মাথায় রেখে, এই ডেটাগুলির উল্লেখযোগ্য বৈশিষ্ট্যগুলি হ'ল:
- -3 অপ্টিমাইজেশন জিসিসির জন্য প্রান্তিক ক্ষতিকারক ছিল
- -ও 3 অপটিমাইজেশন ক্ল্যাংয়ের জন্য গুরুত্বপূর্ণভাবে উপকারী
- ও -2 অপ্টিমাইজেশনে, জিসিসি কেবল একটি ফিসওয়ালা দ্বারা কলংয়ের চেয়ে দ্রুত was
- ও -৩ অপ্টিমাইজেশনে, কলং জিসিসির চেয়ে গুরুত্বপূর্ণভাবে দ্রুত ছিল।
দু'টি সংকলকগুলির আরও একটি আকর্ষণীয় তুলনা দুর্ঘটনাক্রমে সেই আবিষ্কারগুলির অল্প সময়ের মধ্যেই উদ্ভূত হয়েছিল। কোয়ান উদারভাবে স্মার্ট পয়েন্টার নিয়োগ করে এবং এর মধ্যে একটি ফাইল হ্যান্ডলিংয়ে খুব ভারী ব্যবহার করা হয়। এই নির্দিষ্ট স্মার্ট-পয়েন্টার টাইপটি সংকলক-পার্থক্যের কারণে পূর্বের রিলিজগুলিতে টাইপডেফ করা হত, যদি কনফিগার করা সংকলকটির std::unique_ptr<X>
হিসাবে এটির ব্যবহারের জন্য যথেষ্ট পরিপূরক সমর্থন থাকে, এবং অন্যথায় এটি std::shared_ptr<X>
। পক্ষপাতদুষ্ট std::unique_ptr
বোকামি, যেহেতু এই পয়েন্টারগুলি সত্যই চারপাশে স্থানান্তরিত হয়েছিল, তবে std::unique_ptr
প্রতিস্থাপনের জন্য ফিটার বিকল্পগুলির মতো দেখায়
std::auto_ptr
যখন সি ++ 11 রূপগুলি আমার কাছে উপন্যাস ছিল তখন বিন্দুতে ।
এই এবং একই রকমের পার্থক্যের জন্য ক্ল্যাং ৩.২ এর অবিচ্ছিন্ন প্রয়োজন পরীক্ষা করার জন্য পরীক্ষামূলক বিল্ডগুলি চলাকালীন, আমি std::shared_ptr<X>
যখন অজান্তেই নির্মাণের পরিকল্পনা করছিলাম তখন আমি তৈরি
করেছিলাম std::unique_ptr<X>
, এবং অবাক হয়ে অবাক হয়েছি যে ফলস্বরূপ নির্বাহযোগ্য, ডিফল্ট -O2 অপ্টিমাইজেশন সহ আমি দ্রুততম ছিলাম দেখেছি, কখনও কখনও 184 ম্যাসেক অর্জন। প্রতি ইনপুট ফাইল। উত্স কোডে এই এক পরিবর্তন হওয়ার সাথে সাথে সম্পর্কিত ফলাফলগুলি হ'ল;
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.7.2 | 234 | 234 |1.00 |
----------|-----|-----|-----|
Clang-3.2 | 188 | 187 |1.00 |
----------|-----|-----|------
GCC/Clang |1.24 |1.25 |
এখানে নোটের পয়েন্টগুলি হল:
- সংকলক এখনই -O3 অপ্টিমাইজেশন থেকে মোটেও উপকার করে না।
- ঝাঁকুনি জিসিসিকে অপটিমাইজেশনের প্রতিটি স্তরে ঠিক গুরুত্বপূর্ণভাবে পরাজিত করে।
- স্মার্ট-পয়েন্টার ধরণের পরিবর্তনের ফলে জিসিসির পারফরম্যান্স কেবলমাত্র প্রান্তিকভাবে প্রভাবিত।
- কলং এর -O2 পারফরম্যান্স গুরুত্বপূর্ণভাবে স্মার্ট পয়েন্টার ধরণের পরিবর্তনের দ্বারা প্রভাবিত হয়।
স্মার্ট-পয়েন্টার ধরণের পরিবর্তনের আগে এবং পরে, ক্ল্যাং -O3 অপ্টিমাইজেশনে যথেষ্ট দ্রুত মুদ্রা নির্বাহযোগ্য তৈরি করতে সক্ষম হয় এবং এটি -O2 এবং -O3 এ সমান দ্রুত কার্যকর কার্যকর করতে পারে যখন সেই পয়েন্টার-টাইপটি সেরা হয় - std::shared_ptr<X>
- চাকুরির জন্য.
একটি স্পষ্ট প্রশ্ন যা আমি মন্তব্য করতে সক্ষম নই সে কারণেই
যখন ভারী ব্যবহৃত স্মার্ট-পয়েন্টার-টাইপটি অনন্য থেকে ভাগ করে নেওয়া হয় তখন ক্ল্যাং আমার অ্যাপ্লিকেশনটিতে 25% -O2 স্পিড-আপ সন্ধান করতে সক্ষম হয়, যখন জিসিসি উদাসীন একই পরিবর্তন। আমিও জানি না যে আমার আবিষ্কারটি উত্সাহিত করা বা উত্সাহিত করা উচিত যা ক্ল্যাং -2 অপটিমাইজেশন আমার স্মার্ট পয়েন্টার পছন্দগুলির জ্ঞানের প্রতি এত সংবেদনশীলতার আশ্রয় দেয়।
আপডেট: জিসিসি 4.8.1 ভি ঝনঝন 3.3
সম্পর্কিত ফলাফল এখন:
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.8.1 | 442 | 443 |1.00 |
----------|-----|-----|-----|
Clang-3.3 | 374 | 370 |1.01 |
----------|-----|-----|------
GCC/Clang |1.18 |1.20 |
সত্য যে চারটি এক্সেকিউটেবল এখন 1 টি ফাইল প্রক্রিয়া করতে পূর্বে তুলনায় অনেক বেশি গড় সময় বেশি লাগে না সর্বশেষতম সংকলকগুলির কার্যকারিতা প্রতিফলিত । এটি পরীক্ষার আবেদনের পরবর্তী উন্নয়ন শাখা ইতিমধ্যে পার্সিং পরিশীলনের প্রচুর পরিমাণ গ্রহণ করেছে এবং এর গতিবেগের জন্য অর্থ প্রদান করে। শুধুমাত্র অনুপাত উল্লেখযোগ্য।
নোটের পয়েন্টগুলি এখন গ্রেপ্তারজনকভাবে উপন্যাস নয়:
- জিসিসি -O3 অপ্টিমাইজেশানের প্রতি উদাসীন
- ঝাঁকুনি -O3 অপ্টিমাইজেশান থেকে খুব সামান্যভাবে উপকার করে
- ঝনঝন জিসিসিকে অপটিমাইজেশনের প্রতিটি স্তরে একইভাবে গুরুত্বপূর্ণ ব্যবধানে পরাজিত করে।
এই ফলাফলগুলির সাথে জিসিসি ৪.7.২ এবং ঝনঝন ৩.২ এর সাথে তুলনা করলে দেখা যায় যে প্রতিটি অপ্টিমাইজেশন স্তরে জিসিসি প্রায় এক চতুর্থাংশ ঝাঁকুনির পিছনে ফিরে এসেছিল। কিন্তু যেহেতু এই সময়ের মধ্যে পরীক্ষার আবেদনটি ব্যাপকভাবে বিকশিত হয়েছে তবে কেউ আত্মবিশ্বাসের সাথে এটিকে জিসিসির কোড-জেনারেশনের ক্যাচ আপকে দায়ী করতে পারে না। (এবার, আমি অ্যাপ্লিকেশন স্ন্যাপশটটি উল্লেখ করেছি যেখান থেকে সময় নেওয়া হয়েছিল এবং এটি আবার ব্যবহার করতে পারি))
আপডেট: জিসিসি 4.8.2 ভি ঝাঁকুনি 3.4
আমি জিসিসি 4.8.1 ভি ক্ল্যাং 3.3 এর আপডেটটি শেষ করে বলেছিলাম যে আরও আপডেটের জন্য আমি একই কয়েন স্ন্যাপটকে আটকে থাকব to তবে আমি পরিবর্তে sn স্ন্যাপশট (রেভা। 301) এবং সর্বশেষ বিকাশের স্ন্যাপশটে পরীক্ষা করার সিদ্ধান্ত নিয়েছি যা এটির পরীক্ষার স্যুট (রেভ। 619) পাস করেছে। এটি ফলাফলকে কিছুটা দ্রাঘিমাংশ দেয় এবং আমার আরও উদ্দেশ্য ছিল:
আমার আসল পোস্টটি উল্লেখ করেছে যে আমি গতির জন্য কয়েন অনুকূল করতে কোনও প্রচেষ্টা নিযুক্ত করি নি। রেভা হিসাবে এটি এখনও ছিল। 301. তবে, আমি কোয়ান পরীক্ষার জোড়ায় টাইমিং যন্ত্রপাতি তৈরির পরে, প্রতিবার যখন আমি পরীক্ষার স্যুটটি চালিয়েছি তখন সর্বশেষ পরিবর্তনের পারফরম্যান্সের প্রভাব আমাকে মুখরিত করে। আমি দেখেছি এটি প্রায়শই আশ্চর্যজনকভাবে বড় হয় এবং কার্যকারিতা লাভের দ্বারা যোগ্যতা অর্জন করার চেয়ে আমার প্রবণতাটি খুব বেশি নেতিবাচক ছিল।
রেভ দ্বারা। 308 পরীক্ষার স্যুটটিতে প্রতি ইনপুট ফাইলের প্রক্রিয়াকরণের সময়টি এখানে প্রথম পোস্ট করার পরে দ্বিগুণের চেয়ে বেশি হয়েছিল। সেই সময়ে আমি সম্পাদনা সম্পর্কে বিরক্ত না করার জন্য আমার 10 বছরের নীতিটি একটি ইউ-টার্ন করেছি। সংশোধনগুলির সংক্ষিপ্ত সময়ের মধ্যে 619 কার্যকারিতাটি সর্বদা বিবেচনা করা ছিল এবং তাদের মধ্যে একটি বৃহত সংখ্যক বিশুদ্ধরূপে মূল লোড-ধারকগণকে মূলত দ্রুত লাইনগুলিতে পুনর্লিখন করতে গিয়েছিল (যদিও এটি করার জন্য কোনও মানক সংকলক বৈশিষ্ট্য ব্যবহার না করে)। এই ইউ-টার্নের জন্য প্রতিটি সংকলকের প্রতিক্রিয়া দেখতে আকর্ষণীয় হবে,
301 র্যাভের সর্বশেষ দুটি সংকলকগুলির বিল্ডগুলির জন্য এখন পরিচিত টাইমিংস ম্যাট্রিক্স:
কোয়ান - rev.301 ফলাফল
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.8.2 | 428 | 428 |1.00 |
----------|-----|-----|-----|
Clang-3.4 | 390 | 365 |1.07 |
----------|-----|-----|------
GCC/Clang | 1.1 | 1.17|
এখানে গল্পটি কেবলমাত্র GCC-4.8.1 এবং কলং -৩.৩ থেকে সামান্য পরিবর্তিত হয়েছে। জিসিসির প্রদর্শন আরও একটি ক্ষুদ্রতর ভাল। ঝনঝন একটি ক্ষুদ্রতর খারাপ। গোলমাল এর জন্য ভাল অ্যাকাউন্ট করতে পারে। ঝাঁকুনি এখনও সামনে এসে পৌঁছে যায় -O2
এবং -O3
মার্জিনগুলি যে বেশিরভাগ অ্যাপ্লিকেশনগুলিতে কিছু যায় আসে না তবে বেশ কিছু ক্ষেত্রে গুরুত্বপূর্ণ।
এবং এখানে রেভের জন্য ম্যাট্রিক্স। 619।
কোয়ান - rev.619 ফলাফল
| -O2 | -O3 |O2/O3|
----------|-----|-----|-----|
GCC-4.8.2 | 210 | 208 |1.01 |
----------|-----|-----|-----|
Clang-3.4 | 252 | 250 |1.01 |
----------|-----|-----|------
GCC/Clang |0.83 | 0.83|
পাশাপাশি 301 এবং 619 চিত্রগুলি নিয়ে, বেশ কয়েকটি পয়েন্ট কথা বলে speak
আমি দ্রুত কোড লেখার লক্ষ্য নিয়েছিলাম, এবং উভয় সংকলক দৃ emp়ভাবে আমার প্রচেষ্টাকে প্রমাণ করতে পারেন। কিন্তু:
জিসিসি এই প্রচেষ্টাগুলি ক্ল্যাংয়ের চেয়ে অনেক বেশি উদারতার সাথে শোধ করে। এ -O2
অপ্টিমাইজেশান ঝনঝন এর 619 বিল্ড 46% তার 301 বিল্ড চেয়ে দ্রুততর: এ -O3
ঝনঝন এর উন্নতি 31% হয়। ভাল, তবে প্রতিটি অপ্টিমাইজেশন স্তরে জিসিসির 619 বিল্ড এটির 301 এর চেয়ে দ্বিগুণের বেশি দ্রুত।
জিসিসি ক্ল্যাংয়ের আগের শ্রেষ্ঠত্বের চেয়ে বেশি বিপরীত। এবং প্রতিটি অপ্টিমাইজেশন স্তরে জিসিসি এখন কলঙ্ককে 17% দ্বারা পরাজিত করে।
-O3
অপ্টিমাইজেশান থেকে জিসিসির চেয়ে আরও বেশি লাভের জন্য 301 বিল্ডে কলংয়ের ক্ষমতা 619 বিল্ডে চলে গেছে। সংকলক উভয়ই অর্থপূর্ণভাবে লাভ করে না -O3
।
ভাগ্যের এই বিপর্যয় দেখে আমি যথেষ্ট অবাক হয়েছি যে আমার সন্দেহ হয়েছিল যে আমি ভুলক্রমে সম্ভবত ভুলভাবে ঝাঁকুনি ৩.৪ তৈরি করতে পেরেছি (যেহেতু আমি এটি উত্স থেকে তৈরি করেছি)। সুতরাং আমি আমার ডিসট্রোর স্টক কলং ৩.৩ দিয়ে পুনরায় 19১৯ টি পরীক্ষা চালিয়েছি। ফলাফলগুলি কার্যতঃ ৩.৪ এর মতো ছিল।
সুতরাং ইউ-টার্নের প্রতিক্রিয়া হিসাবে: এখানকার সংখ্যায়, যখন আমি কোনও সহায়তা দিচ্ছিলাম তখন ক্ল্যাং আমার সি ++ কোডের থেকে দ্রুত গতিতে জিসিসির চেয়ে অনেক ভাল কাজ করেছে। যখন আমি সাহায্য করার দিকে মন দিলাম, জিসিসি ক্ল্যাংয়ের চেয়ে অনেক ভাল কাজ করেছে।
আমি সেই পর্যবেক্ষণকে নীতি হিসাবে উন্নীত করি না, তবে আমি এই পাঠটি গ্রহণ করি যে "কোন সংকলক আরও ভাল বাইনারি তৈরি করে?" এমন একটি প্রশ্ন যা, এমনকি যদি আপনি পরীক্ষার স্যুটটি উত্তরটির সাথে সম্পর্কিত বলে উল্লেখ করেন, তবুও কেবল বাইনারিগুলির সময় নির্ধারণের কোনও পরিষ্কার বিষয় নয়।
আপনার আরও ভাল বাইনারি দ্রুত বাইনারি হয়, বা এটি সস্তা সজ্জিত কোডের জন্য সবচেয়ে ভাল ক্ষতিপূরণ দেয়? বা ব্যয়বহুল
তৈরির কোডটি সর্বোত্তমভাবে ক্ষতিপূরণ দেয় যা রক্ষণাবেক্ষণকে অগ্রাধিকার দেয় এবং গতির বেশি ব্যবহার করে? এটি বাইনারি উত্পাদন করার জন্য আপনার উদ্দেশ্যগুলির প্রকৃতি এবং আপেক্ষিক ওজনের উপর নির্ভর করে এবং আপনি যে সীমাবদ্ধতাগুলির অধীনে এটি করেন তার উপর।
এবং যে কোনও ক্ষেত্রে, যদি আপনি "সেরা" বাইনারিগুলি তৈরির বিষয়ে গভীরভাবে চিন্তা করেন তবে আপনার কোডের ক্রমাগত পুনরাবৃত্তির তুলনায় সংকলকগুলির ক্রমাগত পুনরাবৃত্তিগুলি "সেরা" আপনার ধারণাকে কীভাবে সরবরাহ করে তা ভাল করে পরীক্ষা করে দেখতে হবে।