3

我在 Java 中做了一个简单的循环来测试速度。与 C 中的相同循环相比,它需要更多时间。执行20 亿次迭代大约需要6.5 秒

如果它被认为很慢 - 可以做些什么来提高性能?

可以怪 JVM 的启动吗?或者 - JIT 编译器没有完成它的工作吗?

  • 平台:windows xp
  • 处理器速度: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);
      }
    }
    
4

5 回答 5

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 已经完全优化了循环。它不能比这更快。

于 2013-09-17T12:17:35.293 回答
6

启动时间

Java 启动时间通常比许多语言慢得多,包括 C、C++、Perl 或 Python,因为在使用之前必须加载很多类(首先是来自平台类库的类)。

所以这可能是原因之一

但我也认为 Java 在各个方面都比本地语言慢。看看这些统计数据: 在此处输入图像描述

还有一张图: 在此处输入图像描述

你能让它更快吗?不 - 你可能会为此责怪 JVM ;)

于 2013-09-17T11:42:14.910 回答
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 中,您的程序在我的计算机上执行需要4 毫秒(标准计算机,没什么大不了的)。

你这边的6.5s太长了。你似乎有严重的问题(或者你读的是 6.5s 而不是 6.5ms)。

所以这只是编译器优化的问题。

于 2013-09-17T12:09:26.317 回答
1

我认为它不是 JVM 启动时间或 JIT 编译时间,因为您的开始时间是在 jvm 启动并编译类之后。

于 2013-09-17T11:31:05.433 回答
1

可以做些什么来提高性能?

好吧,这将取决于循环实际在做什么(如果它在做一些有用的事情。)在现实生活中,JIT 通常非常擅长在代码中查找和优化热点,对于像这样的人为示例(这就是使它们成为不良基准的原因。)

在这个例子中,你只是在操纵一个浮点数,它最后总是会是相同的值——所以在现实生活中,我会说通过删除循环并将其初始化为其最终值来加速它和然后!

于 2013-09-17T11:31:38.757 回答