Golang中国

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
写着玩的,哈哈

zhjh1209 于 2016-04-12 21:46 修改
6 回复
wangxingge
#1 wangxingge • 2016-04-12 21:29

不明觉厉啊,

duanquanyong
#2 duanquanyong • 2016-04-12 22:08

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

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

zhjh1209
#3 zhjh1209 • 2016-04-13 11:19

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 是慢了点

dxhdxh2k
#4 dxhdxh2k • 2016-04-13 23:56

用for range

fsyx
#5 fsyx • 2016-04-16 19:41

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

rocflyhi
#6 rocflyhi • 2016-04-17 23:28

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

需要 登录 后方可回复, 如果你还没有账号你可以 注册 一个帐号。