Насколько быстрее C ++, чем C #? - PullRequest
       113

Насколько быстрее C ++, чем C #?

219 голосов
/ 26 сентября 2008

Или сейчас наоборот?

Из того, что я слышал, есть некоторые области, в которых C # оказывается быстрее, чем C ++, но у меня никогда не было смелости проверить это самостоятельно.

Думаю, что любой из вас мог бы подробно объяснить эти различия или указать мне правильное место для информации по этому вопросу.

Ответы [ 27 ]

3 голосов
/ 17 июля 2010

Ну, это зависит. Если байт-код преобразуется в машинный код (а не только в JIT) (я имею в виду, если вы выполняете программу) и , если ваша программа использует много распределений / освобождений, это может быть быстрее, потому что Алгоритму GC достаточно одного прохода (теоретически) через всю память один раз, но обычные вызовы malloc / realloc / free в C / C ++ вызывают издержки при каждом вызове (издержки вызова, издержки структуры данных, ошибки кэширования;)) .

Так что это теоретически возможно (также для других языков GC).

На самом деле я не вижу крайнего недостатка в невозможности использования метапрограммирования с C # для большинства приложений, потому что большинство программистов все равно его не используют.

Другое большое преимущество состоит в том, что SQL, как и «расширение» LINQ , предоставляет компилятору возможность оптимизировать вызовы к базам данных (другими словами, компилятор может скомпилировать весь LINQ в один «блоб»). "двоичный файл, в котором вызываемые функции встроены или оптимизированы для вашего использования, но я размышляю здесь).

2 голосов
/ 26 сентября 2008

Я полагаю, что есть приложения, написанные на C #, работающие быстро, а также есть и другие приложения, написанные на C ++, работающие быстро (ну, C ++ просто старше ... и тоже принимают UNIX ...)
- вопрос действительно в том - что это за штука, на которую жалуются пользователи и разработчики ...
Ну, IMHO, в случае с C # у нас очень удобный интерфейс, очень хорошая иерархия библиотек и целая система интерфейса CLI. В случае C ++ у нас есть шаблоны, ATL, COM, MFC и целый набор уже написанного и запущенного кода, такого как OpenGL, DirectX и т. Д. Разработчики жалуются на неопределенно возросшие вызовы GC в случае C # (означает, что программа работает быстро, и через секунду - бац! он застрял).
Писать код на C # очень просто и быстро (не забывать, что также увеличивают вероятность ошибок. В случае C ++ разработчики жалуются на утечки памяти, - это означает сбои, вызовы между библиотеками DLL, а также на «адский DLL» - проблему с поддержкой и заменой библиотек более новыми ...
Я думаю, чем больше у вас навыков в языке программирования, тем больше качества (и скорости) будет характеризовать ваше программное обеспечение.

2 голосов
/ 08 мая 2016

Я бы сказал так: программисты, которые пишут более быстрый код, являются более осведомленными о том, что заставляет современные машины работать быстрее, и, кстати, они также используют тот инструмент, который позволяет точно уровень и методы детерминированной оптимизации. По этим причинам именно эти люди используют C / C ++, а не C #. Я бы сказал, что это факт.

1 голос
/ 12 июля 2016

Если я не ошибаюсь, шаблоны C # определяются во время выполнения. Это должно быть медленнее, чем шаблоны времени компиляции C ++.

И когда вы принимаете во внимание все другие оптимизации времени компиляции, упомянутые многими другими, а также отсутствие безопасности, которое действительно означает большую скорость ...

Я бы сказал, что C ++ - очевидный выбор с точки зрения скорости и минимального потребления памяти. Но это также приводит к увеличению времени на разработку кода и гарантирует, что вы не теряете память и не вызываете никаких исключений нулевого указателя.

Вердикт:

  • C #: ускорение разработки, замедление работы

  • C ++: медленная разработка, более быстрый запуск.

1 голос
/ 27 сентября 2008

> В конце концов, ответы должны быть где-то, не так ли? :)

Умм, нет.

Как отмечалось в нескольких ответах, вопрос недостаточно конкретизирован способами, которые вызывают вопросы в ответе, а не в ответах. Взять только один путь:

А какие тогда программы? Какая машина? Какая ОС? Какой набор данных?

0 голосов
/ 07 апреля 2018

Это действительно зависит от того, чего вы пытаетесь достичь в своем коде. Я слышал, что это просто городская легенда о том, что есть разница в производительности между VB.NET, C # и управляемым C ++. Тем не менее, я обнаружил, по крайней мере в сравнении строк, что управляемый C ++ отбивает штаны из C #, что в свою очередь отбивает штаны из VB.NET.

Я ни в коем случае не делал исчерпывающих сравнений алгоритмической сложности между языками. Я также просто использую настройки по умолчанию на каждом из языков. В VB.NET я использую настройки, чтобы требовать объявления переменных и т. Д. Вот код, который я использую для управляемого C ++: (Как видите, этот код довольно прост). Я использую то же самое на других языках в Visual Studio 2013 с .NET 4.6.2.

#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;
}
0 голосов
/ 31 марта 2010

Вдохновленный этим, я провел быстрый тест с 60% общих инструкций, необходимых в большинстве программ.

Вот код C #:

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();
}

Массив строк и массив списков используются специально для включения этих инструкций.

Вот код C ++:

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 КБ.

А вот и результат -

  • Код C ++ выполнялся за 9 секунд.
  • код C #: 4 секунды !!!

Да, но это было в Linux ... С C # на Mono ... И C ++ с g ++.

ОК, это то, что я получил в Windows - Visual Studio 2003 :

  • Код C # выполнялся за 9 секунд.
  • C ++ код - ужасные 370 секунд !!!
...