How close can I get C# to the performance of C++ for small intensive tasks?

Refresh

December 2018

Views

794 time

4

I was thinking about the speed difference of C++ to C# being mostly about C# compiling to byte-code that is taken in by the JIT compiler (is that correct?) and all the checks C# does.

I notice that it is possible to turn a lot of these functions off, both in the compile options, and possibly through using the unsafe keyword as unsafe code is not verifiable by the common language runtime.

Therefore if you were to write a simple console application in both languages, that flipped an imaginary coin an infinite number of times and displayed the results to the screen every 10,000 or so iterations, how much speed difference would there be? I chose this because it's a very simple program.

I'd like to test this but I don't know C++ or have the tools to compile it. This is my C# version though:

static void Main(string[] args)
{
    unsafe
    {
        Random rnd = new Random();
        int heads = 0, tails = 0;
        while (true)
        {
            if (rnd.NextDouble() > 0.5)
                heads++;
            else
                tails++;

            if ((heads + tails) % 1000000 == 0)
                Console.WriteLine("Heads: {0}  Tails:  {1}", heads, tails);
        }
    }
}

Is the difference enough to warrant deliberately compiling sections of code "unsafe" or into DLLs that do not have some of the compile options like overflow checking enabled? Or does it go the other way, where it would be beneficial to compile sections in C++? I'm sure interop speed comes into play too then.

To avoid subjectivity, I reiterate the specific parts of this question as:

  • Does C# have a performance boost from using unsafe code?
  • Do the compile options such as disabling overflow checking boost performance, and do they affect unsafe code?
  • Would the program above be faster in C++ or negligably different?
  • Is it worth compiling long intensive number-crunching tasks in a language such as C++ or using /unsafe for a bonus? Less subjectively, could I complete an intensive operation faster by doing this?

3 answers

2

Приведенный пример является ошибочным, поскольку он не показывает реальное использование жизни обоих языков программирования. Используя простые типы данных для измерения скорости языка ничего интересного не принесешь. Вместо этого я предлагаю вам создать шаблонный класс в C ++ и сравнить его с тем, что возможно в C # для класса дженериков. В конце концов, объекты будут приносить некоторые важные результаты, и вы увидите, что C ++ быстрее, чем C #. Не говоря уже о том, что вы сравниваете более низкий уровень языка программирования с C #.

Есть ли у C # прирост производительности от использования небезопасного кода?

Да, это будет иметь импульс , но это не рекомендуется , что вы пишете только код с небезопасным. Вот почему: Код , написанный с использованием небезопасного контекста не может быть проверен , чтобы быть безопасными, поэтому он будет выполняться только тогда , когда код полностью доверять. Другими словами, небезопасный код не может быть выполнена в доверенной среде. Например, вы не можете запустить небезопасный код непосредственно из Интернета. http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx

Будет выше программа быстрее в C ++ или negligably разные?

Да программа будет немного быстрее в C ++. C ++ является языком программирования, ниже и даже быстрее, если вы начнете использовать библиотеку алгоритмов (random_shuffle приходит на ум).

Стоит ли составление длинных интенсивные номерные хруста задач в таких языках, как C ++ или с использованием / небезопасным для бонуса? Менее субъективно, я мог завершить интенсивную работу быстрее, делая это?

Это зависит от проекта ...

1

До более чем на 100% скорости - во многом зависит от задачи, просто сказал.

Более 100% - да, потому что как раз вовремя компилятор знает ваш процессор, и я сомневаюсь, что вы на самом деле оптимизации для аппаратной платформы;)

Нет SSE не является проблемой, если вы матричные операции.

Для некоторых вещей с тоннами массивов (обработки изображений) массив тестов убить вас, но указатели работы (т.е. небезопасного код), как они обходят это.

Что касается вещей, как проверка переполнения - будьте осторожны. Как и в: в C ++ у вас есть то же самое возможно. Если вам нужна проверка переполнения, вопрос производительности не существует;)

Лично я бы не заморачиваться с C ++ в большинстве случаев. Частично да, особенно, когда вы можете извлечь выгоду из SSE:

Так, в конце многое зависит от природы, если ваши расчеты.

0

Я рекомендовал бы взглянуть на этот вопрос: Можно ли скомпилировать .NET IL - код в машинный код?