大家好,我已经开始学习Java了,我听说它很慢。为了做一个实验,我用C++和Java写了两个程序,它们看起来是一样的
import java.util.*;
class Java {
public static void main(String args[]) {
long beg = System.currentTimeMillis();
for (int i = 0; i < 200000000; ++i) { }
long end = System.currentTimeMillis();
System.out.println(end - beg);
}
}输出334
#include <cstdio>
#include <ctime>
int main() {
double beg = clock();
for (int i = 0; i < 200000000; ++i) { }
double end = clock();
printf("%f\n", (end - beg) / double(CLOCKS_PER_SEC) / 1000.0);
return 0;
}输出0.000810
我有点困惑。Java真的那么慢吗?还是我做错了什么?
发布于 2011-05-24 03:20:06
你不能像这样对编程语言进行微基准测试。
有数以千计的因素在起作用。请记住,例如,Java程序在虚拟机中运行,需要一些时间才能启动。
一些基准测试会告诉你C++更快,其他的则相反。这真的归结于基准测试的作用。在谷歌上搜索java c++基准测试,你会发现这两种情况都有很多。
现代即时编译器可以做任何C++编译器都能做的大多数优化,因此对于纯粹的数字处理算法,它们具有相似的性能数字。
发布于 2011-05-24 04:46:46
首先,你想做的事情可能是毫无意义的。尽管有一些相似之处,但(至少在我的经验中) C++和Java之间的性能差异很少。
如果您坚持要这样做,那么您的代码需要大量的工作才能生成准确地表示某些内容的结果,即使准确的结果可能没有任何意义。我会写这样的C++版本:
#include <iostream>
#include <ctime>
int main() {
unsigned value = 0;
static const int loops = 200000000;
static const double nano_factor = 1e9;
clock_t beg = std::clock();
for (int i=0; i<loops; ++i)
value += i;
clock_t end = std::clock();
std::cout << "Ignore: " << value << "\n";
std::cout << (((end - beg) / double(CLOCKS_PER_SEC)) / loops) * nano_factor
<< " nanoseconds/iteration";
return 0;
}这在循环中做了一些事情(尽管它仍然很微不足道),计算出一个我怀疑大多数编译器在编译时是否能计算出的结果。然后打印出来,所以至少有很高的概率循环将实际执行。
除此之外,我相信我已经修复了计时代码,所以它产生的结果至少与现实有关。
我将把Java版本的重写留给其他人,但是虽然它不需要那么多的工作,但它仍然需要一些相同的工作,然后它的结果才会真正与任何东西有很大关系。
发布于 2011-05-24 03:21:17
你做错了什么。
如果C++编译器什么也不做,它就足够聪明,可以优化你的循环。实际上,一个好的JVM (试着使用java -server)也可以做到这一点。;-)
https://stackoverflow.com/questions/6101827
复制相似问题