java - 值的大小影响计算时间?

标签 java programming-languages integer theory

假设我有这样一个 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_1ldc2_w 运行得更快,因此情况 1 和情况 2 之间存在轻微的时间差异。

关于java - 值的大小影响计算时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8360934/

相关文章:

java - 如何保存 tuplas 值以便稍后搜索

c - 第一语言的良好输出

java - 如何将对象转换为 int

c# - 使用 double 有问题,我被困在某个地方?

c - 如何在C中从这种类型的字符串中获取数字

java - 在 XmlAdapter 中获取当前主机

java - 计算两个 java.sql.Timestamp 之间的差异显示负值

java - 如何将Java项目从jar导入到eclipse中?

java - 为了提高我的编程技能,我想关注 "learn a new language a year"。 2011 年我们可以学到什么

windows - 网络 MIDI 编程