我不是在开玩笑。 我有一个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()获胜,而控制台写入会减慢速度。
答案 0 :(得分:7)
您的代码效率低下,因为:
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 ++可以提供更好的结果,至少在非繁琐的任务上是这样。