Go,Java,C的for循环对比,感觉哪里不对

Go代码

t := time.Now()
for j := 0; j < 8; j++ {
    for i := 0; i < 3000000; i++ {

    }
}
u := time.Now().Sub(t).Nanoseconds()
fmt.Println(u / 1000 / 1000)
输出:21

Java代码

long s = System.currentTimeMillis();
for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 3000000; j++) {

    }
}
System.out.println(System.currentTimeMillis() - s);
输出:5

C语言的

#include <stdio.h>
#include <sys/time.h>

int main(int argc, char** argv) {
  struct timeval start, stop;
  gettimeofday(&start, NULL);
  long s = start.tv_sec*1000 + start.tv_usec/1000;
  int i;
  for(i = 0; i < 8; i++) {
    int j;
    for(j = 0; j < 3000000; j++) {

    }
  }
  gettimeofday(&stop, NULL);
  long e = stop.tv_sec * 1000 + stop.tv_usec/1000;
  printf("%ld\n", e - s);
  return 0;
}
输出:100
写着玩的,哈哈

共 6 个回复


duanquanyong

感觉JAVA 检测 到是空循环根本没有执行

你把 i < 8 改成 i < 3000000
仍然是5

# 1

zhjh1209

Java这样写

long s = System.currentTimeMillis();
long n = 0;
for(int i=0;i<8;i++) {
    for(int j=0;j<3000000;j++) {
        n++;
    }
}
System.out.println(System.currentTimeMillis()-s);
System.out.println(n);

依然是 5ms
输出n是 24000000

不过同样的代码,Go 1.6 和Java有同样的性能, Go 1.5 是慢了点

# 2

fsyx

什么情况,哪个大神来解释一下,我测试的情况更糟糕

# 4

rocflyhi

1,优化问题:C语言编译的时候,应该没开优化;Go和Java编译时默认做了优化。
2,业务太简单:这样对比没有意义的,编译器可以做很多事情的。举个栗子,C代码,int a = strcmp(“b”, “a”),看编译后的汇编代码,直接成了 int a = 1,已经优化到这种地步了。同样的,Java在编译这段代码时,直接优化好了,哪怕中间加了n++,照样可以优化。

# 5