我在Java中做了一个简单的循环来测试速度。与C中的相同循环相比,需要更多时间。执行时,20亿次迭代需要 6.5秒
如果认为它很慢 - 可以做些什么来改善性能?
有人会责怪JVM的启动吗?或者 - JIT编译器没有完成它的工作吗?
处理器速度:3.4 GHz
public class Jrand {
public static void main (String[] args) {
float f;
long startTime = System.currentTimeMillis();
for (int i = 0; i < 2000000000; i++) {
f = i * 0.0001F;
}
long endTime = System.currentTimeMillis();
float totalTime = (endTime - startTime);
System.out.println("time: " + totalTime/1000);
}
}
答案 0 :(得分:6)
启动时间
Java启动时间通常比许多语言慢得多,包括 C,C ++,Perl或Python,因为很多类(首先是 必须先加载平台类库中的类 使用
所以这可能是一个原因
但我认为Java在各个方面往往比母语慢。看看这些统计数据:
图表:
你能加快速度吗?不 - 而且可能你可以责怪JVM;)
答案 1 :(得分:6)
此
for (int j = 0; j < 10; j++) {
float f;
long start = System.nanoTime();
for (int i = 0; i < 2000000000; i++) {
f = i * 0.0001F;
}
long end = System.nanoTime();
long timeToCallNanoTime = System.nanoTime() - end;
long time = Math.max(0, end - start - timeToCallNanoTime);
System.out.println("time: " + time + " ns.");
}
打印
time: 2580790 ns.
time: 4241443 ns.
time: 17 ns.
time: 0 ns.
time: 0 ns.
time: 0 ns.
time: 0 ns.
time: 0 ns.
time: 5 ns.
time: 0 ns.
正如您所看到的,JIT已完全优化了循环。它不能比那更快。
答案 2 :(得分:2)
我试过这个例子:
#include <stdio.h>
#include <time.h>
int main(void) {
clock_t start,finish;
double duration;
float f = 0;
long i;
start = clock();
for(i=0;i<2000000000;i++) {
f=i*0.0001;
}
finish = clock();
duration = (double) (finish - start);
printf ("Total duration : %f", duration/CLOCKS_PER_SEC );
}
使用gcc -O main.c
,此程序需要 540ms 才能执行。
使用gcc -O2 main.c
,输出为Total duration : 0.000000
(<1μs):似乎使用O2,循环不会执行。
在Java中,您的程序需要 4ms 才能在我的计算机上执行(标准计算机,没什么大不了的。)
你身边的6.5s 太长了。你似乎有严重的问题(或你读6.5秒而不是6.5毫秒)。
所以这只是编译器优化的问题。
答案 3 :(得分:1)
我不认为它是JVM启动或JIT编译时间,因为你的开始时间是在jvm启动并且编译了类之后。
答案 4 :(得分:1)
可以做些什么来改善表现?
那么,这将取决于循环实际在做什么(如果它正在做一些有用的事情。)在现实生活中,JIT通常非常擅长在代码中查找和优化热点,对于人为的例子来说,它更不如此像这样(这使得它们成为不好的基准。)
在这个例子中,你只是操纵一个浮点数,它总是在最后是相同的值 - 所以在现实生活中我会说通过删除循环并将其初始化到最终来加快它的速度那里有价值!