Ato*_*olz 1 c++ java performance g++ c++11
我用 C++ 和 Java 编写了一个程序来打印“Hello World”100,000 次,但我注意到与 Java 代码相比,C++ 代码花费的时间太长;Java代码平均需要6秒左右,C++代码平均需要18秒左右,都是从命令行运行;有人可以解释一下原因吗,谢谢。
对于Java和C++,程序的名称分别是first.java和first.cpp,我使用 java first.java:和 first.exe; 都来自命令行
g++ --version g++(Rev6,由 MSYS2 项目构建)11.2.0
java --版本 java 13.0.2, 2020-01-14
Java代码
class first {
public static void main(String... args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 100000; i++) {
System.out.println("Hello World");
}
long end = System.currentTimeMillis();
long dur = end - start;
System.out.println(dur / 1000);
}
}
Run Code Online (Sandbox Code Playgroud)
C++代码
#include <iostream>
#include <string>
#include <chrono>
using namespace std;
int main()
{
auto start = std::chrono::system_clock::now();
for (int i = 0; i < 100000; i++)
{
cout << "Hello World" << endl;
}
auto end = std::chrono::system_clock::now();
std::chrono::duration<double> elapsed_seconds = end - start;
cout << elapsed_seconds.count() << endl;
}
Run Code Online (Sandbox Code Playgroud)
C++ 和 Java 代码之间存在一些相关差异:
默认情况下,C++ IO 流将其状态与底层 C 流同步。这需要时间。为了避免这种情况(只有当您知道您的代码不混合 C 和 C++ IO 操作时才可以这样做!),请将以下内容添加到代码的开头main:
std::ios_base::sync_with_stdio(false);
Run Code Online (Sandbox Code Playgroud)
cout << endl;等价于cout << "\n" << flush;(反过来,等价于cout << "\n"; cout.flush();)。flush您的 Java 代码中不存在该调用。您可以将其添加到 Java 代码中,或者更好的是,将其从 C++ 代码中删除:您几乎永远不需要使用endl/ flush。相反,只需使用
cout << "Hello World\n";
Run Code Online (Sandbox Code Playgroud)
正如 Peter 在评论中指出的那样,大多数系统无论如何都会在换行符上刷新标准输出流(至少在连接到终端时),因此人们可能认为这不会产生影响。然而,它确实会产生(实质性的!)差异,例如将输出通过管道传输到文件时。
您的 Java 基准测试代码会截断秒的小数部分。要显示这些秒数(相关,因为代码在 <1 秒内运行!),请将相关行更改为
System.out.println(dur / 1000.0);
Run Code Online (Sandbox Code Playgroud)
确保在启用优化的情况下编译您的 C++ 代码;对于 GCC/clang/ICC,您可以通过传递-O2. MSVC 有一个类似的标志/O2(有更高的优化级别,但它们有特定的问题;-O2几乎是人们使用的默认设置)。
相反,每次调用它时java first.java都会首先编译代码。为了使比较公平,请务必提前运行,然后通过.javac first.javajava first
进行这些更改会导致我的系统上的 C++ 代码取代 Java 代码。当循环大小从 100,000 增加到 1,000,000 时,这一点最为明显:C++ 代码现在以毫秒为单位运行,而 Java 代码需要几秒钟(确保将输出通过管道传输到文件!否则您将纯粹测量延迟/渲染)终端的速度,而不是代码的性能)。
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |