Java 影响计算时间的值的大小?

Java 影响计算时间的值的大小?,java,programming-languages,integer,theory,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; 这两个案例应该有完全相同的执行时间和开销,不是吗?实际操作是在长右边的每个位上执行的,而不管其中包含的值,对吗 如果我的假设是真的,那么有哪种语

假设我有一个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;
这两个案例应该有完全相同的执行时间和开销,不是吗?实际操作是在长右边的每个位上执行的,而不管其中包含的值,对吗

如果我的假设是真的,那么有哪种语言不是这样的呢

编辑:提示这一点的案例是我们在工作中使用的16位PIC(C代码),它计算可变时间内的平均值。在M S和Thom给出了下面的答案之后,我现在明白了这样引入bug是可能的,因为PIC是在时间敏感的基础上计算任务关键信息的


非常感谢大家。

您所说的在Java中是正确的-操作在独立于值的时间内执行。在某些语言(如Lisp)中,如果该值超过数据类型的最大合法值,则执行会自动切换到使用“大整数”包,这会大大降低执行速度

编辑 第一种情况和第二种情况之间有细微差别:值
1
是特殊的(与0一样)。的字节码

Long first=1L;
是:

而如果常数为(比如)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中是正确的-操作在独立于值的时间内执行。在某些语言(如Lisp)中,如果该值超过数据类型的最大合法值,则执行会自动切换到使用“大整数”包,这会大大降低执行速度

编辑 第一种情况和第二种情况之间有细微差别:值
1
是特殊的(与0一样)。的字节码

Long first=1L;
是:

而如果常数为(比如)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的
biginger
类)

至于上面的代码,没有哪种性能完全相同,只有一点例外,因为您使用的是
Long
而不是
Long
,您将得到一个预先制作的
Long
,用于
第一个
第二个
,而其他的则必须在第二个示例中创建


如果在第一个示例中使用像
200
201
这样的值,在第二个示例中使用像
1000000000
10000000001
这样的值,它们将是相同的。

我不知道任何值,但我可以设想一种语言,它只是具有一个“整数”数据类型,可以根据需要调整整数的大小,使小数字比大数字快。(考虑Java的
biginger
类)

至于上面的代码,没有哪种性能完全相同,只有一点例外,因为您使用的是
Long
而不是
Long
,您将得到一个预先制作的
Long
,用于
第一个
第二个
,而其他的则必须在第二个示例中创建


如果您在第一个示例中使用了
200
201
,在第二个示例中使用了
1000000000
10000000001
这样的值,它们将是相同的。

这不取决于语言,而是取决于底层硬件。寄存器大小和数据总线宽度

例如,如果Long.MAX_值大于16位机器中的16位,则需要2个周期才能将数据加载到内存中,因此情况1和情况2的执行时间不同


通常,这些最大值是根据机器位大小设置的,它不取决于语言,而是取决于底层硬件。寄存器大小和数据总线宽度

例如,如果Long.MAX_值大于16位机器中的16位,则需要2个周期才能将数据加载到内存中,因此情况1和情况2的执行时间不同


通常,这些最大值是根据机器位大小设置的,可能不是答案,但在32位计算机上,64位值不是线程安全的,因为它必须将值的一半放入寄存器并计算,然后再计算另一半。可能有一种优化会忽略值的全零部分,因此对于较小的数字会更快。

可能不是答案,但在32位计算机上,64位值不是线程安全的,因为它必须将一半值放入寄存器并计算,然后再计算另一半。可能有一种优化会忽略值的全零部分,因此对于较小的数字会更快。

很好。我搞错了L/L位。很好的区别。谢谢,接得好。我搞错了L/L位。很好的区别。谢谢。很高兴了解Lisp。当你转换语言时,这些微妙的东西会咬你。谢谢。很高兴了解Lisp。当你转换语言时,这些微妙的东西会咬你。谢谢。文字值必须是
long
1L
等)才能编译。文字值必须是
long
1L
等)才能编译。关于总线宽度、循环计数等:这将取决于加载的数据类型,而不是值本身。关于总线宽度、循环计数,等等:这取决于加载的数据类型,而不是值本身。在32位计算机上,即使是32位值也不一定是线程安全的。它可能取决于存储在内存中的32位的对齐方式。在Java中,它是