假设我有这样一个 Java 程序:
//case1
Long first = 1;
Long second = 1;
Long third = first - second;
//case2
Long first = Long.MAX_VALUE;
Long second = 100000L;
Long third = first - second;
这两种情况应该具有完全相同的执行时间和开销,不是吗?实际操作是对Long右边的每一位进行的,不管里面包含的值是多少,对吧?
如果我的假设是正确的,是否有任何语言不是这种情况?
编辑:提示这个的案例是我们在工作中使用的 16 位 PIC(C 代码),它计算可变时间量的平均值。在从 M S 和 Thom 那里得到以下答案后,我现在明白有可能以这种方式引入错误,因为 PIC 正在计算任务关键信息,时间敏感。
非常感谢大家
最佳答案
您所说的在 Java 中是正确的 — 操作的执行时间与值无关。在某些语言(例如 Lisp)中,如果值超过数据类型的最大合法值,执行会自动切换到使用“大整数”包,这会大大减慢执行速度。
编辑
第一种和第二种情况略有不同:值 1
是特殊的(0 也是)。字节码为
Long first=1L;
是:
lconst_1
invokestatic #2; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
astore_1
而如果常量是(比方说)2L,则得到这个字节码:
ldc2_w #3; //long 2l
invokestatic #2; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
astore_2
由于 lconst_1
比 ldc2_w
运行得更快,因此情况 1 和情况 2 之间存在轻微的时间差异。
关于java - 值的大小影响计算时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8360934/