Bra*_*mos 0 c++ java optimization performance loops
以下小程序计算了所有数字的总和,从1到10亿,我们用C++和Java编写,就像我写的那样.我的理解是C++是"更快"的语言,但是这个代码的java版本在~.5秒内完成,对于C++来说约为3秒.
C++(GCC编译器):
int main(){
long long x = 0;
for (long i=0;i<1000000001;i++){
x=x+i;
}
cout << x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
JAVA:
public class Main {
public static void main(String[] args) {
long x=0;
for (long i=0;i<1000000001;i++){
x=x+i;
}
System.out.println(x);
}
}
Run Code Online (Sandbox Code Playgroud)
如何优化C++代码与JAVA版本一样快?它甚至可能吗?
如果用优化编译,那么C++版本是相当快.
Java的:
javac Main.java
$ time java Main
500000000500000000
real 0m0.727s
user 0m0.724s
sys 0m0.004s
Run Code Online (Sandbox Code Playgroud)
C++:
clang -O3 main.cpp -o cpp
$ time ./cpp
500000000500000000
real 0m0.003s
user 0m0.000s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
我的铿锵版:
$ clang --version
clang version 4.0.0-1ubuntu1 (tags/RELEASE_400/rc1)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Run Code Online (Sandbox Code Playgroud)
我的Java版本:
$ javac -version
javac 1.8.0_144
Run Code Online (Sandbox Code Playgroud)
原因是优化是一个缓慢的过程; 如果关闭优化,可以加快编译速度.这对于开发来说更好,所以这是Clang开发人员选择的默认值.Java可能更快,因为它在运行时进行了更多优化.JVM字节码与它编译的源代码没有什么不同!
这个问题是不该做的一个完美的例子.整个循环相当于单个赋值,任何优化编译器都知道它.所以你要测量启动程序和输出一行所需的时间.
然后,Java必须失去您想要的任何因素,因为运行Java代码包括启动JVM并且这非常慢.此外,它还包括优化编译.javac所做的只是从Java源码到Java字节码的编译,并没有尝试优化任何东西.所有优化都在运行时发生(字节码到机器代码).1
因此,我们可以得出结论,对于任何花费不到几秒钟的任务,Java非常慢.如果你足够努力,你可以得到20或无穷大的因子(除以零).
更重要的结论是没有意义.请参阅如何在Java中编写正确的微基准测试?,如果你想要一个有意义的结果.
1适用于桌面Java.在Android上,它是不同的.