出乎我的意料呀!还有谁再做一次测试

flyycyu 2004-01-14 11:55:41
for (int i = 0; i < 1000000; i++) {
func1(i);
}

static int func1(int i) {
double x = 1.27 * 1.27 * 1.27 * 1.27;
return i++;
}
这么一个循环,还有这么一个函数
不算启动时间,java由new java.util.Date()获得当前时间,
c由GetSystemTime获得当前时间

java:31ms
c:(移掉static):156ms
c:(加上inline):141ms

java是jdk1.4,c是vc 6 console应用程序!
机器DELL 610 2G内存!

所以不涉及桌面图形应用,java完全胜任!
...全文
38 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
rongrongGsr 2004-01-14
  • 打赏
  • 举报
回复
这种情况好像是不计算x的值的,Delphi里面是不计算的,你可以debug跟踪一下看看。
Schlemiel 2004-01-14
  • 打赏
  • 举报
回复
呵呵,说不定是被优化掉了,根本没计算x的值呢。
miwoo 2004-01-14
  • 打赏
  • 举报
回复
Integer.MAX_VALUE == 2^32-1 == 2147483647
cdwei80 2004-01-14
  • 打赏
  • 举报
回复
我认为这个题目应该进不了循环,因为INT 的范围好想没有那么大,而数据的存储会以反码的形式存在,1000000在里面是一个负数,所以进不了
miwoo 2004-01-14
  • 打赏
  • 举报
回复
这回不同了
static int func1(int);
Code:
0: ldc2_w #7; //double 2.60144641d
3: iload_0
4: iconst_0
5: imul
6: iconst_1
7: iadd
8: i2d
9: dmul
10: dstore_1
11: iload_0
12: iinc 0, 1
15: ireturn

}
iamwls 2004-01-14
  • 打赏
  • 举报
回复
改为这个再测试试

for (int i = 0; i < 1000000; i++) {
func1(i);
}

static int func1(int i) {
double x = 1.27 * 1.27 * 1.27 * 1.27*((i*0)+1);
return i++;
}
79cy 2004-01-14
  • 打赏
  • 举报
回复
学习。
jokerjava 2004-01-14
  • 打赏
  • 举报
回复
这也正常啊

运算效率
java只能达到和c相当的水平吧 应该比c略低才对吧
gz
futurebus 2004-01-14
  • 打赏
  • 举报
回复
hehe.
学习!
Leemaasn 2004-01-14
  • 打赏
  • 举报
回复
正常啊。。。



miwoo 2004-01-14
  • 打赏
  • 举报
回复
public class Test1 {

private static final int _count = 100000000;

public static void main(String[] args) {
long t = System.currentTimeMillis();
for (int i = 0; i < _count; i++) {
func1(i);
}
System.out.println(System.currentTimeMillis() - t);
}

static int func1(int i) {
double x = 1.27 * 1.27 * 1.27 * 1.27;
return i++;
}
}
----------------------------------------------------------------------
javap -classpath classes -c Test1
--->

public static void main(java.lang.String[]);
Code:
0: invokestatic #2; //Method java/lang/System.currentTimeMillis:()J
3: lstore_1
4: iconst_0
5: istore_3
6: goto 17
9: iload_3
10: invokestatic #3; //Method func1:(I)I
13: pop
14: iinc 3, 1
17: iload_3
18: ldc #4; //int 1000000
20: if_icmplt 9
23: getstatic #5; //Field java/lang/System.out:Ljava/io/PrintStream;
26: invokestatic #2; //Method java/lang/System.currentTimeMillis:()J
29: lload_1
30: lsub
31: invokevirtual #6; //Method java/io/PrintStream.println:(J)V
34: return

static int func1(int);
Code:
0: ldc2_w #7; //double 2.60144641d
3: dstore_1
4: iload_0
5: iinc 0, 1
8: ireturn

}
--------------------------
从static int func1(int);可以看出:
double x = 1.27 * 1.27 * 1.27 * 1.27;在编译时就已经算出来了,并
保存在常量池中。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧