সি # এর চেয়ে সি ++ কত দ্রুত?


245

নাকি এখন অন্য পথে?

আমি যা শুনেছি সেখান থেকে কিছু ক্ষেত্র রয়েছে যেখানে সি # সি ++ এর চেয়ে দ্রুততর বলে প্রমাণিত হয়েছে, তবে আমি নিজেই এটির পরীক্ষা করার সাহস পাইনি।

ভেবেছিলেন আপনার মধ্যে কেউ এই পার্থক্যগুলি বিশদভাবে ব্যাখ্যা করতে পারেন বা আমাকে এই বিষয়ে তথ্যের জন্য সঠিক জায়গায় নির্দেশ করতে পারেন।


7
সুরক্ষিত, আর কোনও এলোমেলো বেঞ্চমার্ক পোস্ট হতে বাধা দিতে। আপনি যদি মনে করেন আপনি নিজের কেসটি তৈরি করতে পারেন তবে এটি করার জন্য আপনার 10 জন প্রতিনিধি প্রয়োজন।
রবার্ট হার্ভে

2
এটি যাইহোক মতামত / যুক্তি হিসাবে বন্ধ হয় না? আমি কি এখনও স্ট্যাকওভারফ্লোতে নেই? (ঘনিষ্ঠতার পরামর্শ দিচ্ছেন না, কেবল কৌতূহলী। আমি এমন প্রশ্নগুলি পছন্দ করি যা মতামতযুক্ত যুক্তিগুলিকে উত্সাহিত করে)
বিল কে ২

1
এটি প্রায় একটি বিস্মৃত প্রশ্ন, প্রদত্ত যে আমরা এমন একটি যুগে বাস করি যেখানে আইএল সিপিপিতে
ডি

এমন একটি ভাষা যা পরিসরে অ্যারে অ্যাক্সেসের বাইরে যাচাই করে তা কখনই ছাড়ায় না।
সেবা আলেকসেয়েভ

@ শেভাআলেকসেয়েভ এটি যে ভাষাটি করে তা সংকলক নয় not সি ++ এর অন্যতম কারণ হ'ল দ্রুত (সুস্পষ্ট বিষয়গুলি বাদে) হ'ল সি ++ সংকলকগুলি গত 35 বছর ধরে (আরও বেশি না হলে) প্রায় ছিল। এমন কিছু নেই যা সময়ের সাথে সাথে সি # সংকলককে আরও ভালভাবে বাধা দেয়। আপনি যে মামলার উল্লেখ করেছেন তার জন্য, দয়া করে এই স্ট্যাকওভারফ্লো.com
ট্র্যাপ করুন

উত্তর:


342

সি # বা জাভা যেমন একটি বাইটোকোড ভিত্তিক ভাষাতে জেআইটি রয়েছে সেটির কোনও কঠোর কারণ নেই কারণ সি ++ কোডের মতো দ্রুত হতে পারে না। তবে সি ++ কোডটি দীর্ঘ সময়ের জন্য উল্লেখযোগ্যভাবে দ্রুত ব্যবহৃত হত এবং আজও অনেক ক্ষেত্রে রয়েছে in এটি মূলত আরও উন্নত জেআইটি অপ্টিমাইজেশানগুলি বাস্তবায়নের জন্য জটিল হওয়ার কারণে এবং সত্যিই দুর্দান্ত শীঘ্রই কেবল এখন পৌঁছে যাচ্ছে।

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

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

ডোনাল্ড নুথ যেমন বলেছিলেন, "অকালীন অপটিমাইজেশন হ'ল সমস্ত মন্দের মূল"। আপনি যদি সত্যিই নিশ্চিতভাবেই জানেন যে আপনার অ্যাপ্লিকেশনটি বেশিরভাগ কার্য সম্পাদন সমালোচনামূলক গাণিতিক সমন্বিত থাকবে এবং এটি বাধা হয়ে দাঁড়াবে এবং এটি অবশ্যই সি ++ তে আরও দ্রুত হতে চলেছে এবং আপনি নিশ্চিত যে সি ++ আপনার অন্যের সাথে বিরোধ করবে না প্রয়োজনীয়তা, সি ++ এর জন্য যান। অন্য যে কোনও ক্ষেত্রে, প্রথমে আপনার অ্যাপ্লিকেশনটিকে যথাযথভাবে প্রয়োগ করার দিকে মনোনিবেশ করুন যে ভাষায় আপনার পক্ষে সবচেয়ে ভাল লাগবে, তারপরে যদি এটি খুব ধীর হয়ে যায় তবে পারফরম্যান্সের বাধা খুঁজে পান এবং তারপরে কোডটি কীভাবে অনুকূলিত করা যায় সে সম্পর্কে চিন্তাভাবনা করুন think সবচেয়ে খারাপ ক্ষেত্রে, আপনাকে একটি বিদেশী ফাংশন ইন্টারফেসের মাধ্যমে সি কোডে কল করার দরকার হতে পারে, সুতরাং আপনার নীচের স্তরের ভাষায় সমালোচনামূলক অংশগুলি লেখার দক্ষতা থাকবে।

মনে রাখবেন যে একটি সঠিক প্রোগ্রামকে অপ্টিমাইজ করা তুলনামূলকভাবে সহজ তবে একটি অনুকূলিত প্রোগ্রামটি সংশোধন করা আরও শক্ত।

গতির সুবিধার প্রকৃত শতাংশ প্রদান অসম্ভব, এটি আপনার কোডের উপর নির্ভর করে। বেশিরভাগ ক্ষেত্রে, প্রোগ্রামিং ভাষার প্রয়োগটি এমনকি কোনও বাধা নয়। এ benchmarks নিন http://benchmarksgame.alioth.debian.org/ সংশয়বাদ একটি মহান চুক্তি সঙ্গে, এই মূলত গাণিতিক কোড, যা সম্ভবত সব সময়ে আপনার কোড অনুরূপ নয় পরীক্ষা।


92
রানটাইমের পরবর্তী সংস্করণগুলিতে << উদ্ধৃত ভাষাগুলির কোডগুলি দ্রুততর হয় </ quot> সংকলকটির আরও ভাল সংস্করণ দ্বারা সংকলিত কোডগুলিও দ্রুততর হবে।
মার্টিন ইয়র্ক

47
প্রকৃতপক্ষে কমপক্ষে একটি কারণ রয়েছে: জেআইটি দ্রুত হওয়া দরকার, এবং সি ++ কম্পাইলারের জন্য উপলব্ধ বিভিন্ন উন্নততর অপ্টিমাইজেশনে সময় ব্যয় করতে পারে না।
নেমানজা ত্রিফুনোভিচ

63
"তবে অতিরিক্ত-অনুকূলকরণের কারণে সাধারণত ত্রুটি বাড়ে।" [উদ্ধৃতি মরিয়াভাবে প্রয়োজন]। আমি একটি জাতীয় পরীক্ষাগারে কাজ করি, এবং আমরা আমাদের কোডের বাইরে নরকটি অনুকূল করি। এটি সাধারণত বগি কোডে ফলাফল করে না।
টড গাম্বলিন

35
"একটি সঠিক প্রোগ্রামকে অপ্টিমাইজ করা তুলনামূলকভাবে সহজ, তবে একটি অনুকূলিত প্রোগ্রামটি সংশোধন করা আরও শক্ত" "
গ্রেডবট

20
ইনজ: নিশ্চিত না যে আপনি সেখানে সঠিক পথে রয়েছেন। হ্যাঁ, সি # অন্য ভাষায় প্রয়োগ করা হয়েছে, তবে জেআইটি সংকলক মেশিন কোড তৈরি করছে, সুতরাং এটি কোনও অনুবাদিত ভাষা নয়। সুতরাং এটি এর সি ++ বাস্তবায়ন দ্বারা সীমাবদ্ধ নয়। আমি নিশ্চিত নই যে আপনি কেন কিছু ম্যানেজারকে অন্তর্নিহিতভাবে এটি আরও দ্রুততর করে তুলছেন বলে মনে করেন।
মার্টিন প্রোবস্ট

202

সি # দ্রুত নাও হতে পারে তবে এটি আপনাকে / আমাকে আরও দ্রুত করে তোলে। আমি যা করি তার জন্য এটি সবচেয়ে গুরুত্বপূর্ণ পরিমাপ। :)


68
হাহাহা, বিষয়টিতে ল্যারি ওয়াল দ্বারা একটি দুর্দান্ত উক্তি আছে। তিনি পার্ল সম্পর্কে কথা বলছেন, তবে ভাষা ও পারফরম্যান্সের সাথে সম্পর্কিত সমস্ত আলোচনার জন্য এটি চিন্তা করা যেতে পারে: ".. ফোর্টরান এবং সি এর মতো কমপ্লিট কম্পিউটার ভাষাগুলি ব্যয়বহুল কম্পিউটার হার্ডওয়্যারের দক্ষ ব্যবহারের জন্য ডিজাইন করা হয়েছিল। বিপরীতে, পার্ল ডিজাইন করা হয়েছে ব্যয়বহুল কম্পিউটার প্রোগ্রামারগুলির দক্ষ ব্যবহার করুন "
ফালাইনা

60
১. "সি # সি ++" এর চেয়ে অনেক দ্রুত "২" এটি সত্য হতে পারে না "" 1. নিশ্চিত এটি "২" পারে কতটা? " 1. "সাধারণত 3-4 মাস দ্বারা"
দিমিত্রি এস

2
সি ++ এর জন্য যা আপনার ব্যবহারের লাইব্রেরিগুলির উপর নির্ভর করে, সি # সাধারণত দ্রুত হয় না, নেট হয়, যখন আপনি উত্পাদনশীলতার কথা বলছেন
আয়ন টোডেরেল

আপনি কিছু কোড লিখতে সি এর পরিবর্তে পাইথন ব্যবহার করতে পারেন এটি একই কারণ ... তবে কিছু ভারী গণনা তৈরি করার পরে আপনি পারফরম্যান্সের পার্থক্য অনুভব করতে পারেন।
Ch3shire

আপনি কি অভ্যস্ত তা উপর নির্ভরশীল। আমি সি # এর চেয়ে সি ++ তে আরও দ্রুত প্রোগ্রাম করি। গ্রন্থাগার জ্ঞান যেহেতু আপনি মৌলিক কাজের জন্য চাকাটি পুনর্বিবেচনা করতে চান না এটির একটি বড় অংশ। সি / সি ++ প্রধান সমস্যা ছিল পয়েন্টার পরিচালনা যা স্মার্ট পয়েন্টারগুলির সাথে বেশ সমাধান করা হয়েছে। বলা হয়েছে যে সি ++ সিরিয়াসে। নেট এবং জাভা অফার হিসাবে একটি বিস্তৃত গ্রন্থাগার নেই এবং এটি ব্যাপকভাবে বিকাশকে গতিতে পারে। এটি শিগগিরই সমাধান করা যাচ্ছে না যেহেতু এই সমস্ত ছেলেরা লাইব্রেরি এক্সটেনশনের পরিবর্তে টেম্পলেট উন্নতিতে তাদের সময় ব্যয় করতে পছন্দ করে।
gast128

87

এটি পাঁচটি কমলা দ্রুত। বা বরং: কম্বলের কোনও উত্তর দেওয়া যাবে না। সি ++ হ'ল একটি স্ট্যাটিকালি সংকলিত ভাষা (তবে তারপরেও প্রোফাইল গাইডেড অপ্টিমাইজেশনও রয়েছে), সি # একটি জেআইটি সংকলক দ্বারা সহায়তা করে। অনেকগুলি পার্থক্য রয়েছে যে "কত দ্রুত" এর মতো প্রশ্নের উত্তর দেওয়া যায় না, এমনকি বিশালতার অর্ডার দিয়েও নয়।


177
আপনার আপত্তিজনক পাঁচটি কমলার দাবি সমর্থন করার কোনও প্রমাণ পেয়েছেন কি? আমার পরীক্ষাগুলি টেমপ্লেট মেটাপ্রোগ্র্যামিং করার সময় 3 টি উন্নত আমেরিকান দিয়ে সমস্তত 2 টি কমলালেবাকে নির্দেশ করে।
অ্যালেক্স

42
খামিরের সময় তিনি দাবী করছেন না যে এটি তার দৈর্ঘ্যের দ্রুততা অবধি ors
ক্রিস

11
আমার অভিজ্ঞতা থেকে এটি বরং 5.2 কমলা। তবে এটি আপনার ব্যবহৃত ফল-ও-মিটার থেকে নির্ভর করে।
ডিও এফ

4
আপডেট করুন, স্ট্যাকওভারফ্লো নিজেই গণ্ডগোল পেয়েছে এবং মন্তব্যগুলি অদক্ষভাবে পরিচালনা করে, এভাবে কম কলা (300 টি কলা যতটা খারাপ হওয়া উচিত): মেটা.স্ট্যাকেক্সেঞ্জ
সেকশনস

87

আমি এই প্রশ্নের উত্তর গৃহীত (এবং ভালভাবে আপত্তিকৃত) উত্তরের অংশের সাথে একমত না হয়ে শুরু করতে যাচ্ছি:

জিতযুক্ত কোডটি সঠিকভাবে অনুকূলিত সি ++ (বা রানটাইম ওভারহেড ছাড়া অন্য ভাষা) প্রোগ্রামের চেয়ে ধীর হয়ে চলবে এমন অনেকগুলি কারণ রয়েছে:

  • রানটাইম সময়ে জেআইটিটিং কোডে ব্যয় করা গণনা চক্রগুলি সংজ্ঞা অনুসারে প্রোগ্রাম প্রয়োগে ব্যবহারের জন্য অনুপলব্ধ।

  • 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


16
@ কুনাক্স মন্তব্যের জন্য আপনাকে ধন্যবাদ। অবশ্যই এটি "বাস্তব প্রোগ্রাম" নয়। মানদণ্ডের বিন্দুটি অশোধক ছিল একটি সি # বেঞ্চমার্ক এই পৃষ্ঠায় অন্য যে কোনও জায়গায় প্রস্তাব দেওয়া হয়েছিল যে জেআইটিড কোডটি কোনওরকম দেশীয় তুলনায় দ্রুততর - এটি নয় এবং বেঞ্চমার্কটি সম্ভাব্যভাবে নতুন লোককে বিভ্রান্ত করছে।
U007D

9
@ কিউনাক্স আপনাকে কেন এমন লিখতে হবে? এটি আপনার মতো লোক যারা আমাকে স্ট্যাকওভারফ্লো অপছন্দ করে।
মারকাস কানপেন জোহানসন

5
@ মারকুসনাপেন জোহানসন আমার খুব খারাপ দিন কাটছিল;), আমিও একজন মানুষ, আমার ডাউনটোট সরিয়েছি, তবুও আমার মতামত এখনও প্রযোজ্য। ওহ দয়া করে কিছু অপছন্দ করবেন না কারণ কিছু "বোকা" লোক আছে :)। একটি সুন্দর একটি আছে।
কোউনক্স

9
সম্পূর্ণ বিভ্রান্ত ব্যাঞ্চমার্ক। সি ++ সংস্করণে আপনি কেবল মেমরির কিছু অংশ সংরক্ষণ করছেন (এবং তারপরে অপারেশনটি মাইক্রোসেকেন্ডগুলি কার্যকর করতে কীভাবে লাগে) অবাক করে দিন। সি # সংস্করণে আপনি 5000 টি আরআরএইস তৈরি করছেন (স্মৃতিতে বস্তুগুলি ইনস্ট্যান্ট করছে)। সি ++ সি # এর চেয়ে দ্রুত ... তবে পার্থক্য কোথাও ৪০% এর কাছাকাছি নেই ... এখনই এটি <10% এর পরিসরে আরও বেশি। আপনার উদাহরণটি যা বোঝায় তা হ'ল প্রোগ্রামারদের তাদের পছন্দের ভাষার সাথে লেগে থাকা উচিত (এবং আপনার প্রোফাইল থেকে এটি স্পষ্টতই বোঝা যায় যে আপনি কর্মজীবন সি ++ প্রোগ্রামার are সি # তে আপনি 2 ডি অ্যারে করতে পারেন int[,]... উদাহরণ সহ অনুসরণ করুন।
নিকিব 3ro

3
আমি যা বলতে পারি তা থেকে, আপনার সি ++ উদাহরণের কোডটি আক্ষরিকভাবে কেবল সময়ের আগেই স্মৃতি বরাদ্দ করে। প্রোপার সি # বাস্তবায়নে কেবল 'তালিকা <ডাবল> আরস = নতুন তালিকা <ডাবল> (রাউস * সিওএলএস)' লিখবে যা 1 মাত্রিক বিন্যাসে 2 মাত্রিক অ্যারে সূচকের জন্য প্রয়োজনীয় মেমরির বরাদ্দ করে (যেমন, আপনি সি ++ তে কী করেছেন)। দ্বি-মাত্রিক অ্যারে বরাদ্দ করার এবং ম্যানুয়ালি এটিকে সমতল করার কোনও কারণ নেই - আপনার প্রাক-পরীক্ষায় প্রচুর পরিমাণে পুনরাবৃত্তি হ'ল ছিটেফোঁটা পারফরম্যান্সের কারণ। আমি কল্পনা করি যে ওভারহেডটি সি # তে আরও বেশি হবে তবে যথেষ্ট পরিমাণে নয়।
জেডিএসওয়েটবিট

62

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

আর একটি বিষয় হ'ল জেআইটি সংকলক উন্নততর অপ্টিমাইজেশানগুলি করার জন্য খুব বেশি সময় ব্যয় করতে পারে না, কারণ এটি রানটাইম চলমান, এবং খুব বেশি সময় নিলে শেষ ব্যবহারকারী এটি লক্ষ্য করবে। অন্যদিকে, একটি সি ++ সংকলক সংকলন সময়ে অপ্টিমাইজেশন করার প্রয়োজন সমস্ত সময় আছে। এই উপাদানটি আইএমএইচওর তুলনায় মেমরির তুলনায় অনেক কম তাৎপর্যপূর্ণ।


6
এক প্রকল্পে আমাদের প্রচুর পরিমাণে ডেটা মাইন করতে হয়েছিল, একইসাথে অনেকগুলি জিবি মেমরি রাখা এবং এটির জন্য ব্যয়বহুল গণনা সম্পাদন করা - এটির জন্য সমস্ত বরাদ্দের যথাযথ নিয়ন্ত্রণ প্রয়োজন, সি ++ কেবলমাত্র একমাত্র পছন্দ ছিল। সি ++ এর জন্য +1। অন্যদিকে, এটি ছিল কেবল একটি প্রকল্প, আমরা আমাদের বেশিরভাগ সময় লেখার সিস্টেমগুলিতে ব্যয় করেছি যা ধীর সিমুলেটারগুলির সাথে যোগাযোগ করেছিল, এবং ডিবাগিং একটি দুঃস্বপ্ন হতে পারে, তাই আমি আশা করি আমরা অন্য সমস্তগুলির জন্য একটি প্রোগ্রামার-সময়ের-অনুকূলকরণের ভাষাটি ব্যবহার করতে পারতাম জিনিসপত্র.
বোগাতিয়ার

7
@ ইঞ্জহেেনরিকসেন: আমি ডিসপোজ প্যাটার্নটি সম্পর্কে ভালভাবে অবগত, তবে এটি ম্যানেজড স্মৃতিতে মোটেই সহায়তা করে না।
নেমানজা ত্রিফুনোভিচ

10
@ ইঞ্জহেেনরিকসেন এটির নিষ্পত্তি কেবলমাত্র তা নিশ্চিত করে যে ডিসপোজ পদ্ধতিটি ডেকে আনা হয়েছে। নিষ্পত্তি কখনও আবর্জনা সংগৃহীত স্মৃতি মুক্ত করে না। নিষ্পত্তি পদ্ধতিটি কেবল ফাইল হ্যান্ডলগুলির মতো নিয়ন্ত্রণহীন সংস্থানগুলি সাফ করার জন্য এবং এর মেমরি পরিচালনার কোনও যোগসূত্র নেই।
ডগ 65536

1
@ নিমঞ্জাটি ট্রিফুনোভিচ: "জেআইটি সংকলক উন্নততর অপ্টিমাইজেশানগুলি করার জন্য খুব বেশি সময় দিতে পারে না"। আপনি কি এমন কিছু অপ্টিমাইজেশন উল্লেখ করতে পারেন যা জেআইটি দ্বারা করা হয় না কারণ তারা খুব বেশি সময় নেয়?
জন হ্যারোপ

5
@ ব্যবহারকারী 3800527: এমনকি যদি র‌্যাম যুক্ত করা সর্বদা সম্ভব ছিল তবে (এবং এটি নয় - কল্পনা করুন যে মাইক্রোসফ্ট প্রতিটি এমএস অফিসের ব্যবহারকারীকে র‌্যাম যোগ করে) সমস্যার সমাধান করবে না। মেমোরি হায়ারারিকাল এবং একটি সি # প্রোগ্রামে সি ++ এর চেয়ে অনেক বেশি ক্যাশে মিস হবে।
নেমানজা ত্রিফুনোভিচ

35

একটি নির্দিষ্ট দৃশ্য যেখানে সি ++ এর এখনও উপরের হাত রয়েছে (এবং আগামী কয়েক বছর ধরে তা হবে) তখন ঘটে যখন বহুবর্ষ সংক্রান্ত সিদ্ধান্তগুলি সংকলনের সময় পূর্বনির্ধারিত করা যেতে পারে।

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

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

এই জাতীয় ক্ষেত্রে (এবং স্বীকার করা যায় যে তারা প্রায়শই বিশেষ সমস্যা ডোমেনের মধ্যে সীমাবদ্ধ থাকে), সি ++ এবং তুলনীয় ভাষার বিরুদ্ধে সি ++ জিতে যায়।


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

3
+1 আমার সি # সহকর্মীদের যারা এটির তাত্পর্যটি উপলব্ধি করতে সক্ষম করবে এমন উপায়ে এমন সামান্য সি ++ জানেন তাদের কাছে এটি ব্যাখ্যা করতে আমার সর্বদা সমস্যা হয়। আপনি বরং এটি সুন্দরভাবে ব্যাখ্যা করেছেন।
রোমান স্টারকভ

9
@ ক্রট্রেসি: আপনি উচ্চ-পারফরম্যান্স কম্পিউটিং অ্যাপ্লিকেশন ছাড়াই আপনার বাজি তৈরি করছেন। আবহাওয়ার পূর্বাভাস, বায়োইনফরম্যাটিকস এবং সংখ্যাসূচক সিমুলেশন বিবেচনা করুন। এই অঞ্চলগুলিতে সি ++ এর পারফরম্যান্সের লিড সঙ্কুচিত হবে না , কারণ অন্য কোনও কোড উচ্চ বিমূর্ততার একই স্তরের তুলনামূলক কর্মক্ষমতা অর্জন করতে পারে না।
কনরাড রুডল্ফ

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

5
@ ব্যবহারকারী 3800527 আমি মনে করি আপনি এই উত্তরের পুরো পয়েন্টটি মিস করছেন। অবশ্যই আপনি এ্যাপ্যাপুলেশন ভেঙে এবং নিম্ন-স্তরের কাঠামোতে নেমে এটিকে ঘিরে কাজ করতে পারেন - আপনি যে কোনও ভাষায় এসেম্বলি লিখতে পারেন। যে জিনিসটি সি ++ (প্রায়) অনন্য এবং উচ্চ-পারফরম্যান্স প্রোগ্রামিংয়ের জন্য অনন্যভাবে উপযুক্ত করে তোলে তা হ'ল আপনি রান-টাইম ব্যয় ছাড়াই উচ্চ-স্তরের বিমূর্ততা তৈরি করতে পারেন । প্রিমিয়াম পারফরম্যান্স পেতে আপনাকে সি ++ তে এসেম্বলি-জাতীয় কোড লেখার দরকার নেই: একটি ভাল-লিখিত সি ++ এ হ্যান্ড-লিখিত লুপের মতো দক্ষ হবে। এটি কখনই সি # তে থাকবে না। sort(arr, generic_comparer)
কনরাড রুডল্ফ

20

সি ++ (বা সেই বিষয়টির জন্য সি) আপনাকে আপনার ডেটা স্ট্রাকচারের উপর সূক্ষ্ম-দানা নিয়ন্ত্রণ দেয়। আপনি যদি বিট-ট্যুইডল করতে চান তবে আপনার সেই বিকল্প রয়েছে। জাভা / .NET লাইব্রেরির অভ্যন্তরীণ ডেটা কাঠামো ব্যবহার করে এমন বিশাল পরিচালিত জাভা বা .NET অ্যাপ্লিকেশনগুলি (OWB, ভিজ্যুয়াল স্টুডিও 2005 ) ব্যাগগুলি সাথে রাখে। আমি ঘনক বা ইটিএল ডিজাইনের জন্য 400 এমবি র্যাম এবং বিআইডিএস ব্যবহার করে ওডাব্লুবি ডিজাইনার সেশনগুলি 100 এমবি'র মধ্যেও আসতে দেখেছি ।

পূর্বাভাসযোগ্য কাজের চাপে (যেমন বেশিরভাগ মানদণ্ড যা কোনও প্রক্রিয়া বহুবার পুনরায় পুনঃস্থাপন করে) একটি জেআইটি আপনাকে এমন কোড পেতে পারে যা যথেষ্ট পরিমাণে অনুকূলিত হয়েছে যে কোনও ব্যবহারিক পার্থক্য নেই।

আইএমও বৃহত অ্যাপ্লিকেশনগুলিতে পার্থক্যটি এতটা JIT নয় যে ডেটা স্ট্রাকচারটি কোড নিজেই ব্যবহার করছে। যেখানে কোনও অ্যাপ্লিকেশন মেমরির ভারী আপনি কম দক্ষ ক্যাশে ব্যবহার পাবেন। আধুনিক সিপিইউগুলিতে ক্যাশে মিস করা বেশ ব্যয়বহুল। সি বা সি ++ সত্যই জিতে যেখানে আপনি সিপিইউ ক্যাশে দিয়ে সুন্দরভাবে খেলতে আপনার ডেটা স্ট্রাকচারের ব্যবহারটি সর্বোত্তম করতে পারেন।


19

গ্রাফিক্সের জন্য মানক সি # গ্রাফিক্স শ্রেণি সি / সি ++ এর মাধ্যমে জিডিআই অ্যাক্সেস করার চেয়ে ধীর গতিযুক্ত। আমি জানি যে সেটের প্রতি ভাষাটির সাথে আরও কিছু নেই। এর সাথে.

গ্রাফিক্স লাইব্রেরি কত দ্রুত হয় তা দেখতে আমাদের একটি সাধারণ বেঞ্চমার্ক রয়েছে এবং এটি কেবল একটি উইন্ডোতে এলোমেলো লাইন আঁকছে। সি ++ / জিডিআই এখনও 10000 লাইনের সাথে চটজলদি রয়েছে যখন সি # / গ্রাফিক্স রিয়েল-টাইমে 1000 করতে অসুবিধা হয়।


5
আমি আপনার উত্তর দ্বারা আগ্রহী ছিল। আপনি কি অনিরাপদ কোড এবং লকব্যাটগুলির সাথে একই বেনমার্কটি পরীক্ষা করেছেন এবং এলোমেলো লাইন নিজেই আঁকছেন? এখন এটি দেখতে আকর্ষণীয় বিষয় হবে।
পেডারি

2
পছন্দ করুন সর্বাধিক প্রাথমিক পদ্ধতিতে জিডিআই এবং। নেট.গ্রাফিক্স ব্যবহার করে ics "নিজেকে এলোমেলো রেখাগুলি আঁকিয়ে" বোঝানোর অর্থ কী?
কিউবিজিজেড

1
তারপরে সি # কত দ্রুত হতে পারে তার জন্য আরও বাস্তবসম্মত মেট্রিকগুলি পেতে আপনার সম্ভবত এটি পরীক্ষা করে বিবেচনা করা উচিত। কৌশলটির একটি সুন্দর ওভারভিউ এখানে দেওয়া হয়েছে: bobpowell.net/lockingbits.htm
পেডারি

6
আমরা যা করতে চাই তা নয়, নিজেরাই একটি ফ্রেম বাফারে পৃথক পিক্সেল রেখেছি। যদি আপনাকে নিজেরাই সব কিছু প্রয়োগ করতে হয় তবে কোডের এপিআই / প্ল্যাটফর্ম থাকার বিষয়টি কী? আমার জন্য এটি একটি অ-যুক্তি। অঙ্কন রেখাগুলির জন্য আমাদের কখনই জিডিআই-তে ফ্রেমবফারে আলাদা পিক্সেল লাগানোর দরকার ছিল না এবং আমরা এটি নেট করারও পরিকল্পনা করছি না ET আমার দৃষ্টিতে আমরা একটি বাস্তববাদী মেট্রিক ব্যবহার করেছি এবং। নেট ধীর হয়ে গেছে।
কিউবিজিজেড

1
ঠিক আছে, ব্লব সনাক্তকরণ কী তা সম্পর্কে আমি কেবলমাত্র একটি সামান্য ধারণা পেয়েছি, তবে কেবল একটি সময় উল্লেখ করে কিছুই প্রমাণ করা যায় না। আপনি কি সি ++ তে একটি লিখেছেন? জাভাস্ক্রিপ্টে? এবং সেগুলিকে সি # এর সাথে তুলনা করুন? এবং এর বাইরেও, আমি মনে করি না যে ব্লব সনাক্তকরণ অনেকগুলি গ্রাফিক্সের আদিম ব্যবহার করে। ভুল হলে আমাকে সংশোধন করুন, তবে আমি অনুমান করি এটি পিক্সেলগুলিতে ক্রিয়াকলাপের পরিসংখ্যান সংক্রান্ত অ্যালগোরিদম।
কিউবিজিজেড

13

আবর্জনা সংগ্রহের মূল কারণ হ'ল জাভা রিয়েল-টাইম সিস্টেমের জন্য ব্যবহার করা যাবে না।

  1. জিসি কখন হবে?

  2. এতে কতক্ষণ সময় লাগবে?

এটি অ-সংঘবদ্ধ


5
আমি কোনও বিশাল জাভা অনুরাগী নই তবে জাভা কোনও বাস্তব-সময়ের বান্ধব জিসি ব্যবহার করতে পারে না বলে কিছু নেই।
জ্যান লিংস

5
আপনি যদি খেয়াল রাখেন তবে প্রচুর রিয়েল-টাইম জিসি বাস্তবায়ন রয়েছে। (জিসি এমন একটি অঞ্চল যা গবেষণামূলক কাগজগুলি দিয়ে উপচে
পড়েছে

এফডাব্লুআইডাব্লু, রিচার্ড জোনস তাঁর আবর্জনা সংগ্রহের বইয়ের একটি আপডেট সংস্করণ প্রকাশ করেছেন যা অন্যান্য জিনিসের মধ্যে রয়েছে অত্যাধুনিক বাস্তব-সময়ের জিসি ডিজাইনগুলি covers
জন হ্যারোপ

11
এটি একটি আজেবাজে যুক্তি, উইন্ডোজ (এবং লিনাক্স) রিয়েল টাইম ওএস নয়। আপনার সি ++ কোডটি যে কোনও সময় 18 টি এমএস স্লটের জন্যও সরিয়ে নেওয়া যেতে পারে।
হেন্ক হলটারম্যান

2
@ হেনকহোল্টারম্যান সত্য, তবে আপনি সর্বদা সমাবেশে একটি বুট-লোডার লিখতে পারেন, আপনার অ্যাপ্লিকেশনটির জন্য এটি একটি কার্নেল বুটস্ট্র্যাপের সাথে টাই করতে পারেন এবং আপনার সি ++ অ্যাপ্লিকেশনগুলি সরাসরি হার্ডওয়্যার (আরটি বিটিডব্লু) এর বিরুদ্ধে কার্যকর করতে পারেন। আপনি সি # তে এটি করতে পারবেন না এবং এমন কোনও প্রচেষ্টা যা আমি কেবল # # তে প্রাক-সংকলিত সমাবেশ দেখেছি এবং একটি টন সি কোড ব্যবহার করেছি, যা সি # ব্যবহার করা পয়েন্ট-কম করে। এই সমস্ত কিছু পড়া মজার মজার, কারণ সি # .NET কাঠামো ছাড়া সত্যই অকেজো।
zackery.fix

11

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


1
সি ++ এ, আপনার কাছে বিভিন্ন বরাদ্দ পদ্ধতি ব্যবহারের বিকল্প রয়েছে, সুতরাং সি # তে মেমরি কীভাবে বরাদ্দ করা হয়েছিল (এওটি?) তার উপর নির্ভর করে, এটি সি ++ তে একইভাবে (তবে আরও দ্রুত) করা যেতে পারে।
zackery.fix

5
@ জ্যাকারি.ফিক্স। নেট গাদা বরাদ্দকরণের একটি আকর্ষণীয় প্রান্ত রয়েছে, কারণ এটি কেবলমাত্র একটি নতুন অবজেক্ট বরাদ্দ করার জন্য একটি পয়েন্টার স্থানান্তর করতে হবে। সংযোগকারী আবর্জনা সংগ্রাহকের কারণে এটি কেবল সম্ভব। অবশ্যই আপনি সি ++ এ একই জিনিস করতে পারেন, তবে সি ++ এটি করে না। আপনি কীভাবে একই যুক্তিটি ব্যবহার করতে পারেন তা মজার বিষয় "সি # পারলেও পারে না, তাই এটি আবর্জনা" এবং "সি ++ না, তবে এটি হতে পারে, তাই এটি দুর্দান্ত"
লুয়ান

9

যথারীতি এটি প্রয়োগের উপর নির্ভর করে। এমন কেস রয়েছে যেখানে সি # সম্ভবত উপেক্ষিতভাবে ধীর গতিযুক্ত এবং অন্যান্য ক্ষেত্রে যেখানে সি ++ 5 বা 10 গুণ বেশি দ্রুত, বিশেষত এমন ক্ষেত্রে যেখানে অপারেশনগুলি সহজেই সিমড করা যায়।


ভিএমএসের জন্য সেরা কেস উত্পন্ন কোডের রান-টাইম সংকলন হবে (উদাহরণস্বরূপ রান সময়ে পড়া নিয়মিত এক্সপ্রেশনটির সাথে মেলে) কারণ স্ট্যাটিকালি সংকলিত ভ্যানিলা সি ++ প্রোগ্রামগুলি কেবলমাত্র ব্যাবহার করতে পারে কারণ তাদের মধ্যে একটি জেআইটি সংকলক অন্তর্নির্মিত নেই
জোন হ্যারোপ

ভবিষ্যতের থেকে দ্রষ্টব্য: .NET- এর প্রায় 2014 সাল থেকে সিমডি এবং বন্ধুদের জন্য সমর্থন রয়েছে, যদিও এটি ব্যাপকভাবে ব্যবহৃত হয় না।
লুয়ান

9

আমি জানি আপনি যা চেয়েছিলেন তা তা নয়, তবে সি # টি প্রায়শই সি ++ এর চেয়ে দ্রুত লেখার জন্য , যা বাণিজ্যিক সেটিংয়ে একটি বড় বোনাস।


2
আমি বলি এটি বেশিরভাগ সময়েই দ্রুত হয় :)
ট্র্যাপ

8

সি / সি ++ প্রোগ্রামগুলিতে যেখানে আরও বড় অ্যারে বা ভারী লুপিং / পুনরাবৃত্তি (অ্যারেগুলি (যে কোনও আকারের)) এর মধ্যে রয়েছে সেখানে আরও ভাল পারফর্ম করতে পারে can এই কারণেই গ্রাফিকগুলি সি / সি ++ এ সাধারণত আরও দ্রুত হয়, কারণ ভারী অ্যারে ক্রিয়াকলাপগুলি প্রায় সমস্ত গ্রাফিক্স অপারেশনকেই নির্দেশ করে। সমস্ত সুরক্ষা চেকের কারণে .NET কুখ্যাতভাবে অ্যারে ইনডেক্সিং অপারেশনগুলিতে ধীরে ধীরে এবং বহু-মাত্রিক অ্যারেগুলির জন্য এটি বিশেষভাবে সত্য (এবং, হ্যাঁ, আয়তক্ষেত্রাকার সি # অ্যারেগুলি জেগড সি # অ্যারের চেয়েও ধীর গতির)।

সি / সি ++ এর বোনাসগুলি সর্বাধিক উচ্চারিত হয় যদি আপনি সরাসরি পয়েন্টারগুলির সাথে লেগে থাকেন এবং বুস্ট std::vectorএবং অন্যান্য উচ্চ-স্তরের পাত্রে পাশাপাশি inlineপ্রতিটি ছোট ছোট কার্যক্রমে এড়ান। যখনই সম্ভব পুরানো-স্কুল অ্যারে ব্যবহার করুন। হ্যাঁ, আপনি উচ্চ-স্তরের পাত্রে এড়াতে জাভা বা সি # তে একই কাজটি করার জন্য আপনার আরও কোড লাইনগুলির প্রয়োজন হবে। আপনার যদি গতিশীল আকারের অ্যারে প্রয়োজন হয় তবে আপনাকে কেবল new T[]একটি সম্পর্কিত delete[]বিবৃতি দিয়ে জুড়তে হবে (বা ব্যবহার করুন)std::unique_ptr) অতিরিক্ত গতির দাম হ'ল আপনার আরও যত্ন সহকারে কোডিং করতে হবে। তবে বিনিময়ে আপনি নিজেকে ম্যানেজড মেমোরি / আবর্জনা সংগ্রহকারীর ওভারহেড থেকে মুক্তি দিতে পারেন যা জাভা এবং .NET উভয়ই ভারী অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামগুলি কার্যকর করার সময় সহজেই 20% বা তার বেশি হতে পারে, পাশাপাশি সেই বিশাল পরিচালিত মেমরি অ্যারে সূচকের ব্যয়। সি ++ অ্যাপস নির্দিষ্ট কিছু ক্ষেত্রে কিছু নিফটি সংকলক সুইচ থেকেও উপকৃত হতে পারে।

আমি সি, সি ++, জাভা এবং সি # তে বিশেষজ্ঞ প্রোগ্রামার। আমি সম্প্রতি 3 টি ভাষায় ঠিক একই অ্যালগরিদমিক প্রোগ্রামটি বাস্তবায়নের বিরল ঘটনাটি পেয়েছি। প্রোগ্রামটিতে প্রচুর গণিত এবং বহুমাত্রিক অ্যারে অপারেশন ছিল। আমি 3 টি ভাষায় এটিকে ভারীভাবে অনুকূলিত করেছি। ফলাফলগুলি আমি সাধারণত কম কঠোর তুলনায় যা দেখি তার বৈশিষ্ট্য ছিল: জাভা সি # এর চেয়ে প্রায় 1.3x দ্রুত (বেশিরভাগ জেভিএম সিএলআরের তুলনায় আরও অনুকূলিত), এবং সি ++ কাঁচা পয়েন্টার সংস্করণটি সি # এর চেয়ে প্রায় 2.1x দ্রুত এসেছিল। মনে রাখবেন যে সি # প্রোগ্রামটি কেবল নিরাপদ কোড ব্যবহার করেছিল my এটি আমার অভিমত যে আপনি unsafeকীওয়ার্ডটি ব্যবহারের আগে এটিও সি ++ এ কোড করতে পারেন ।

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


3
"আপনাকে কেবলnew T[]delete[] কোনও প্রাসঙ্গিকের সাথে জুড়তে হবে " - না আপনি করবেন না। আছে std::unique_ptrকি যে আপনার জন্য।
emlai

আপনি গ্রাফিকগুলিতে কিছু লিখেছেন বলে মনে করছেন কেন সি # তে নিরাপদ কোড লিখুন, আপনি কি অনিরাপদ কোড ব্যবহার করে আবার তুলনা করার বিষয়টি বিবেচনা করেছেন?
ব্যবহারকারী 3800527

7

> আমি যা শুনেছি তা থেকে ...

আপনি যা শুনেছেন তা বিশ্বাসযোগ্য কিনা তা সিদ্ধান্ত নেওয়ার ক্ষেত্রে আপনার অসুবিধা বলে মনে হচ্ছে এবং আপনি যখন এই সাইটে থাকা প্রতিক্রিয়ার মূল্যায়ন করার চেষ্টা করবেন তখনই সেই অসুবিধাটি পুনরাবৃত্তি হবে।

আপনি এখানে কীভাবে সিদ্ধান্ত নেবেন যে লোকেরা এখানে যা বলেছে তা আপনি মূলত যা শুনেছেন তার চেয়ে কম বা বিশ্বাসযোগ্য?

একটি উপায় প্রমাণ জিজ্ঞাসা করা হবে ।

কেউ দাবী "কিছু এলাকায় যা C # এর দ্রুত সি চেয়ে প্রমাণ হয় ++," যখন তাদেরকে জিজ্ঞেস কেন তারা যে বলে , তাদেরকে জিজ্ঞেস আপনি পরিমাপ দেখানোর জন্য, তাদেরকে জিজ্ঞেস আপনি প্রোগ্রাম দেখানোর জন্য। কখনও কখনও তারা কেবল একটি ভুল করতে হবে। কখনও কখনও আপনি খুঁজে পাবেন যে তারা সত্য হিসাবে প্রদর্শিত হতে পারে এমন কিছু ভাগ না করে কেবল একটি মতামত প্রকাশ করছে।

প্রায়শই তথ্য এবং মতামত লোকেরা যা দাবি করে তাতে মিশে যায় এবং আপনাকে কোনটি বাছাই করে চেষ্টা করতে হবে। উদাহরণস্বরূপ, এই ফোরামের জবাব থেকে:

  • " বেশিরভাগ সন্দেহভাজনতার সাথে http://shootout.alioth.debian.org/ এ বেঞ্চমার্ক নিন , কারণ এগুলি বেশিরভাগ ক্ষেত্রে পাটিগণিত কোড পরীক্ষা করে, সম্ভবত আপনার কোডের সাথে এটি মোটেও অনুরূপ নয়।"

    নিজেকে জিজ্ঞাসা করুন যদি আপনি "এই মূলত পরীক্ষিত পাটিগণিত কোড" এর অর্থ কী তা বুঝতে পেরেছেন এবং তারপরে নিজেকে জিজ্ঞাসা করুন যে লেখক আসলে আপনাকে তার দাবীটি সত্য বলে প্রমাণ করেছে কিনা?

  • "এটি একটি বরং অকেজো পরীক্ষা, যেহেতু এটি নির্ভর করে যে পৃথক প্রোগ্রামগুলি কতটা ভালভাবে অনুকূলিত হয়েছে তার উপর নির্ভর করে; আমি তাদের কয়েকটিকে 4-6 বা তার বেশি বাড়াতে পেরেছি, এটি স্পষ্ট করে তুলেছে যে অযৌক্তিক প্রোগ্রামগুলির মধ্যে তুলনা বরং হয় নিরীহ। "

    নিজেকে জিজ্ঞাসা করুন যে লেখক আসলে আপনাকে দেখিয়ে দিয়েছে যে তিনি "তাদের মধ্যে কিছু 4-6 বা তার বেশি গতিতে" পরিচালিত হয়েছেন - এটি করা সহজ দাবি!


আমি আপনার সাথে আরও একমত হতে পারি না এবং এই কারণেই আমি এই ফোরামে জিজ্ঞাসা করেছি ... সর্বোপরি উত্তরগুলি কোথাও থাকতে হবে, তাই না? :)
ট্র্যাপ

1
হ্যাঁ. উত্তরটি হল, এটা নির্ভরশীল.".
ব্যবহারকারী 49117

6

'উদ্বেগজনকভাবে সমান্তরাল' সমস্যার জন্য, যখন সি ++ তে ইন্টেল টিবিবি এবং ওপেনএমপি ব্যবহার করেছি তখন আমি সি # এবং টিপিএল-এর সাথে সম্পন্ন অনুরূপ (খাঁটি গণিত) সমস্যার তুলনায় মোটামুটি 10x পারফরম্যান্স বৃদ্ধি পেয়েছি। সিমডি এমন একটি অঞ্চল যেখানে সি # প্রতিদ্বন্দ্বিতা করতে পারে না, তবে আমি এই ধারণাটিও পেয়েছিলাম যে টিপিএল একটি বিশাল ওভারহেড রাখে।

এটি বলেছিল, আমি কেবল পারফরম্যান্স-সমালোচনামূলক কাজগুলির জন্য সি ++ ব্যবহার করি যেখানে আমি জানি যে আমি মাল্টিথ্রেড করতে এবং দ্রুত ফলাফল পেতে সক্ষম হব। অন্য কিছুর জন্য, সি # (এবং মাঝে মাঝে এফ #) ঠিক আছে।


5

এটি সত্যই সুনির্দিষ্ট উত্তর ছাড়া অত্যন্ত অস্পষ্ট প্রশ্ন।

উদাহরণ স্বরূপ; আমি বরং সি # এর চেয়ে সি ++ তে তৈরি 3 ডি-গেম খেলতাম, কারণ পারফরম্যান্স অবশ্যই অনেক ভাল। (এবং আমি এক্সএনএ ইত্যাদি জানি, তবে এটি আসল জিনিসের কাছাকাছি আসে না)।

অন্যদিকে, পূর্বে উল্লিখিত হিসাবে; আপনার এমন ভাষায় বিকাশ করা উচিত যা আপনি যা চান তা দ্রুত করতে দেয় এবং তারপরে প্রয়োজনে অনুকূলিত হয়।


4
আপনি কয়েকটি উদাহরণের নাম বলতে পারেন? গেমগুলিতে সি # তে লেখা যা আপনি ধীর পেয়েছেন
কার্ল

1
এমনকি ইনস্টলেশনগুলির সাথে আসা উদাহরণস্বরূপ অ্যাপ্লিকেশনগুলি ধীর মনে হয়েছে।
ডেভিড দ্য ম্যান

9
C # দিয়ে গেমস তৈরির ক্ষেত্রে আবর্জনা সংগ্রাহক একটি বিশাল দায়বদ্ধতা, কারণ এটি যে কোনও সময় লাথি মারতে পারে, যার ফলে বড় বিরতি ঘটে। সুস্পষ্ট মেমরি পরিচালনা গেম বিকাশের পক্ষে সহজ হওয়া শেষ করে।
পোস্টফিউচারিস্ট

3
বেশিরভাগ আধুনিক গেমস জিপিইউ-সীমিত। এই জাতীয় গেমগুলির জন্য এটি যুক্তিযুক্ত নয় (সিপিইউতে চালিত) 10% ধীর, তারা এখনও সিপিইউ নয়, জিপিইউ দ্বারা সীমাবদ্ধ। আবর্জনা সংগ্রহকারী একটি আসল সমস্যা, মেমরির বরাদ্দ ভালভাবে না করা হলে এলোমেলো শর্ট ফ্রিজ হয়ে যায়।
মাইকেল এন্টিন

2
@ পোষ্টফিউচারিস্ট: এটি পিসিতে সত্য নয়; আবর্জনা সংগ্রাহক andোকা এবং ofুকার জন্য এত ভাল কাজ করেন আমি এর সাথে কোনও সমস্যায় পড়িনি। তবে, এক্সবক্স 360 এবং জুনে / উইন্ডোজ-7-ফোনে, আবর্জনা সংগ্রহকারী পিসির তুলনায় প্রায় স্মার্ট নয় ; আমি কখনোই দুজনের পক্ষে লেখেনি, তবে যারা আমাকে আবর্জনা সংগ্রহকারী বলেছিলেন তারা একটি বিশাল সমস্যা।
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

5

.NET ভাষায় আরও দ্রুত সি ++ কোড হিসেবে যত দ্রুত হতে পারে, অথবা, কিন্তু সি ++ কোড আরো একটি ধ্রুবক থ্রুপুট থাকবে যেমন .NET রানটাইম জন্য বিরতি হয়েছে জিসি এমনকি যদি এটা তার হয়ে পড়ল যতি সম্পর্কে খুব চালাক রয়েছে।

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


6
-১: এটি আসলে একটি কল্পকাহিনী। প্রথমত, আইডিয়োমেটিক সি ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ অনেক বেশি আধুনিক ডেপুটি স্ট্রাকচারের আওতায় না পড়লে রাইআইআই ধ্বংসকারীদের তুষারপাতের কারণ হয়ে দাঁড়ায় modern দ্বিতীয়ত, আপনি বরাদ্দ না দিয়ে .NET এ জিসি বিরতি দেওয়া আসলেই পুরোপুরি সরিয়ে ফেলতে পারেন।
জন হ্যারোপ

2
আপনি যদি এটি করেন, তবে আপনাকে বেশিরভাগ পদ্ধতি ক্ষণস্থায়ী বস্তু তৈরি করার কারণে আপনাকে ছাত্রলীগ ব্যবহার করতে হবে।
ফ্লোরিয়ান ডায়ন

5
এটি বেশ সত্য, এটি জেনিটিকে ইনক্রিমেন্টাল তৈরি করা। নেট 4 অবধি হয়নি। আমাদের কাছে একটি বৃহত সি # অ্যাপ রয়েছে যা জিসির জন্য এক সময় কয়েক সেকেন্ডের জন্য বিরতি দেয়। কর্মক্ষমতা সমালোচনামূলক অ্যাপ্লিকেশনগুলির জন্য এটি হত্যাকারী।
জাস্টিন

5
এমন একটি কারণ রয়েছে যেগুলি প্রোগ্রামগুলিতে হার্ডওয়্যারকে ধাক্কা দেওয়ার ঝুঁকিতে সি ++ ব্যবহার করার প্রবণতা রয়েছে। আপনার যখন প্রয়োজন হয় তখন আপনার আরও সূক্ষ্ম সুরক্ষা নিয়ন্ত্রণ থাকে control আপনি যখন সিস্টেমটি চাপ দিচ্ছেন তখন পারফরম্যান্সই মূল কী, অন্যথায় আপনার সময় বাঁচাতে সি # বা জাভা ব্যবহার করুন।
ভোরোনাইপোটাটো

4
আপনি যদি ক্যাশে আচরণ পরিচালনা করতে না পারেন তবে আপনি অনুকূলিত সি ++ কোডটি বীট করতে পারবেন না। এল 1 থেকে প্রধান স্মৃতিতে থাকা একটি ক্যাশে মিস আপনার ক্রিয়াকলাপটি 100 বার ধীর করতে পারে।
ডাগ

4

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

আমি সন্দেহ করি যে এটি নেট। বা জেআরই-এর যে কোনও দ্বারা করা হয়েছে, তবে আমি যখন বিশ্ববিদ্যালয়ে ছিলাম তখন এটি নিয়ে আবার গবেষণা করা হয়েছিল, সুতরাং এই ধরণের জিনিসগুলি শীঘ্রই কোনও এক সময় সত্যিকারের জগতে তাদের পথ সন্ধান করতে পারে তা ভাবা অযৌক্তিক নয় not ।


4

নিবিড় মেমরি অ্যাক্সেস প্রয়োজন অ্যাপ্লিকেশন যেমন উদা। ইমেজ ম্যানিপুলেশন পরিচালিত (সি #) এর চেয়ে নিয়ন্ত্রণহীন পরিবেশে (সি ++) রচনায় সাধারণত ভাল। পয়েন্টার গাণিতিকগুলি সহ অনুকূলকৃত অভ্যন্তরীণ লুপগুলি সি ++ এর নিয়ন্ত্রণে রাখা আরও সহজ। সি # তে আপনাকে এমনকি একই পারফরম্যান্সের কাছাকাছি পৌঁছানোর জন্য অনিরাপদ কোডটি অবলম্বন করতে হবে।


4

আমি vectorসি ++ এবং সি # সমতুল্য Listএবং সাধারণ 2 ডি অ্যারে পরীক্ষা করেছি ।

আমি ভিজ্যুয়াল সি # / সি ++ 2010 এক্সপ্রেস সংস্করণ ব্যবহার করছি। উভয় প্রকল্পই সাধারণ কনসোল অ্যাপ্লিকেশন, আমি তাদের স্ট্যান্ডার্ড (কোনও কাস্টম সেটিংস নেই) রিলিজ এবং ডিবাগ মোডে পরীক্ষা করেছি tested সি # তালিকাগুলি আমার পিসিতে দ্রুত চালিত হয়, অ্যারে ইনিশিয়ালাইজেশন সি # তেও দ্রুত, গণিতের ক্রিয়াকলাপগুলি ধীর গতিতে।

আমি ইন্টেল কোর 2 ডুও পি 8600@2.4GHz, সি # -। নেট 4.0 ব্যবহার করছি।

আমি জানি যে ভেক্টর বাস্তবায়ন সি # তালিকার চেয়ে পৃথক, তবে আমি কেবল সংগ্রহগুলি পরীক্ষা করতে চেয়েছিলাম যা আমি আমার জিনিসগুলি সঞ্চয় করতে ব্যবহার করব (এবং সূচক অ্যাক্সেসর ব্যবহার করতে সক্ষম হয়ে)।

অবশ্যই আপনাকে মেমরি সাফ করতে হবে (আসুন প্রতিটি ব্যবহারের জন্য বলি new), তবে আমি কোডটি সহজ রাখতে চেয়েছিলাম।

সি ++ ভেক্টর পরীক্ষা :

static void TestVector()
{
    clock_t start,finish;
    start=clock();
    vector<vector<double>> myList=vector<vector<double>>();
    int i=0;
    for( i=0; i<500; i++)
    {
        myList.push_back(vector<double>());
        for(int j=0;j<50000;j++)
            myList[i].push_back(j+i);
    }
    finish=clock();
    cout<<(finish-start)<<endl;
    cout<<(double(finish - start)/CLOCKS_PER_SEC);
}

সি # তালিকা পরীক্ষা:

private static void TestVector()
{

    DateTime t1 = System.DateTime.Now;
    List<List<double>> myList = new List<List<double>>();
    int i = 0;
    for (i = 0; i < 500; i++)
    {
        myList.Add(new List<double>());
        for (int j = 0; j < 50000; j++)
            myList[i].Add(j *i);
    }
    DateTime t2 = System.DateTime.Now;
    Console.WriteLine(t2 - t1);
}

সি ++ - অ্যারে:

static void TestArray()
{
    cout << "Normal array test:" << endl;
    const int rows = 5000;
    const int columns = 9000;
    clock_t start, finish;

    start = clock();
    double** arr = new double*[rows];
    for (int i = 0; i < rows; i++)
        arr[i] = new double[columns];
    finish = clock();

    cout << (finish - start) << endl;

    start = clock();
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < columns; j++)
            arr[i][j] = i * j;
    finish = clock();

    cout << (finish - start) << endl;
}

সি # - অ্যারে:

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 * j;
    t2 = System.DateTime.Now;

    Console.WriteLine(t2 - t1);

}

সময়: (প্রকাশ / ডিবাগ)

সি ++

  • 600/606 এমএস অ্যারে init,
  • 200/270 এমএসে অ্যারে ফিল,
  • 1 সেকেন্ড / 13 সেক্টর ভেক্টর আরম্ভ করুন এবং পূরণ করুন।

(হ্যাঁ, 13 সেকেন্ড, আমি সবসময় তালিকা / ভেক্টরগুলির সাথে ডিবাগ মোডে সমস্যা করি))

সি #:

  • 20/20 এমএস অ্যারে init,
  • 403/440 এমএসে অ্যারে ফিল,
  • 710/742 এমএস তালিকা আরম্ভ এবং পূরণ করুন।

1
আমি স্টাড :: তালিকায় সূচক অ্যাক্সেসর দেখতে পছন্দ করব। যাইহোক, এটি তালিকা, রিলিজ মোড সহ 37 সেকেন্ড সময় নেয়। ডিবাগিং ছাড়াই প্রকাশ করুন: 3 এস তালিকা, 0,3 গুলি ভেক্টর। সম্ভবত ইস্যু বা sth ডিফারেন্সিং। নমুনা: nopaste.pl/12fb
উইওরি

2
আরও সুনির্দিষ্ট পরিমাপের জন্য আপনার ব্যবহার করা উচিত নয় System.DateTime.Now, বরং স্টপওয়াচ ক্লাস।
স্যাম

4
আপনি সি ++ তে ভেক্টরটির জন্য ধীরগতির পূর্ণ ধরণের সময় পাবার কারণটি আপনি ধাক্কা ব্যাক করছেন। এটি পদ্ধতি বা অপারেটর ব্যবহারের চেয়ে ধীর হতে অনেক পোস্টে দেখানো হয়েছে []। এই পদ্ধতিগুলির মধ্যে দুটি ব্যবহার করার জন্য আপনাকে পুনরায় আকার বা রিজার্ভ পদ্ধতি ব্যবহার করতে হবে। অতিরিক্ত হিসাবে, আপনার সূচনাটি সি ++ ভেক্টর ক্ষেত্রে এত দীর্ঘ সময় নিচ্ছে তার কারণটি হ'ল আপনি একটি অনুলিপি বা অ্যাসাইনমেন্ট অপারেটরকে [এই ক্ষেত্রে কোনটি নিশ্চিত নয়) আপনার সি ++ ভেক্টর আরম্ভ করতে বাধ্য করছেন। সি ++ তে অ্যারের জন্য একটি অ্যালগরিদম রয়েছে যা 5001 এর পরিবর্তে 2 টি নতুন কল ব্যবহার করে এবং দ্রুত পুনরাবৃত্তিও করছে।
জাচারি ক্রাউস

5
আমি মনে করি আপনি উপযুক্ত উপায়ে সি ++ করেননি। শুধু এক নজরে এবং অনেকগুলি বিষয় খুঁজে পেয়েছি। উদাহরণস্বরূপ ভেক্টর <ভেক্টর <ডুবল>> মাইলিস্ট = ভেক্টর <ভেক্টর <ডাবল>>))
ডিএজি

2
কি দারুন. তালিকা বনাম পুনরায় আকারযোগ্য অ্যারেগুলির সাথে তুলনা করলে কোন সিদ্ধান্তে আসতে পারে তা নিশ্চিত নন তবে আপনি যদি এই জাতীয় ভেক্টর ব্যবহার করতে চলেছেন তবে আপনি আমার বন্ধু রিজার্ভ (), রিজার্ভ () সম্পর্কে শিখতে চাইবেন।
U007D

3

ঠিক আছে, এটা নির্ভর করে। যদি বাইট-কোডটি মেশিন-কোডে অনুবাদ করা হয় (এবং কেবল জেআইটি নয়) (যদি আপনি প্রোগ্রামটি কার্যকর করেন তবে ) এবং যদি আপনার প্রোগ্রামটি অনেক বরাদ্দ / অবনতি ব্যবহার করে তবে এটি আরও দ্রুত হতে পারে কারণ জিসি অ্যালগরিদমের কেবল একটি পাস প্রয়োজন (তাত্ত্বিকভাবে) একবারে পুরো মেমোরির মাধ্যমে, তবে সাধারণ ম্যালোক / রিলোক / ফ্রি সি / সি ++ কলগুলি প্রতিটি কলটিতে একটি ওভারহেড সৃষ্টি করে (কল-ওভারহেড, ডেটা-কাঠামো ওভারহেড, ক্যাশে মিস করে;))।

সুতরাং এটি তাত্ত্বিকভাবে সম্ভব (অন্যান্য জিসি ভাষার ক্ষেত্রেও)।

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

আর একটি বড় সুবিধা হ'ল লিনকিউ "এক্সটেনশন" এর মতো এসকিউএল, সংকলকটির জন্য ডাটাবেসে কল অনুকূলিতকরণের সুযোগ সরবরাহ করে (অন্য কথায়, সংকলক পুরো লিনকিউকে একটি "ব্লব" বাইনারি সংকলন করতে পারে যেখানে ডাকা ফাংশনগুলি অন্তর্ভুক্ত থাকে বা আপনার ব্যবহারের জন্য অনুকূলিত, তবে আমি এখানে অনুমান করছি।


1
আপনার বর্ণিত সমস্যাগুলির মধ্যে কোনও উপযুক্ত সি ++ বিকাশকারী চলবে না। কেবলমাত্র খারাপ সি প্রোগ্রামাররা যারা তাদের প্রোগ্রামগুলিতে ক্লাস চাপতে এবং এটিকে C ++ বলার সিদ্ধান্ত নিয়েছে তাদের সমস্যা আছে।
ক্লিয়ারার

1
দেবতাদের ভালবাসার জন্য, এটি 8 বছর বয়সী, ওএমএফজিজেড
কোউনাক্স

উন্নততর আপ টু ডেট উত্তর দিতে
নির্দ্বিধায়

2

আমি মনে করি যে সি # তে দ্রুত চলমান অ্যাপ্লিকেশন রয়েছে, পাশাপাশি আরও বেশি সি ++ লিখিত অ্যাপ্লিকেশন দ্রুত চলছে (ভাল সি ++ আরও পুরানো ... এবং ইউনিক্সকেও গ্রহণ করুন ...)
- প্রশ্নটি আসলে - ব্যবহারকারীটি সেই জিনিসটি কী এবং বিকাশকারীরা অভিযোগ করছেন ...
আচ্ছা, আইএমএইচও, সি # এর ক্ষেত্রে আমরা খুব স্বাচ্ছন্দ্যযুক্ত ইউআই, লাইব্রেরির খুব সুন্দর শ্রেণিবিন্যাস এবং সিএলআইয়ের পুরো ইন্টারফেস সিস্টেম পেয়েছি। সি ++ এর ক্ষেত্রে আমাদের কাছে টেমপ্লেটস, এটিএল, সিওএম, এমএফসি এবং ওপেনজিএল, ডাইরেক্টএক্স এবং এর মতো ইতিমধ্যে লিখিত এবং চলমান কোডের পুরো শেবাং রয়েছে ... বিকাশকারীরা সি # এর ক্ষেত্রে অনির্দিষ্টকালের জন্য উত্থিত জিসি কলগুলির অভিযোগ করে (মানে প্রোগ্রামটি দ্রুত চলে এবং এবং এক সেকেন্ডে - ঠুং ঠুং শব্দ! এটি আটকে আছে)।
সি # তে কোড লিখতে খুব সহজ এবং দ্রুত (এটিও ভুলে যাবেন না যে ত্রুটির সম্ভাবনাও বাড়ায়। সি ++ এর ক্ষেত্রে বিকাশকারীরা মেমরি ফাঁসের অভিযোগ করে - যার অর্থ ক্রাশ, ডিএলএলগুলির মধ্যে কল, পাশাপাশি "ডিএলএল হেল্ক" - এর সমস্যা রয়েছে) নতুন দ্বারা সমর্থন এবং প্রতিস্থাপন গ্রন্থাগারগুলি ...
আমি মনে করি আপনি প্রোগ্রামিং ভাষায় আরও দক্ষতা পাবেন, তত বেশি গুণমান (এবং গতি) আপনার সফ্টওয়্যারটির বৈশিষ্ট্যযুক্ত করবে।


2

আমি এটি এইভাবে রাখব: যে প্রোগ্রামাররা দ্রুত কোড লেখেন, তারা হলেন যারা বর্তমান মেশিনগুলিকে দ্রুত এগিয়ে যায় সে সম্পর্কে আরও বেশি অবগত হয় এবং ঘটনাক্রমে তারাও এমন একটি উপযুক্ত সরঞ্জাম ব্যবহার করে যা সুনির্দিষ্ট নিম্ন-স্তরের এবং নির্মাতাদের জন্য অনুমতি দেয় অপ্টিমাইজেশন কৌশল। এই কারণে, এই লোকেরা হ'ল যারা সি # এর পরিবর্তে সি / সি ++ ব্যবহার করে। আমি এটাকে যতটা সত্য বলেছি ততই যেতে পারব।


তিনি যে পরিমাণ ডেটা ম্যানিপুলেট করছেন তার পরিমাণ বিবেচনা করে খাঁজ কোডেড মাইনক্রাফ্টটি খুব দ্রুত হবে। এছাড়াও, তিনি তুলনামূলকভাবে স্বল্প সময়ের মধ্যে বেশিরভাগ এককভাবে কোড করেছিলেন, এমন কিছু যা সি ++ এ কার্যত অসম্ভব হত। আমি যদিও অপ্টিমাইজেশান কৌশলগুলির সাথে একমত নই - আপনার কোডটি দ্বিগুণ দ্রুত চালানোর জন্য যদি আপনার অতিরিক্ত 10x ডে সময় ব্যয় হয় তবে এটি সম্ভবত মূল্যবান।
বিল কে

2

যদি আমার ভুল না হয় তবে সি # টেমপ্লেটগুলি রানটাইমের সময় নির্ধারিত হয়। এটি অবশ্যই সি ++ এর টাইম টেম্পলেটগুলি সংকলনের চেয়ে ধীর হতে হবে।

এবং যখন আপনি অন্য অনেকগুলি দ্বারা উল্লিখিত অন্যান্য সমস্ত সংকলন-সময়কৃত অপ্টিমাইজেশান গ্রহণ করেন, তেমনি সুরক্ষার অভাবও সত্যিকার অর্থে আরও গতি ...

আমি বলব কাঁচা গতি এবং সর্বনিম্ন মেমরির ব্যবহারের ক্ষেত্রে সি ++ হ'ল স্পষ্ট পছন্দ। তবে কোডটি বিকাশ করা এবং আপনি মেমরি ফাঁস করছেন না বা কোনও নাল পয়েন্টার ব্যতিক্রম ঘটছেন না তা নিশ্চিত করে এটি আরও বেশি সময় অনুবাদ করে।

রায়:

  • সি #: দ্রুত বিকাশ, ধীর গতিতে

  • সি ++: ধীর বিকাশ, দ্রুত রান।


1

আপনি আপনার কোডটি কী অর্জন করতে চাইছেন তা নির্ভর করে। আমি শুনেছি এটি কেবল শহুরে কিংবদন্তির স্টাফ যে ভিবি.এনইটি, সি # এবং পরিচালিত সি ++ এর মধ্যে কোনও পারফরম্যান্সের পার্থক্য রয়েছে। তবে, আমি খুঁজে পেয়েছি, কমপক্ষে স্ট্রিং তুলনায়, যে সি ++ প্যান্টগুলিকে সি # এর বাইরে মারধর করে, যা ভিবি.এনইটি-এর প্যান্টগুলিকে মারধর করে।

আমি কোনও উপায়েই ভাষাগুলির মধ্যে অ্যালগরিদমিক জটিলতায় কোনও বিস্তৃত তুলনা করেছি। আমি প্রতিটি ভাষার ডিফল্ট সেটিংসও ব্যবহার করছি। ভিবি.এনইটি-তে আমি ভেরিয়েবল ইত্যাদি ঘোষণা করার জন্য সেটিংস ব্যবহার করে যাচ্ছি managed আমি নেট নেট 4.6.2 সহ ভিজ্যুয়াল স্টুডিও 2013 এর অন্যান্য ভাষায় একই রকম চালাচ্ছি।

#include "stdafx.h"

using namespace System;
using namespace System::Diagnostics;

bool EqualMe(String^ first, String^ second)
{
    return first->Equals(second);
}
int main(array<String ^> ^args)
{
    Stopwatch^ sw = gcnew Stopwatch();
    sw->Start();
    for (int i = 0; i < 100000; i++)
    {
        EqualMe(L"one", L"two");
    }
    sw->Stop();
    Console::WriteLine(sw->ElapsedTicks);
    return 0;
}

1

পারফরম্যান্স দিকটি নিয়ে সি # এবং সি ++ এর মধ্যে কিছু বড় পার্থক্য রয়েছে:

  • সি # হ'ল জিসি / হিপ ভিত্তিক। বরাদ্দ এবং জিসি নিজেই মেমরি অ্যাক্সেসের অ স্থানীয়ত্ব হিসাবে ওভারহেড
  • সি ++ অপ্টিমাইজারগুলি বছরের পর বছর ধরে খুব ভাল হয়ে উঠেছে। জেআইটি সংকলকরা একই মাত্রা অর্জন করতে পারে না কারণ তাদের কাছে কেবল সংকলনের সময় সীমিত রয়েছে এবং তারা বিশ্বব্যাপী সুযোগ দেখতে পায় না

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


0

> সর্বোপরি, উত্তরগুলি কোথাও থাকতে হবে, তাই না? :)

উম্ম, না।

বেশ কয়েকটি জবাব যেমন উল্লিখিত হয়েছে, প্রশ্নটি এমনভাবে নীচে নির্দিষ্ট করা হয়েছে যা উত্তরগুলিতে নয়, প্রতিক্রিয়াতে প্রশ্নগুলিকে আমন্ত্রণ জানায়। কেবল একটি উপায় নিতে:

এবং তারপর কোন প্রোগ্রাম? কোন মেশিন? কোন ওএস? কোন তথ্য সেট?


আমি পুরোপুরি একমত. আমি অবাক হয়েছি কেন লোকেরা একটি সাধারণ প্রশ্ন জিজ্ঞাসা করে কেন একটি নির্দিষ্ট উত্তর (.5৩.৫%) আশা করে? আমি মনে করি না যে এই ধরণের প্রশ্নের কোনও সাধারণ উত্তর নেই।
আমাকে স্টিভ

@ ক্যালমেস্টেভ: আপনার অর্থ কী তা আমি জানি তবে আপনার শেষ বাক্যটি কোনও প্রোগ্রামারের কাছে একটি চক বোর্ডের উপরে নখের মতো শোনা উচিত।
ওয়াউটার ভ্যান নিফটারিক

1
এটি প্রশ্নের উত্তর হিসাবে উপস্থিত হয় না, এবং মন্তব্য বা রেন্ট হিসাবে আরও পড়ে reads
তাস

-13

এর দ্বারা অনুপ্রাণিত হয়ে, আমি বেশিরভাগ প্রোগ্রামে প্রয়োজনীয় 60 শতাংশ সাধারণ নির্দেশের সাথে একটি দ্রুত পরীক্ষা করেছি।

এখানে সি # কোডটি রয়েছে:

for (int i=0; i<1000; i++)
{
    StreamReader str = new StreamReader("file.csv");
    StreamWriter stw = new StreamWriter("examp.csv");
    string strL = "";
    while((strL = str.ReadLine()) != null)
    {
        ArrayList al = new ArrayList();
        string[] strline = strL.Split(',');
        al.AddRange(strline);
        foreach(string str1 in strline)
        {
            stw.Write(str1 + ",");
        }
        stw.Write("\n");
    }
    str.Close();
    stw.Close();
}

স্ট্রিং অ্যারে এবং অ্যারেলিস্টগুলি সেই নির্দেশাবলী অন্তর্ভুক্ত করার জন্য উদ্দেশ্যমূলকভাবে ব্যবহৃত হয়।

এখানে সি ++ কোডটি রয়েছে:

for (int i = 0; i<1000; i++)
{
    std::fstream file("file.csv", ios::in);
    if (!file.is_open())
    {
        std::cout << "File not found!\n";
        return 1;
    }

    ofstream myfile;
    myfile.open ("example.txt");
    std::string csvLine;

    while (std::getline(file, csvLine))
    {
        std::istringstream csvStream(csvLine);
        std::vector csvColumn;
        std::string csvElement;

        while( std::getline(csvStream, csvElement, ‘,’) )
        {
            csvColumn.push_back(csvElement);
        }

        for (std::vector::iterator j = csvColumn.begin(); j != csvColumn.end(); ++j)
        {
            myfile << *j << ", ";
        }

        csvColumn.clear();
        csvElement.clear();
        csvLine.clear();
        myfile << "\n";
    }
    myfile.close();
    file.close();
}

আমি ব্যবহৃত ইনপুট ফাইলের আকারটি 40 কেবি ছিল।

এবং ফলাফল এখানে -

  • সি ++ কোডটি 9 সেকেন্ডে চলেছিল।
  • সি # কোড: 4 সেকেন্ড !!!

ওহ, কিন্তু এই লিনাক্স ছিল ... সাথে C # এর চলমান মনো ... এবং সি ++ জি ++,।

ঠিক আছে, আমি উইন্ডোজটিতে এটি পেয়েছি - ভিজ্যুয়াল স্টুডিও 2003 :

  • সি # কোড 9 সেকেন্ডে চলেছিল।
  • সি ++ কোড - ভয়ঙ্কর 370 সেকেন্ড !!!

7
আপনি সেখানে বিভিন্ন ডেটা স্ট্রাকচার এবং লাইব্রেরি কোড ব্যবহার করছেন, যদিও "370 সেকেন্ড" ভয়াবহ কিছু বোঝায় - আপনি কোনও সম্ভাবনার দ্বারা এটি ডিবাগারে চালাচ্ছেন না আপনি কি? আমার সন্দেহ হয় যে আপনি যে সিএসভি লাইব্রেরিটি ব্যবহার করছেন সেটি আপনি যে ভাষা ব্যবহার করছেন তার পারফরম্যান্সের চেয়ে আকর্ষণীয়। আমি সেই প্রসঙ্গে কোনও ভেক্টরের ব্যবহার এবং আপনি কী অপ্টিমাইজেশন ব্যবহার করেছেন তা নিয়ে প্রশ্ন করব। তদ্ব্যতীত, এটি সর্বজনবিদিত যে আইওস্ট্রিমগুলি (বিশেষত, "মাইফিল << * জ <<", ";") ফাইলটিতে লেখার অন্যান্য পদ্ধতির চেয়ে কম ধীরে ধীরে কিছু সাধারণ প্রয়োগের জন্য খুব ধীর।
আরাফাঙ্গিয়ান

6
অবশেষে, আপনি সি ++ সংস্করণে আরও কাজ করছেন। (আপনি কেন সিএসভি কলাম, সিএসভিএলেমেন্ট এবং সিএসভিলাইনগুলি সাফ করছেন?)
আরাফ্যাঙ্গিয়ন

2
লুপের প্রতিটি পুনরাবৃত্তি একটি std :: istream এবং একটি std :: ভেক্টর এবং একটি std :: স্ট্রিংটি ধ্বংস এবং পুনর্গঠন করতে চলেছে। দেহটি প্রতিটি পুনরাবৃত্তির সুযোগের বাইরে চলে যায়, সেইদিকে স্কোপের ভিতরে থাকা সমস্ত ভেরিয়েবলগুলি প্রতিটি পুনরাবৃত্তির উপর ধ্বংস এবং নির্মাণ করতে চলেছে।
doug65536

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

2
গতি পরীক্ষা করতে, স্মৃতিতে পরীক্ষার জিনিসগুলি ডিস্ক আইওতে পাবেন না, সর্বশেষতম এসএসডি এবং এটি আপনার পারফরম্যান্স অ্যাপ্লিকেশনটিতে উত্সর্গীকৃত আপনার পরীক্ষা নিরবিচ্ছিন্ন। কম্পিউটারগুলি ক্রমাগত ডিস্কে লেখার পরেও আপনি কীবোর্ডটি স্পর্শ করবেন না।
ব্যবহারকারী 3800527
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.