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

时间:2015-08-05 02:53:46

标签: 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++;
    }
}

虽然这是C ++代码

int main()
{
    usigned long i = 0;
    while (i < 100000000000)
    {
        cout << i << endl;
        i++;
    }
    return 0;
}

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

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

是的,我知道也许这个问题是&#34; offtopic&#34; :P或者可能是&#34;不清楚要求的是什么&#34;。 :/ 但是请有人向我解释一下。

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

编辑: 我做了 cout&lt;&lt; i&lt;&lt; &#34; \ n&#34;; 的想法,加上 std :: ios_base :: sync_with_stdio(false); 的想法,没有任何运气或结果的变化。

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

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

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

TLDR:printf()获胜,而控制台写入会减慢速度。

4 个答案:

答案 0 :(得分: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;
}

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

$ g++ main.cpp -O3 -o run.test
$ time ./run.test

有关sync_with_stdio(false)endl的说明,请在此处阅读我的回答:

希望有所帮助。

答案 1 :(得分:2)

我认为你的评价不够谨慎。我用C ++重新创建了你的测试,证明速度更快,如下所述:

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

namespace CSScratch
{
    class Program
    {
        static void Main(string[] args)
        {
            ulong i = 0;
            while (i < 1000000)
            {
                Console.WriteLine(i);
                i++;
            }
        }
    }
}

我在VS2013发布模式下将上面的内容构建到CSScratch.exe,然后我将其定时(在cygwin bash下)并重定向输出,因此不计算文件系统写入时间。结果相当一致,五次运行的 最快

time ./CSScratch.exe > NUL

real    0m17.175s
user    0m0.031s
sys     0m0.124s

C ++等价物:

#include <iostream>

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


    unsigned long i = 0;
    while (i < 1000000)
    {
        std::cout << i << '\n';
        i++;
    }
}

还使用VS2013编译:

cl /EHsc /O2 output.cc
time ./output > NUL

五次 最慢

real    0m1.116s
user    0m0.000s
sys     0m0.109s

比最快的C#运行(17.175秒)更快(1.116秒)。

这两个版本的部分时间都是通过加载/动态链接,初始化等来实现的。我将C ++版本修改为 循环10x以上 ,它仍然只是耗时9.327秒 - 大约是C#所需工作量的十分之一。

(您可以通过设置更大的输出缓冲区来进一步调整C ++版本,但通常不需要这样做。)

答案 2 :(得分:1)

Tony D在评论中提出了一个关于缓冲的优秀观点 将其添加到您的C#代码并再次计时:

static void main()
{
    ulong i = 0;
    while (i < 100000000000)
    {
        Console.WriteLine(i);
        Console.Out.Flush();
        i++;
    }
}

答案 3 :(得分:1)

如果您更换

cout << i << endl;

printf("%d\n", i);

结果将接近.net WriteLine。

通常,您在C ++或C上编写的事实并不意味着您的代码会更快。快速代码不仅是语言语法。它还需要一些基础知识的知识,如硬件和操作系统内部。

我的意思是正确使用C ++可以提供更好的结果,至少在非繁琐的任务上是这样。