c# সি#তুলনায় সি++ কত দ্রুত?




সি++ পিডিএফ (22)

নাকি এটি এখন অন্য উপায়?

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

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


Answer #1

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


Answer #2

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

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

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

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


Answer #3

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

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

#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;
}

Answer #4

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

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


Answer #5

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


Answer #6

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

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


Answer #7

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

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

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

এই অ-নির্ধারণী।


Answer #8

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

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

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

  • জিআইটিটারের কোনও গরম পথ CPU এ নির্দেশনা এবং তথ্য ক্যাশের জন্য আপনার কোডের সাথে প্রতিদ্বন্দ্বিতা করবে। আমরা জানি যে ক্যাশে প্রভাবশালী হয় এবং C ++ এর মতো স্থানীয় ভাষাগুলি সংজ্ঞায়িত করে এই ধরণের বিতর্ক না থাকে।

  • একটি রান-টাইম অপ্টিমাইজারের সময় বাজেটটি কম্পাইল-টাইম অপ্টিমাইজারের চেয়ে আরও বেশি বিধিনিষেধযুক্ত (যেমন অন্য মন্তব্যকারী নির্দেশ করে)

নিচের লাইন: অবশেষে, আপনি C #+ তে যত দ্রুত সি ++ তে দ্রুততর বাস্তবায়ন করতে সক্ষম হবেন

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

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

-

অপেক্ষাকৃত পারফরম্যান্সের পরিপ্রেক্ষিতে, আমি অন্য কোন উত্তরগুলিতে দেখেছি এমন পরিসংখ্যান এবং আলোচনার দ্বারাও বিরক্ত ছিলাম, তাই আমি ভাবলাম যে আমি উপরের দিকে এবং একই সাথে আমি উপরে বর্ণিত বিবৃতিগুলির জন্য কিছু সমর্থন প্রদান করব।

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

পরিবর্তে, আমি সামান্য আরো idiomatic C ++ কোড লিখেছিলাম এবং সি # কোড @ উইরি প্রদানের সাথে তুলনা করেছি। আমি সি ++ কোডে তৈরি দুটি প্রধান পরিবর্তন ছিল:

1) ব্যবহৃত ভেক্টর :: রিজার্ভ ()

2) ভাল ক্যাশে এলাকা অর্জন করার জন্য 2 ডি অ্যারের 1 ডি তে ফ্ল্যাট করা হয়েছে (সংলগ্ন ব্লক)

সি # (.নেট 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);
}

রান সময় (রিলিজ): Init: 124ms, পূরণ করুন: 165ms

C ++ 14 (Clang 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);
}

রান সময় (রিলিজ): Init: 398μs (হ্যাঁ, এটি মাইক্রোসেকেন্ড), পূরণ করুন: 152 মিমি

মোট রান সময়: C #: 289ms, C ++ 152ms (প্রায় 90% দ্রুত)

পর্যবেক্ষণ

  • C # বাস্তবায়ন একই 1 ডি অ্যারের বাস্তবায়নে পরিবর্তন আনতে ইনট: 40 মিমি, পূরণ: 171 মিমি, মোট: 211 মিমি ( C ++ এখনও প্রায় 40% দ্রুত ছিল )।

  • ভাষাতে "নিয়মিত" কোড লিখার চেয়ে এটি C ++ তে "দ্রুত" কোডটি ডিজাইন এবং লিখতে অনেক কঠিন।

  • এটি (সম্ভবত) বিস্ময়করভাবে C ++ এ খারাপ কর্মক্ষমতা পেতে সহজ; আমরা যে unreserved ভেক্টর কর্মক্ষমতা সঙ্গে দেখেছি। এবং এই ধরনের pitfalls প্রচুর আছে।

  • আপনি # রানটাইম এ যা যা সব বিবেচনা যখন সি # এর কর্মক্ষমতা বরং আশ্চর্যজনক। এবং যে কর্মক্ষমতা অ্যাক্সেস তুলনামূলকভাবে সহজ।

  • সি ++ এবং সি # এর কার্যকারিতা তুলনামূলক আরও নির্বোধ ডেটা: https://benchmarksgame.alioth.debian.org/u64q/compare.php?lang=gpp&lang2=csharpcore

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

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


Answer #9

এটা বাস্তব definitive উত্তর ছাড়া একটি অত্যন্ত অস্পষ্ট প্রশ্ন।

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

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


Answer #10

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

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

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

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

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

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

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

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

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

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


Answer #11

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

আমি সন্দেহ করি যে এইটি .NET বা JREs এর দ্বারা সম্পন্ন করা হয়েছে, কিন্তু যখন আমি বিশ্ববিদ্যালয়ে ছিলাম তখন এটি গবেষণা করা হয়েছিল, তাই এই ধরণের জিনিসগুলি শীঘ্রই কিছুটা সময়ে আসল জগতে তাদের পথ খুঁজে পেতে পারে বলে মনে করা অযৌক্তিক নয়। ।


Answer #12

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


Answer #13

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


Answer #14

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

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

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

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


Answer #15

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

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

আমি Intel Core2Duo [email protected], সি # - নেট 4.0 ব্যবহার করছি।

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

অবশ্যই আপনাকে মেমরি সাফ করতে হবে (আসুন 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 এমএস অ্যারে পূরণ করুন,
  • 1sec / 13sec ভেক্টর init & পূরণ করুন।

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

সি #:

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

Answer #16

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


Answer #17

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

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

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

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

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

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


Answer #18

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

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


Answer #19

এর দ্বারা অনুপ্রাণিত, আমি বেশিরভাগ প্রোগ্রামগুলিতে 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 সেকেন্ড !!!

ওহ, কিন্তু এই লিনাক্সে ছিল ... সি # Mono চলছে ... এবং সি ++ + g ++ দিয়ে।

ঠিক আছে, উইন্ডোজ এ যা পেয়েছি - Visual Studio 2003 :

  • সি # কোড 9 সেকেন্ডের মধ্যে দৌড়ে।
  • সি ++ কোড - ভয়ঙ্কর 370 সেকেন্ড !!!

Answer #20

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


Answer #21

আচ্ছা, এটা নির্ভর করে। যদি বাইট-কোডটি মেশিন কোডে (এবং কেবলমাত্র JIT নয়) অনুবাদ করা হয় (অর্থাত আপনি প্রোগ্রামটি কার্যকর করেন তবে ) এবং যদি আপনার প্রোগ্রাম অনেক বরাদ্দকরণ / বাতিলকরণ ব্যবহার করে তবে এটি দ্রুত হতে পারে কারণ GC অ্যালগরিদমটি কেবল একটি পাস (তাত্ত্বিকভাবে) একবারে পুরো মেমরির মাধ্যমে, কিন্তু স্বাভাবিক malloc / realloc / বিনামূল্যে C / C ++ কলগুলি প্রতিটি কল (কল-ওভারহেড, ডেটা-স্ট্রাকচার ওভারহেড, ক্যাশে মিসেস;) এ একটি ওভারহেড সৃষ্টি করে)।

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

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

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


Answer #22

আমি মনে করি সি # চলমান দ্রুত লিখিত অ্যাপ্লিকেশনগুলি রয়েছে, সেইসাথে আরও C ++ লিখিত অ্যাপ্লিকেশনগুলি দ্রুত চলছে (ভাল সি ++ পুরানো ... এবং ইউনিক্সও নিতে ...)
- প্রশ্নটি আসলেই - এটাই কি জিনিস, ব্যবহারকারী এবং ডেভেলপাররা অভিযোগ করছে ...
ওয়েল, IMHO, C # এর ক্ষেত্রে আমাদের কাছে খুব সান্ত্বনা UI, লাইব্রেরিগুলির খুব চমৎকার অনুক্রম এবং CLI এর পুরো ইন্টারফেস সিস্টেম রয়েছে। C ++ ক্ষেত্রে আমাদের টেমপ্লেট, এটিএল, COM, MFC এবং ইতিমধ্যেই লিখিত এবং চলমান কোডের Open Shell যেমন OpenGL, DirectX এবং আরও আছে ... ডেভেলপাররা C # এর ক্ষেত্রে অনিশ্চিতভাবে বেড়ে যাওয়া জিসি কলগুলির অভিযোগ করে (অর্থ প্রোগ্রাম দ্রুত সঞ্চালিত হয় এবং এক সেকেন্ডে - ঠোঁট! এটা আটকে গেছে)।
C # তে খুব সহজ এবং দ্রুত কোড লিখতে (ত্রুটিগুলিও বৃদ্ধি করার সম্ভাবনা ভুলবেন না। C ++ ক্ষেত্রে, ডেভেলপাররা মেমরি লিকগুলির অভিযোগ করেন - মানে ক্রাশ, DLL এর মধ্যে কল, এবং "DLL নরক" - সমস্যা নতুনদের দ্বারা সমর্থন এবং প্রতিস্থাপনের লাইব্রেরি ...
আমি মনে করি প্রোগ্রামিং ভাষাতে আপনার দক্ষতা আরও বেশি হবে, আরো গুণমান (এবং গতি) আপনার সফ্টওয়্যারকে চিহ্নিত করবে।





benchmarking