ঝাঁকুনি বনাম জিসিসি - যা আরও ভাল বাইনারি উত্পাদন করে? [বন্ধ]


238

আমি বর্তমানে জিসিসি ব্যবহার করছি, তবে আমি সম্প্রতি ক্ল্যাং আবিষ্কার করেছি এবং আমি স্যুইচিংয়ের কথা ভাবছি। যদিও এটি নির্ধারিত বাইনারিগুলির গুণমান (গতি, মেমরির পদক্ষেপ, নির্ভরযোগ্যতা) - এটির একটি নির্ধারণকারী কারণ রয়েছে - যদি gcc -O31% দ্রুত চালিত বা 1% কম মেমরি গ্রহণ করে এমন বাইনারি তৈরি করতে পারে তবে এটি একটি চুক্তি-ব্রেকার।

কলং জিসিসির তুলনায় আরও কম কমপাইল গতি এবং কম কমপাইল-টাইম মেমরি পদচিহ্নের গর্বিত, তবে আমি ফলাফলগত সংকলিত সফ্টওয়্যারগুলির বেঞ্চমার্ক / তুলনাগুলিতে সত্যই আগ্রহী - আপনি কি আমাকে কিছুতে নির্দেশ করতে পারেন বা আপনার অভিজ্ঞতা বর্ণনা করতে পারেন?


5
এখনও একটি মূল্যবান প্রশ্ন এবং প্রতিক্রিয়া মনে হচ্ছে, এবং অনেকে আগ্রহী।
ইয়াসেরআসমি

9
@ ইয়াসারআস্মি: এবং দুটি মেট্রিকস - মেমরির পদচিহ্ন এবং সম্পাদনের গতি - যথেচ্ছ বা "মতামত" সাপেক্ষে অনেক দূরে are তবে মনে হয় পদার্থবিজ্ঞানের রোগটি এখানে ছড়িয়ে পড়ে এবং লোকেরা এখানেও প্রশ্নের পাঠ্য বিবরণ না পড়েই বন্ধ করতে ভোট দিতে শুরু করে।
এসএফ

12
প্রশ্নটি মানদণ্ড এবং তুলনা জিজ্ঞাসা করে, উত্তর উভয়ই দেয় ... কেন সত্যিক তুলনার পরিবর্তে এই মতামত?
oemb1905

2
কেন এই প্রশ্নটি বন্ধ ছিল তা দেখুন না। এটি মতামত বা সত্য ভিত্তিক, আমরা উত্তরটি জানতে চাই এবং এটিকে বন্ধ হিসাবে চিহ্নিত করে এটি একটি নেতিবাচক জঞ্জাল দেয়, যেখানে কোনওটি হওয়া উচিত নয়।
টিমোথি মাকোবু

2
@ টমজাইচ: আপনি যদি এই কারণগুলি জানতে চান তবে বিভিন্ন প্রশ্ন জিজ্ঞাসা করুন। এটি একটি খুব নির্দিষ্ট এবং দ্ব্যর্থহীন - কার্যকর করার গতি এবং মেমরির পদক্ষেপের জন্য জিজ্ঞাসা করছে। আপনি অন্য কারণগুলির প্রতি আগ্রহী হতে পারেন, আপনার পক্ষে ভাল, এর অর্থ এই নয় যে এই প্রশ্নটি অবৈধ, এটি কেবল আপনার ব্যক্তিগত আগ্রহগুলি পূরণ করে না। এটি আপনি একটি জাভা প্রোগ্রামার এর মতো এবং প্রতিটি সি # প্রশ্ন বন্ধ করতে চান কারণ এটি জাভা সম্পর্কে কথা বলে না।
এসএফ

উত্তর:


239

সিসি ৪.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|

যে কোনও নির্দিষ্ট অ্যাপ্লিকেশনটিতে এমন একটি বৈশিষ্ট্য রয়েছে যা সংকলকটির শক্তি বা দুর্বলতার প্রতি অন্যায়ভাবে খেলতে পারে। কঠোর বেঞ্চমার্কিং বিভিন্ন অ্যাপ্লিকেশন নিয়োগ করে। সেই বিষয়টি মাথায় রেখে, এই ডেটাগুলির উল্লেখযোগ্য বৈশিষ্ট্যগুলি হ'ল:

  1. -3 অপ্টিমাইজেশন জিসিসির জন্য প্রান্তিক ক্ষতিকারক ছিল
  2. -ও 3 অপটিমাইজেশন ক্ল্যাংয়ের জন্য গুরুত্বপূর্ণভাবে উপকারী
  3. ও -2 অপ্টিমাইজেশনে, জিসিসি কেবল একটি ফিসওয়ালা দ্বারা কলংয়ের চেয়ে দ্রুত was
  4. ও -৩ অপ্টিমাইজেশনে, কলং জিসিসির চেয়ে গুরুত্বপূর্ণভাবে দ্রুত ছিল।

দু'টি সংকলকগুলির আরও একটি আকর্ষণীয় তুলনা দুর্ঘটনাক্রমে সেই আবিষ্কারগুলির অল্প সময়ের মধ্যেই উদ্ভূত হয়েছিল। কোয়ান উদারভাবে স্মার্ট পয়েন্টার নিয়োগ করে এবং এর মধ্যে একটি ফাইল হ্যান্ডলিংয়ে খুব ভারী ব্যবহার করা হয়। এই নির্দিষ্ট স্মার্ট-পয়েন্টার টাইপটি সংকলক-পার্থক্যের কারণে পূর্বের রিলিজগুলিতে টাইপডেফ করা হত, যদি কনফিগার করা সংকলকটির 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 |

এখানে নোটের পয়েন্টগুলি হল:

  1. সংকলক এখনই -O3 অপ্টিমাইজেশন থেকে মোটেও উপকার করে না।
  2. ঝাঁকুনি জিসিসিকে অপটিমাইজেশনের প্রতিটি স্তরে ঠিক গুরুত্বপূর্ণভাবে পরাজিত করে।
  3. স্মার্ট-পয়েন্টার ধরণের পরিবর্তনের ফলে জিসিসির পারফরম্যান্স কেবলমাত্র প্রান্তিকভাবে প্রভাবিত।
  4. কলং এর -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১৯ টি পরীক্ষা চালিয়েছি। ফলাফলগুলি কার্যতঃ ৩.৪ এর মতো ছিল।

সুতরাং ইউ-টার্নের প্রতিক্রিয়া হিসাবে: এখানকার সংখ্যায়, যখন আমি কোনও সহায়তা দিচ্ছিলাম তখন ক্ল্যাং আমার সি ++ কোডের থেকে দ্রুত গতিতে জিসিসির চেয়ে অনেক ভাল কাজ করেছে। যখন আমি সাহায্য করার দিকে মন দিলাম, জিসিসি ক্ল্যাংয়ের চেয়ে অনেক ভাল কাজ করেছে।

আমি সেই পর্যবেক্ষণকে নীতি হিসাবে উন্নীত করি না, তবে আমি এই পাঠটি গ্রহণ করি যে "কোন সংকলক আরও ভাল বাইনারি তৈরি করে?" এমন একটি প্রশ্ন যা, এমনকি যদি আপনি পরীক্ষার স্যুটটি উত্তরটির সাথে সম্পর্কিত বলে উল্লেখ করেন, তবুও কেবল বাইনারিগুলির সময় নির্ধারণের কোনও পরিষ্কার বিষয় নয়।

আপনার আরও ভাল বাইনারি দ্রুত বাইনারি হয়, বা এটি সস্তা সজ্জিত কোডের জন্য সবচেয়ে ভাল ক্ষতিপূরণ দেয়? বা ব্যয়বহুল তৈরির কোডটি সর্বোত্তমভাবে ক্ষতিপূরণ দেয় যা রক্ষণাবেক্ষণকে অগ্রাধিকার দেয় এবং গতির বেশি ব্যবহার করে? এটি বাইনারি উত্পাদন করার জন্য আপনার উদ্দেশ্যগুলির প্রকৃতি এবং আপেক্ষিক ওজনের উপর নির্ভর করে এবং আপনি যে সীমাবদ্ধতাগুলির অধীনে এটি করেন তার উপর।

এবং যে কোনও ক্ষেত্রে, যদি আপনি "সেরা" বাইনারিগুলি তৈরির বিষয়ে গভীরভাবে চিন্তা করেন তবে আপনার কোডের ক্রমাগত পুনরাবৃত্তির তুলনায় সংকলকগুলির ক্রমাগত পুনরাবৃত্তিগুলি "সেরা" আপনার ধারণাকে কীভাবে সরবরাহ করে তা ভাল করে পরীক্ষা করে দেখতে হবে।


9
দ্রুত ঝাঁকুনি কেন? উদাহরণস্বরূপ, ইন্টেল সংকলক ইন্টেল চিপগুলির বিশেষত্ব ব্যবহার করে। কোন সুবিধা পেতে ঝাঁকুনি কী ব্যবহার করছে? কোডটি কি আবার লেখা যায় যাতে জিসিসির একই কর্মক্ষমতা থাকে?
কিরিল_গুম

27
@ ক্রিল_গাম জিসিসি এবং ক্লাং বিভিন্ন প্রোগ্রামারগুলির বিভিন্ন গ্রুপ দ্বারা একই কাজ করার জন্য লিখিত বিভিন্ন (অত্যন্ত জটিল): উত্স কোডে উত্স কোডটি অনুবাদ করুন। এটি প্রায় অনিবার্য যে তাদের যে কোনও একটি সময়ে যে কোনও সময় নির্বাচিত পরীক্ষায় অন্যের তুলনায় সেই কাজটি পরিমাপযোগ্যভাবে আরও ভালভাবে সম্পাদন করবে। বিজয়ী "সুবিধা" পেতে "ব্যবহার" করছেন এমন কোনও বিশেষ "জিনিস" থাকার দরকার নেই এবং যেহেতু উভয় প্রোগ্রামই ওপেন-সোর্স, তাদের একে অপরের গোপনীয়তা নেই।
মাইক কিংহান

3
kcachegrindউত্পাদিত এক্সিকিউটেবলের পারফরম্যান্সে পৃথক হওয়া ফাংশনগুলি চিহ্নিত করতে এটি ব্যবহার করা সম্ভব ।

4
-1: এটি উত্তরের চেয়ে একটি উপন্যাস (বা ব্লগ পোস্ট) বেশি।
জন স্যান্ডার্স

60
@ জনসন্ডার্স: এক ব্যক্তির পক্ষে কী একটি বিশদ, গভীর উত্তর, অন্য একজনের কাছে তাদের মনোযোগের অযোগ্য একটি উপন্যাস। এই দুটি লোককে কী আলাদা করে রাখুন তা বলুন।
এসএফ

48

ফোরোনিক্স এ সম্পর্কে কিছু বেঞ্চমার্ক করেছেন, তবে এটি কয়েক মাস আগে থেকেই ক্ল্যাং / এলএলভিএম এর স্ন্যাপশট সংস্করণ সম্পর্কে। ফলাফলগুলি হ'ল জিনিসগুলি কম বেশি বা একটি ধাক্কা ছিল; জিসিসি বা ক্ল্যাং উভয় ক্ষেত্রেই সমস্ত ক্ষেত্রে অবশ্যই আরও ভাল।

যেহেতু আপনি সর্বশেষতম ঝনঝন ব্যবহার করছেন, এটি সম্ভবত কিছুটা কম প্রাসঙ্গিক। তারপরে আবারও, জিসিসি 4.6 তে দৃশ্যত কোর 2 এবং আই 7 এর জন্য কিছু বড় অপ্টিমাইজেশন করবে

আমি অনুমান করি যে ক্ল্যাংয়ের দ্রুত সংকলনের গতিটি মূল বিকাশকারীদের জন্য আরও ভাল হবে এবং তারপরে আপনি যখন কোডটি বিশ্বের বাইরে নিয়ে যান, লিনাক্স ডিস্ট্রো / বিএসডি / ইত্যাদি। শেষ ব্যবহারকারীরা দ্রুত বাইনারিগুলির জন্য জিসিসি ব্যবহার করবে।


2
ঠিক আজ আমি ক্ল্যাং সংকলনের গতিতে কয়েকটি মানদণ্ড চালিয়েছি এবং খাঁটি সি'র জন্য এটি অত্যন্ত হতাশাব্যঞ্জক 27৫০ সি ফাইলের ২ 27০ কেএলসি ক্ল্যাংয়ের সাথে সংকলনটি কেবল ২৫% দ্রুত ছিল। লিনাক্সে টিনিসিসি কত দ্রুত তা যখন দেখি এটি একটি নতুন লিখিত সংকলকটির জন্য খারাপ ফলাফল। অপ্টিমাইজেশন -O2 / -O3 ব্যবহার করার সময় এটি আরও ভাল হয় তবে যেহেতু সেগুলি মুক্তির জন্য ব্যবহৃত হয় সে ক্ষেত্রে সংকলকটির পারফরম্যান্স কিছু যায় আসে না।
লোথার

7
@ এমকান্দ্রে সম্ভবত নিটেচে-জুউ ক্ল্যাংয়ের সাথে সংকলিত হয়েছিল, যেখানে আপনি জিসিসির সাথে সংকলন করেছেন।
মতিন উলহাক

18

ক্ল্যাং কোডগুলি দ্রুত সংকলন করে এনেছে যে ফলস্বরূপ বাইনারিগুলির গতির মতো গুরুত্বপূর্ণ হতে পারে না। যাইহোক, এখানে একটি মাপদণ্ডের মানদণ্ড রয়েছে


12
আসলে এটা করে। বিকাশের সময় সংকলনের সময় (এবং সংকলনের কারণে সংস্থানসমূহের ব্যবহার) বাইনারি পারফরম্যান্সের চেয়ে অনেক বেশি বাধা। সর্বোপরি, আমরা এই পর্যায়ে ডিবাগ মোডে সংকলন করি। আপনি যখন রিলিজ মোডে স্যুইচ করেন এবং যত দ্রুত সম্ভব একটি বাইনারি পাওয়ার চেষ্টা করেন তখনই পরীক্ষা ও শিপিংয়ের মঞ্চ আসে।
ম্যাথিউ এম।

3
@ ম্যাথিউ এম: আমি এই শপথ করছি যে উত্তরটি "মে .." বলেছিল, যেন তিনি কোনও সম্ভাব্য উদ্বেগ প্রকাশ করছেন। আমার ধারণা, এটি সম্ভবত উল্লেখ করার মতো ছিল কারণ এটি ছিল, ওপি সম্পর্কিত know
জেএম বেকার

সম্মত হন, যদিও এখানে সমস্ত ভাল পয়েন্ট। আমি বরং ২ য় বা ৩ য় RAID 0 ড্রাইভ, একটি এসএসডি, বা আরও বেশি দ্রুতগতির র‌্যাম নিক্ষেপ করতাম এবং সেরা .exe পারফরম্যান্সটি পেয়ে থাকি - তবে এই ব্যবস্থাগুলি আপনাকে সমতা বা বন্ধ করতে পারে provided এটি একাধিক সংকলক সহ বিকাশ করতে কখনও কখনও সহায়ক। এটি আপনাকে বহনযোগ্য নয় এমন বৈশিষ্ট্য সম্পর্কে সচেতন করতে পারে এবং ত্রুটিগুলি ধরা দেয় যা অন্যথায় সনাক্ত করা যায় না, বা ডিবাগের কোড নষ্ট করার সময় নষ্ট সময়ের দিকে পরিচালিত করে আরও ভাল সংকলক সতর্ক করে / ভুল করেছিল।

আমি লিখেছিলাম এমন কিছু দৃ tight় পারফরম্যান্সের সমালোচনামূলক পূর্ণসংখ্যার কোডের সাথে তুলনা করার চেষ্টা করেছি এবং জিসি -O2 এবং -O3 উভয়ই ব্যবহার করে খুব দ্রুত (22 এস ক্ল্যাং-এলএলভিএম 25 এস) দৌড়েছে। সংকলক সুইচগুলি (জিসিসি বা ঝনঝন) ব্যবহার করে ভাবুন বেশিরভাগ অ-মানক বৈশিষ্ট্য এবং স্থির সতর্কতা। আপনার নিজস্ব প্রজেক্টে, অন্য পিপিএল কোডগুলি সংকলনকারী ব্যাচ নয়, সংকলনের সময়টি সংকলনের সময়কে প্রাধান্য দিলে আপনি আপনার বিল্ড সিস্টেমে কিছু ভুল করছেন। Ccache.samba.org এর মতো সরঞ্জাম রয়েছে যা আপনি প্রায়শই পরিষ্কার করে দিলে সহায়তা করে। সংকলক পরিবর্তন করার সাথে আরেকটি সমস্যা হ'ল টেস্টিং / যাচাইকরণের সমস্ত সময় বিনিয়োগ যা ফেলে দেওয়া হয়।
রব 11311

কোড.google.com/p/distcc হ'ল একটি প্রকল্প যা বেশিরভাগ সময় সংকলন গতিতে পারে, যদি কোনও ডেটা কাঠামোর পরিবর্তনের কারণে বা যাচাইকরণ / যাচাইকরণের কারণে কোনও পুরো লাইব্রেরি পুনরায়
সংযোগের

11

ফলাফল বাইনারি গতির ক্ষেত্রে জিসিসি 4.8 এবং ঝনঝন 3.3 মধ্যে খুব সামান্য পার্থক্য আছে। উভয় সংকলক দ্বারা উত্পন্ন কোড বেশিরভাগ ক্ষেত্রে একইভাবে সম্পাদন করে। এই দুটি সংকলক উভয়ই অন্যটির উপর কর্তৃত্ব করে না।

বেঞ্চমার্কগুলি বলছে যে জিসিসি এবং ঝনঝন মধ্যে একটি গুরুত্বপূর্ণ পারফরম্যান্স ফাঁক কাকতালীয়।

প্রোগ্রামের কার্যকারিতা সংকলক পছন্দ দ্বারা প্রভাবিত হয়। যদি কোনও বিকাশকারী বা বিকাশকারীদের একটি গ্রুপ একচেটিয়াভাবে জিসিসি ব্যবহার করে তবে প্রোগ্রামটি ঝাঁকুনির চেয়ে জিসিসির সাথে কিছুটা দ্রুত চলবে বলে আশা করা যায় এবং এর বিপরীতে।

বিকাশকারী দৃষ্টিকোণ থেকে, জিসিসি 4.8+ এবং ঝনঝন 3.3 এর মধ্যে একটি উল্লেখযোগ্য পার্থক্য হ'ল জিসিসির কাছে -Ogকমান্ড লাইন বিকল্প রয়েছে। এই বিকল্পটি অপ্টিমাইজেশানগুলিকে সক্ষম করে যা ডিবাগিংয়ের সাথে হস্তক্ষেপ করে না, উদাহরণস্বরূপ সঠিক স্ট্যাকের ট্রেস পাওয়া সর্বদা সম্ভব। ঝাঁকুনিতে এই বিকল্পের অনুপস্থিতি কিছু বিকাশকারীদের জন্য একটি অনুকূলকরণ সংকলক হিসাবে ব্যবহার করা ঝাঁকুনিটিকে আরও শক্ত করে তোলে।


ইদানীং, (3.3 এবং 4.8) আমি সংকলনের সময়ের মধ্যে খুব বেশি পার্থক্য দেখছি না। (10 সেকেন্ড থেকে 30 সেকেন্ডের মধ্যে সংকলনের সময় সহ "আমার" প্রোগ্রামগুলিতে)।
alfC

9

এটি নির্ধারণের একমাত্র উপায় এটি চেষ্টা করা। এফডাব্লুআইডাব্লু আমি নিয়মিত জিসিসি ৪.২ (এসএসইয়ের বেশিরভাগ x86-64 কোডের জন্য) এর তুলনায় অ্যাপলের এলএলভিএম জিসিসি 4.2 ব্যবহার করে কিছু সত্যই উন্নতি দেখেছি, তবে বিভিন্ন কোড বেসগুলির জন্য ওয়াইএমএমভি। ধরে নেওয়া যে আপনি x86 / x86-64 এর সাথে কাজ করছেন এবং আপনি শেষ কয়েক শতাংশের বিষয়ে সত্যই যত্নশীল হচ্ছেন তখন আপনারও ইন্টেলের আইসিসি চেষ্টা করা উচিত, কারণ এটি প্রায়শই জিসিসিকে পরাস্ত করতে পারে - আপনি ইন্টেল ডটকম থেকে 30 দিনের মূল্যায়ন লাইসেন্স পেতে পারেন এবং এটি চেষ্টা করুন।


8

জিসিসি 5.2.1 এবং ঝাঁকুনি 3.6.2 এ আমি একটি অদ্ভুত পার্থক্য উল্লেখ করেছি যে আপনার যদি সমালোচনামূলক লুপ থাকে তবে:

for (;;) {
    if (!visited) {
        ....
    }
    node++;
    if (!*node) break;
  }

তারপরে জিসিসি, আটটি বারের সাথে অনুমানমূলকভাবে লুপটি আনরোল করে -O3or -O2ঝাঁকুনি একেবারেই আনারল করবে না। পরীক্ষার এবং ত্রুটির মাধ্যমে আমি জানতে পেরেছিলাম যে আমার প্রোগ্রামের ডেটা সহ আমার নির্দিষ্ট ক্ষেত্রে, তালিকাভুক্তির সঠিক পরিমাণ পাঁচটি তাই সিসি ওভারশট এবং ঝনঝন আন্ডারশট is যাইহোক, ওভারশোটিং পারফরম্যান্সের জন্য আরও ক্ষতিকারক তাই এখানে জিসিসি আরও খারাপ সম্পাদন করেছিল।

আমি কোন ধারণা যদি unrolling পার্থক্য একটি সাধারণ প্রবণতা বা শুধু এমন কিছু বিষয় যা আমার দৃশ্যকল্প নির্দিষ্ট ছিল।

কিছুক্ষণ আগে আমি সিতে পারফরম্যান্স অপ্টিমাইজেশন সম্পর্কে নিজেকে আরও শেখাতে কয়েকজন আবর্জনা সংগ্রহকারী লিখেছি এবং যে ফলাফলগুলি পেয়েছি তা আমার মনে যথেষ্ট ঝাঁকুনির পক্ষে যথেষ্ট। বিশেষত যেহেতু আবর্জনা সংগ্রহ বেশিরভাগ পয়েন্টার তাড়া এবং মেমরি অনুলিপি সম্পর্কে।

ফলাফলগুলি (সেকেন্ডে সংখ্যা):

+---------------------+-----+-----+
|Type                 |GCC  |Clang|
+---------------------+-----+-----+
|Copying GC           |22.46|22.55|
|Copying GC, optimized|22.01|20.22|
|Mark & Sweep         | 8.72| 8.38|
|Ref Counting/Cycles  |15.14|14.49|
|Ref Counting/Plain   | 9.94| 9.32|
+---------------------+-----+-----+

এটি সমস্ত খাঁটি সি কোড এবং সি ++ কোড সংকলন করার সময় আমি উভয়ই সংস্থাগুলির পারফরম্যান্স সম্পর্কে কোনও দাবি করি না।

উবুন্টু 15.10, x86.64, এবং একটি এএমডি ফেনোম (টিএম) II X6 1090T প্রসেসর।


4

মূলত বলতে গেলে, উত্তরটি: এটি নির্ভর করে। বিভিন্ন ধরণের প্রয়োগকে কেন্দ্র করে অনেকগুলি মানদণ্ড রয়েছে।

আমার অ্যাপ্লিকেশনটিতে আমার মানদণ্ডটি হ'ল: জিসিসি> আইসিসি> বিড়ম্বনা।

বিরল আইও রয়েছে, তবে অনেকগুলি সিপিইউ ফ্লোট এবং ডেটা স্ট্রাকচার অপারেশন রয়েছে।

সংকলিত ফ্ল্যাগগুলি হ'ল ওয়াল-জি -ডিএনডিইউবি-ও 3।

https://github.com/zhangyafeikimi/ml-pack/blob/master/gbdt/profile/benchmark

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.