我正在使用Windows7使用CPython for python3.22和MinGW的g ++.exe for C++(这意味着我使用libstdc ++作为运行时库).我写了两个简单的程序来比较它们的速度.
蟒蛇:
x=0
while x!=1000000:
x+=1
print(x)
Run Code Online (Sandbox Code Playgroud)
C++:
#include <iostream>
int main()
{
int x = 0;
while ( x != 1000000 )
{
x++;
std::cout << x << std::endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
两者都没有优化.
我先运行c ++,然后通过交互式命令行运行python,这比直接启动.py文件慢得多.
但是,python outran c ++的速度是原来的两倍多.Python花了53秒,c ++花了1分54秒.
是因为python对解释器进行了一些特殊的优化,还是因为C++必须引用和std会降低它并使它占用ram?
还是其他原因?
编辑:我再次尝试,\n而不是std::endl,并用-O3旗帜编译,这次花了1分钟达到500,000.
Naw*_*waz 32
我的一位同事告诉我,Python代码比C++代码更快,然后以此主题为例来证明他的观点.从其他答案中可以明显看出问题中发布的C++代码有什么问题.我仍然想总结一下我做的基准测试,以便向他展示一个好的C++代码有多快!
原始C++代码存在两个问题:
它用于std::endl在每次迭代中打印换行符.这是一个非常糟糕的主意,因为std::endl除了简单地打印换行符之外还有更多的东西 - 它还会强制流刷新到目前为止累积的缓冲区; 冲洗是一项昂贵的操作,因为它必须处理硬件 - 输出设备.所以第一个修复是:如果你想打印一个换行符,只需使用'\n'.
第二个问题不太明显,因为在代码中没有看到.它是在C++流的设计中.默认情况下,C++流的每个输入和输出操作后同步到C流,使您的应用程序可以混合std::cout和std::printf,和std::cin而std::scanf没有任何问题.此功能(是的,它是一个功能不需要)在这种情况下,所以我们可以禁用它,因为它有一点点运行时开销(这不是一个问题,它不会使C++坏,它只是一个价格的该功能).所以第二个修复是这样的:std::cout::sync_with_stdio(false);
这是最终的优化代码:
#include <iostream>
int main()
{
std::ios_base::sync_with_stdio(false);
int x = 0;
while ( x != 1000000 )
{
++x;
std::cout << x << '\n';
}
}
Run Code Online (Sandbox Code Playgroud)
并使用-O3标志编译并运行(和测量)为:
$ g++ benchmark.cpp -O3 #compilation
$ time ./a.out #run
//..
real 0m32.175s
user 0m0.088s
sys 0m0.396s
Run Code Online (Sandbox Code Playgroud)
并运行和测量python代码(发布在问题中):
$ time ./benchmark.py
//...
real 0m35.714s
user 0m3.048s
sys 0m4.456s
Run Code Online (Sandbox Code Playgroud)
在user和sys时间告诉我们哪一个是快,通过什么样的顺序.
希望能帮助您消除疑虑.:-)
Max*_*ert 15
这里没有任何明显的东西.由于Python是用C语言编写的,因此它必须使用类似的东西printf来实现print.像C++ I/O Streams cout通常以比它慢得多的方式实现printf.如果你想让C++处于更好的基础,你可以尝试改为:
#include <cstdio>
int main()
{
int x=0;
while(x!=1000000)
{
++x;
std::printf("%d\n", x);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我确实改为使用++x而不是x++.多年前人们认为这是一次有价值的"优化".如果这个改变对你的程序性能产生任何影响,我会心脏病发作(OTOH,我很肯定使用std::printf会对运行时性能产生巨大影响).相反,我之所以做出改变只是因为x在你增加它之前你并没有注意到它的价值,所以我认为在代码中说它是有用的.
Moo*_*uck 11
我认为我们需要更多信息,但我希望您构建一个未经优化的C++版本.尝试用-O3旗帜建造它.(更了解GCC的人会有更多更好的建议).但是,这里有一些来自完全不值得信任的来源的时间:http://ideone.com.我每次跑5次以获得时间上的一些变化量,但只有原始的C++变化,并没有那么多.
Python:http://ideone.com/WBWB9时间:0.07-0.07s
您的C++:http://ideone.com/tzwQJ时间:0.05-0.06s
修改后的C++:http://ideone.com/pXJo3时间:0.00 S-0.00S
至于为什么我的C++比你的更快,std::endl 强迫 C++立即刷新缓冲区. '\n'没有强制缓冲区刷新的换行,这要快得多.
(注意:我只跑到12773,因为ideone.com在显示一定数量的输出后杀死进程,这是服务器给我的最多)
| 归档时间: |
|
| 查看次数: |
11714 次 |
| 最近记录: |