【发布时间】:2014-06-21 16:11:06
【问题描述】:
import java.util.Random;
public class Test{
static int r = new Random().nextInt(2);
static int a(){
return r==1 ? 1 :0;
}
public static void test1() throws Exception {
//
System.out.println(1403187139018L);
for (int i = 0; i < 1073741824; i++) {}//*
// Thread.sleep(20000);
long d = 0;
for (int j = 0; j < 10; j++) {
long y = System.currentTimeMillis();
for (int x = 0; x < 1073741823; x++) {
d += r==0?1:0;
}
System.out.println((System.currentTimeMillis() -y));
}
}
public static void test2() throws Exception{
// Thread.sleep(20000);
long d = 0;
for (int j = 0; j < 10; j++) {
long y = System.currentTimeMillis();
for (int x = 0; x < 1073741824; x++) {
d += r==0?1:0;
}
System.out.println((System.currentTimeMillis() -y));
// System.out.println("time:"+ (System.currentTimeMillis() - y));
}
}
public static void main(String[] args) throws Exception{
// Thread.sleep(20000);
test1();
test2();
}
}
当我运行上面的代码时,我得到这个输出:
32
26
28
28
32
29
35
33
30
31
1321
1308
1324
1277
1348
1321
1337
1413
1287
1331
为什么 test1 快得多?
除了以下几点没有区别:
System.out.println(1403187139018L);
for (int i = 0; i < 1073741824; i++) {}//*
另外,test1 的时间成本是 25-35 毫秒,我觉得难以置信。我用 C 语言编写了相同的代码,运行每个 for 循环大约需要 4 秒。
这种行为看起来很奇怪。我怎么知道何时添加:
System.out.println(1403187139018L);
for (int i = 0; i < 1073741824; i++) {}//*
另外,如果我改变了
r==0?1:0
到
a()
那么 test2() 比 test1() 运行得快。
我得到的输出是:
1403187139018
3726
3729
3619
3602
3797
4362
4498
3816
4143
4368
1673
1386
1388
1323
1296
1337
1294
1283
1235
1460
原始遗留代码: ...
long t = System.currentTimeMillis();
MappedByteBuffer mbb = map(new File("temp.mmp"), 1024L * 1024 * 1024);
System.out.println("load " + (System.currentTimeMillis() - t));//*
for (int i = 0; i < 2014L * 1024 * 1024; i++) {}//*
int d = 0;
for (int j = 0; j < 10; j++) {
t = System.currentTimeMillis();
mbb.position(0);
mbb.limit(mbb.capacity());
for (int i = 0; i < mbb.capacity(); i++) {
d += mbb.get();
}
....
}
System.out.println(d);
【问题讨论】:
-
这就是你检查生成代码的地方。
-
不,你看JVM生成的代码。
标签: java performance profile