【发布时间】:2017-11-04 16:31:56
【问题描述】:
我最近用 Java 编写了一个计算密集型算法,然后将其翻译成 C++。令我惊讶的是,C++ 的执行速度要慢得多。我现在编写了一个更短的 Java 测试程序和一个相应的 C++ 程序——见下文。我的原始代码具有很多数组访问功能,测试代码也是如此。 C++ 的执行时间要长 5.5 倍(请参阅每个程序末尾的注释)。
1st 21 cmets 后的结论 ...
测试代码:
-
g++ -o ...Java 快 5.5 倍 -
g++ -O3 -o ...Java 快 2.9 倍 -
g++ -fprofile-generate -march=native -O3 -o ...(运行,然后g++ -fprofile-use等)Java 快 1.07 倍。
我的原始项目(比测试代码复杂得多):
- Java 快 1.8 倍
- C++ 快 1.9 倍
- C++ 快 2 倍
Software environment:
Ubuntu 16.04 (64 bit).
Netbeans 8.2 / jdk 8u121 (java code executed inside netbeans)
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
Compilation: g++ -o cpp_test cpp_test.cpp
Java 代码:
public class JavaTest {
public static void main(String[] args) {
final int ARRAY_LENGTH = 100;
final int FINISH_TRIGGER = 100000000;
int[] intArray = new int[ARRAY_LENGTH];
for (int i = 0; i < ARRAY_LENGTH; i++) intArray[i] = 1;
int i = 0;
boolean finished = false;
long loopCount = 0;
System.out.println("Start");
long startTime = System.nanoTime();
while (!finished) {
loopCount++;
intArray[i]++;
if (intArray[i] >= FINISH_TRIGGER) finished = true;
else if (i <(ARRAY_LENGTH - 1)) i++;
else i = 0;
}
System.out.println("Finish: " + loopCount + " loops; " +
((System.nanoTime() - startTime)/1e9) + " secs");
// 5 executions in range 5.98 - 6.17 secs (each 9999999801 loops)
}
}
C++ 代码:
//cpp_test.cpp:
#include <iostream>
#include <sys/time.h>
int main() {
const int ARRAY_LENGTH = 100;
const int FINISH_TRIGGER = 100000000;
int *intArray = new int[ARRAY_LENGTH];
for (int i = 0; i < ARRAY_LENGTH; i++) intArray[i] = 1;
int i = 0;
bool finished = false;
long long loopCount = 0;
std::cout << "Start\n";
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
long long startTime = (1000000000*ts.tv_sec) + ts.tv_nsec;
while (!finished) {
loopCount++;
intArray[i]++;
if (intArray[i] >= FINISH_TRIGGER) finished = true;
else if (i < (ARRAY_LENGTH - 1)) i++;
else i = 0;
}
clock_gettime(CLOCK_REALTIME, &ts);
double elapsedTime =
((1000000000*ts.tv_sec) + ts.tv_nsec - startTime)/1e9;
std::cout << "Finish: " << loopCount << " loops; ";
std::cout << elapsedTime << " secs\n";
// 5 executions in range 33.07 - 33.45 secs (each 9999999801 loops)
}
【问题讨论】:
-
你开启优化了吗?
-
@BillB 是的,对于发布代码,您至少应该打开优化:
g++ -O3 -o cpp_test cpp_test.cpp但是在我的系统上,Java在这个测试中仍然比c++快一点,我也会想知道为什么 :) 可能是Java优化器注意到了C++优化器没有的机会,毕竟这是过于简单的代码 -
尝试在 Java 和 C++ 的最后将
intArray输出到标准输出,因为优化器可能会删除与数组相关的代码,如果这不会改变可观察的行为。 -
@BillB 添加标志 -fprofile-generate 后编译,然后运行程序,然后使用 -fprofile-use 重新编译,然后再次运行。顺便说一句,您可能还想添加
-march=native。 -
它是
-O3,带有大写 O。并且(不确定您是否正确) -fprofile-use 替换 -fprofile-generate。
标签: java c++ performance