আমি এই প্রশ্নের উত্তর গৃহীত (এবং ভালভাবে আপত্তিকৃত) উত্তরের অংশের সাথে একমত না হয়ে শুরু করতে যাচ্ছি:
জিতযুক্ত কোডটি সঠিকভাবে অনুকূলিত সি ++ (বা রানটাইম ওভারহেড ছাড়া অন্য ভাষা) প্রোগ্রামের চেয়ে ধীর হয়ে চলবে এমন অনেকগুলি কারণ রয়েছে:
রানটাইম সময়ে জেআইটিটিং কোডে ব্যয় করা গণনা চক্রগুলি সংজ্ঞা অনুসারে প্রোগ্রাম প্রয়োগে ব্যবহারের জন্য অনুপলব্ধ।
JITter এর যে কোনও গরম পথ সিপিইউতে নির্দেশ এবং ডেটা ক্যাশের জন্য আপনার কোডের সাথে প্রতিযোগিতা করবে। আমরা জানি যে পারফরম্যান্সের ক্ষেত্রে ক্যাশে প্রাধান্য পায় এবং সি ++ এর মতো নেটিভ ভাষাগুলি সংজ্ঞা অনুসারে এই ধরণের বিতর্ক রাখে না।
একটি রান-টাইম অপ্টিমাইজারের সময় বাজেট অগত্যা একটি সংকলন-সময় অপ্টিমাইজারের তুলনায় অনেক বেশি সীমাবদ্ধ হয় (অন্য একজন মন্তব্যকারী উল্লেখ করেছেন)
বটম লাইন: পরিশেষে, আপনি হবে প্রায় অবশ্যই আপনি C # পারা চেয়ে সি ++ একটি দ্রুত বাস্তবায়ন তৈরি করতে সক্ষম হবেন ।
এখন, এর সাথে বলা হয়েছে যে, অনেক দ্রুত তত পরিমাণে ভেরিয়েবলগুলি যেমন রয়েছে তেমনি দ্রুততর পরিমাণটি প্রমানযোগ্য নয়: টাস্ক, সমস্যা ডোমেন, হার্ডওয়্যার, বাস্তবায়নের মান এবং আরও অনেক কারণ। পারফরম্যান্সের পার্থক্য নির্ধারণ করতে আপনার দৃশ্যের উপর পরীক্ষা করা হবে, এবং তারপরে এটি অতিরিক্ত প্রচেষ্টা এবং জটিলতার জন্য উপযুক্ত কিনা তা স্থির করুন।
এটি একটি দীর্ঘ এবং জটিল বিষয়, তবে আমি সি'র রানটাইম অপটিমাইজারটি দুর্দান্ত যে সম্পূর্ণতার জন্য তা উল্লেখ করার মতো বলে মনে করি এবং রানটাইম সময়ে নির্দিষ্ট গতিশীল অপটিমাইজেশন সম্পাদন করতে সক্ষম যা সি ++ এর সংকলন-সময় সহ সহজলভ্য নয় ( স্থির) অপ্টিমাইজার। এমনকি এটির সাহায্যে, সুবিধাটি এখনও স্থানীয় আবেদনের আদালতে গভীরভাবে থাকে তবে গতিশীল অপ্টিমাইজারটি উপরে বর্ণিত " প্রায় অবশ্যই" যোগ্যতা অর্জনের কারণ ।
-
আপেক্ষিক পারফরম্যান্সের ক্ষেত্রে, আমি অন্যান্য কয়েকটি উত্তরে যে পরিসংখ্যান এবং আলোচনা দেখেছি তাতে আমিও বিরক্ত হয়েছিলাম, তাই আমি ভেবেছিলাম যে আমি উপরে উঠেছি এবং একই সাথে আমি উপরে বর্ণিত বিবৃতিগুলির জন্য কিছু সমর্থন সরবরাহ করব।
এই মানদণ্ডগুলির সমস্যার একটি বিশাল অংশ হ'ল আপনি সি ++ কোড লিখতে পারবেন না যেন আপনি সি # লিখেছেন এবং প্রতিনিধি ফলাফল পাওয়ার প্রত্যাশা করছেন (যেমন, সি ++ এ হাজার হাজার মেমরি বরাদ্দকরণ আপনাকে ভয়ঙ্কর সংখ্যা দিতে চলেছে going)
পরিবর্তে, আমি কিছুটা বেশি আইডেম্যাটিক সি ++ কোড লিখেছি এবং সি # কোড @ উইওয়ের সরবরাহ করা বিপরীতে তুলনা করেছি। আমি সি ++ কোডে দুটি বড় পরিবর্তন করেছি:
1) ব্যবহৃত ভেক্টর :: রিজার্ভ ()
2) উন্নত ক্যাশে লোকাল অর্জনের জন্য 2 ডি অ্যারে 1d সমতল করে (সংহত ব্লক)
সি # (.NET 4.6.1)
private static void TestArray()
{
const int rows = 5000;
const int columns = 9000;
DateTime t1 = System.DateTime.Now;
double[][] arr = new double[rows][];
for (int i = 0; i < rows; i++)
arr[i] = new double[columns];
DateTime t2 = System.DateTime.Now;
Console.WriteLine(t2 - t1);
t1 = System.DateTime.Now;
for (int i = 0; i < rows; i++)
for (int j = 0; j < columns; j++)
arr[i][j] = i;
t2 = System.DateTime.Now;
Console.WriteLine(t2 - t1);
}
রান সময় (রিলিজ): উদ্যোগ: 124ms, পূরণ করুন: 165 মিমি
সি ++ ১৪ (ঝনঝন v3.8 / C2)
#include <iostream>
#include <vector>
auto TestSuite::ColMajorArray()
{
constexpr size_t ROWS = 5000;
constexpr size_t COLS = 9000;
auto initStart = std::chrono::steady_clock::now();
auto arr = std::vector<double>();
arr.reserve(ROWS * COLS);
auto initFinish = std::chrono::steady_clock::now();
auto initTime = std::chrono::duration_cast<std::chrono::microseconds>(initFinish - initStart);
auto fillStart = std::chrono::steady_clock::now();
for(auto i = 0, r = 0; r < ROWS; ++r)
{
for (auto c = 0; c < COLS; ++c)
{
arr[i++] = static_cast<double>(r * c);
}
}
auto fillFinish = std::chrono::steady_clock::now();
auto fillTime = std::chrono::duration_cast<std::chrono::milliseconds>(fillFinish - fillStart);
return std::make_pair(initTime, fillTime);
}
রান সময় (রিলিজ): উদ্যোগ: 398µs (হ্যাঁ, এটি মাইক্রোসেকেন্ডস), পূরণ করুন: 152 মিমি
মোট রান সময়: সি #: 289 মিমি, সি ++ 152 মিমি (প্রায় 90% দ্রুত)
পর্যবেক্ষণ
সি # বাস্তবায়নটিকে একই 1 ডি অ্যারে প্রয়োগের পরিবর্তনে ইনস: 40 মিমি, ভরাট: 171 মিমি, মোট: 211 মিমি ( সি ++ এখনও প্রায় 40% দ্রুত ছিল ) পেয়েছিল ।
যে কোনও ভাষায় "নিয়মিত" কোড লেখার চেয়ে সি ++ তে "ফাস্ট" কোডটি ডিজাইন করা এবং লেখা অনেক কঠিন।
এটি (সম্ভবত) আশ্চর্যজনকভাবে সি ++ তে খারাপ অভিনয় পাওয়া সহজ; আমরা অনারক্ষিত ভেক্টরদের কর্মক্ষমতা দেখেছি। এবং এরকম প্রচুর সমস্যা রয়েছে।
আপনি রানটাইমের সময় যা চলছে তা বিবেচনা করার সময় সি # এর অভিনয়টি বরং দুর্দান্ত। এবং সেই কর্মক্ষমতাটি তুলনামূলকভাবে অ্যাক্সেস করা সহজ।
আরো অকল্পনীয় ডেটার সি ++ এবং C # কর্মক্ষমতা তুলনা: https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=gpp&lang2=csharpcore
নীচের লাইনটি হ'ল সি ++ আপনাকে পারফরম্যান্সের উপর আরও বেশি নিয়ন্ত্রণ দেয়। আপনি কি পয়েন্টার ব্যবহার করতে চান? একটি রেফারেন্স? মেমরি স্ট্যাক? গাদা? গতিশীল পলিমারফিজম বা স্ট্যাটিক পলিমॉर्फিজম (টেমপ্লেট / সিআরটিপি এর মাধ্যমে) দিয়ে কোনও ভিটিবেলের রানটাইম ওভারহেডটি সরিয়ে ফেলুন? C ++ আপনাকে ... Er আছে, পেতে , এই সব পছন্দ (এবং আরো) নিজেকে করতে আদর্শভাবে তাই আপনার সমাধান সেরা ঠিকানাগুলি সমস্যা তুমি সাজ-সরঞ্জাম জলে যে।
নিজেকে অবশ্যই জিজ্ঞাসা করুন কিনা আপনি সেই নিয়ন্ত্রণটি চান বা না, কারণ উপরের তুচ্ছ উদাহরণের জন্যও আপনি দেখতে পাচ্ছেন যে কার্য সম্পাদনের ক্ষেত্রে উল্লেখযোগ্য উন্নতি হলেও এটি অ্যাক্সেস করার জন্য আরও গভীর বিনিয়োগ প্রয়োজন requires