Почему в этом случае .NET быстрее, чем C ++? - PullRequest
12 голосов
/ 18 февраля 2010

Убедитесь, что вы работаете за пределами IDE. Это ключ.

-edit- I LOVE SLaks комментарий.«Количество дезинформации в этих ответах ошеломляет».: D

Успокойтесь, ребята.Практически все вы были не правы.Я сделал оптимизации. Оказывается, что все мои оптимизации были недостаточно хороши. Я запустил код в GCC, используя gettimeofday (я вставлю код ниже), использовал g++ -O2 file.cpp и получил немного более быстрые результаты, чем C #. Возможно, MS не создавал оптимизацию, необходимую в этом конкретном случае, но после загрузки и установки mingw я был протестирован и обнаружил, что скорость почти идентична. Justicle Кажется, это правильно.Я мог бы поклясться, что использую часы на своем ПК и использовал их для подсчета, и обнаружил, что они медленнее, но проблема решена.Скорость C ++ почти не в два раза медленнее в компиляторе MS.

Когда мой друг сообщил мне об этом, я не мог в это поверить.Поэтому я взял его код и установил на него несколько таймеров.

Вместо Boo я использовал C #.Я постоянно получал более быстрые результаты в C #.Зачем?Версия .NET была почти вдвое меньше, независимо от того, какой номер я использовал.

Версия C ++ (плохая версия):

#include <iostream>
#include <stdio.h>
#include <intrin.h>
#include <windows.h>
using namespace std;

int fib(int n)
{
    if (n < 2) return n;
    return fib(n - 1) + fib(n - 2);
}

int main()
{
    __int64 time = 0xFFFFFFFF;
    while (1)
    {
        int n;
        //cin >> n;
        n = 41;
        if (n < 0) break;
__int64 start = __rdtsc();
        int res = fib(n);
__int64 end = __rdtsc();
        cout << res << endl;
        cout << (float)(end-start)/1000000<<endl;
        break;
    }

    return 0;
}

Версия C ++ (лучшая версия):

#include <iostream>
#include <stdio.h>
#include <intrin.h>
#include <windows.h>
using namespace std;

int fib(int n)
{
    if (n < 2) return n;
    return fib(n - 1) + fib(n - 2);
}

int main()
{
    __int64 time = 0xFFFFFFFF;
    while (1)
    {
        int n;
        //cin >> n;
        n = 41;
        if (n < 0) break;
        LARGE_INTEGER start, end, delta, freq;
        ::QueryPerformanceFrequency( &freq );
        ::QueryPerformanceCounter( &start );
        int res = fib(n);
        ::QueryPerformanceCounter( &end );
        delta.QuadPart = end.QuadPart - start.QuadPart;
        cout << res << endl;
        cout << ( delta.QuadPart * 1000 ) / freq.QuadPart <<endl;
break;
    }

    return 0;
}

C # версия:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Runtime.InteropServices;
using System.ComponentModel;
using System.Threading;
using System.IO;

using System.Diagnostics;

namespace fibCSTest
{
    class Program
    {
         static int fib(int n)
         {
            if (n < 2)return n;
            return fib(n - 1) + fib(n - 2);
         }

         static void Main(string[] args)
         {
             //var sw = new Stopwatch();
             //var timer = new PAB.HiPerfTimer();
             var timer = new Stopwatch();
             while (true)
             {
                 int n;
                 //cin >> n;
                 n = 41;
                 if (n < 0) break;
                 timer.Start();
                 int res = fib(n);
                 timer.Stop();
                 Console.WriteLine(res);
                 Console.WriteLine(timer.ElapsedMilliseconds);
                 break;
             }
         }
    }
}

GCC версия:

#include <iostream>
#include <stdio.h>
#include <sys/time.h>
using namespace std;

int fib(int n)
{
    if (n < 2) return n;
    return fib(n - 1) + fib(n - 2);
}

int main()
{
    timeval start, end;
    while (1)
    {
        int n;
        //cin >> n;
        n = 41;
        if (n < 0) break;
        gettimeofday(&start, 0);
        int res = fib(n);
        gettimeofday(&end, 0);
        int sec = end.tv_sec - start.tv_sec;
        int usec = end.tv_usec - start.tv_usec;
        cout << res << endl;
        cout << sec << " " << usec <<endl;
        break;
    }

    return 0;
}

Ответы [ 13 ]

0 голосов
/ 18 февраля 2010

Я знаю, что компилятор .NET имеет оптимизацию Intel.

0 голосов
/ 18 февраля 2010

Может случиться так, что методы предварительно объединяются во время выполнения перед запуском теста ... или что консоль является оберткой вокруг API для вывода на консоль, когда код C ++ для cout буферизован Я думаю ..

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 18 февраля 2010

Если этот код действительно равен 1/2 времени выполнения, то возможны следующие причины:

  • Сборка мусора ускоряет выполнение кода C # над кодом C ++, если это происходило где-либо в приведенном выше коде.
  • Запись C # в консоль может быть буферизована (C ++ может не быть, или это может быть не так эффективно)
...