为什么C#运行速度比C++快?

plk*_*ana 0 c# c++ performance

我不是在开玩笑.我有一个C#应用程序和一个C++应用程序.他们完全相同的东西,完全相同的代码量......

...... C#one运行得更快,不仅速度更快,而且速度提高了10倍.

这让我感到很奇怪,因为对于其中一个,我在调试器中运行C#应用程序,这应该减慢C#开始.然后,由于C#是带有巨大开销的字节码,使用.NET编译成带有一些额外功能的MSIL,这应该会减慢速度.虽然C++只是机器代码.

这是C#代码:

static void main()
{
    ulong i = 0;
    while (i < 100000000000)
    {
        Console.WriteLine(i);
        i++;
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然这是C++代码

int main()
{
    usigned long i = 0;
    while (i < 100000000000)
    {
        cout << i << endl;
        i++;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

他们只是在计算并显示一个数字.C++将是1000,而C#将是7000.(快7倍)

我甚至尝试编译它们,并在没有调试器的情况下使用命令提示符运行它们:cplusplus.exe && csharp.exe

是的,我知道也许这个问题是"offtopic":P或者可能是"不清楚要求的是什么".:/但请,有人向我解释.

如果这很重要,我正在使用这个CPU:Intel i7 2.5 Ghz.

编辑:我做了cout << i <<"\n"; 想法,再加上std :: ios_base :: sync_with_stdio(false); 想法,没有任何运气或结果的变化.

编辑2:我尝试了C的printf(),它的速度要快得多.比C#快3倍.

人们告诉我IO流非常慢,所以我在没有写入控制台的情况下尝试了它们,C++仍然比C#快得多.

总之,Writeline()比cout快得多,而printf()比两者快得多.所以写入控制台是唯一减慢速度的因素.

TLDR:printf()获胜,而控制台写入减慢了东西.

Naw*_*waz 7

您的代码效率低下,因为:

  • 默认情况下,C++流对象与C的stdio同步,这使得它变慢.
  • 你正在使用endl它进一步使它变慢.

解决这两个问题,你有这个代码:

int main()
{
    std::ios_base::sync_with_stdio(false);

    usigned long i = 0;
    while (i < 100000000000)
    {
        cout << i << '\n'; //use \n, not endl
        i++;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

将其编译为(必须使用优化标记,无论您使用何种编译器):

$ g++ main.cpp -O3 -o run.test
$ time ./run.test
Run Code Online (Sandbox Code Playgroud)

对于这两种解释sync_with_stdio(false),并endl在这里读我的答案:

希望有所帮助.

  • 根据我的经验,`sync_with_stdio`是一个红鲱鱼.无论您使用什么标志,I/O流性能本质上都很糟糕. (2认同)
  • @tc就像放大器上的11. (2认同)