2011-12-02 52 views
1

说我有一个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的答案之后,我现在明白这是可能的,因为PIC是在计算时间敏感的基础上计算任务关键信息。

非常感谢大家。

+0

为了编译,字面值需要是'long'('1L'等)。 –

回答

2

你说的是真的在Java —操作执行在一个独立的值的时间。在某些语言(如Lisp)中,如果该值超过数据类型的最大合法值,则执行会自动切换为使用“大整数”数据包,这会显着降低执行速度。

EDIT 有所述第一和第二壳体之间的微小差异:值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之间有轻微的时间差异。

+0

很高兴知道Lisp。这些都是微妙的东西,可以咬你当你转移语言。谢谢。 – Sheriff

1

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

至于你在那里的代码,没有那些会完全与轻微异常监守你正在使用的不是Longlong会得到相同的性能预先做了firstsecondLong其他的必须在第二个例子中创建。

如果你使用像你的第二个在你的第一个例子20020110000000000100000000001值,他们会是相同的。

+0

好抓。我对L/l位进行了愚蠢的处理。好的区别。谢谢。 – Sheriff

1

它不依赖于语言,而是依赖于底层硬件。寄存器大小和数据总线宽度。例如,如果Long.MAX_VALUE在16位机器中大于16位,则需要2个周期来将数据加载到存储器中,因此情况1和情况2将具有不同的执行时间。

通常这些最大值与机位大小

+0

关于总线宽度,周期数等:这取决于所加载的数据类型,而不是数据本身。 –

1

也许不是一个答案,根据设定,但在32位计算机上,64位值不是线程安全的,因为它必须在寄存器中放置半值然后计算,然后另一半。可能会有一个优化会忽略值的全零部分,因此对于较小的数字会更快。

+1

甚至32位值在32位计算机上也不一定是线程安全的。它可以取决于存储器中存储的32位的对齐。在Java中,它是特定于实现的:_“Java虚拟机可自由执行写入长整数和双整数值的原子或两部分。”_([Java语言规范第17.7节](http://java.sun.com/docs) /books/jls/third_edition/html/memory.html#17.7)) –