在java中布尔值或整数运算速度更快?

时间:2011-05-06 01:06:45

标签: java optimization

在Java中,用两个布尔值或两个两个整数进行操作会更快吗?例如,1 * 1或真&&假更快?双打怎么样?一般来说,最快的原始数据类型是什么?如何找出如何衡量这些东西的速度?

4 个答案:

答案 0 :(得分:5)

如果有趣的话我前段时间做过这样的测试: 测试就像(有大量的迭代):

final int[] int_array=...;
final boolean[] bool_array=...;
etc.
if (int_array[i]==67) ...
if (bool_array[i]) ...
if (float_array[i]==67.0F) ...
etc.
Time in seconds:
    Desktop(64bit Windows)  Device (Android)           

    bitmask 4.050           0.350
    boolean 4.554-5.169     0.306-0.359
    byte    0.583-0.915     0.263-0.293
    char    0.587-0.814     0.280-0.329
    short   0.583-0.914     0.280-0.290
    int     0.548-0.949     0.288-0.338
    float   0.824-1.129     0.965-1.035
    long    0.646-1.054     0.480-0.509
    double  0.828-0.971     1.138-1.214

答案 1 :(得分:3)

这取决于底层架构。通常,最快的类型将是与您的本机字大小相对应的类型:32位计算机上的32位或64位计算机上的64位。

因此,int比32位机器上的long更快;在{64}计算机上long可能比int更快,或者可能相同。至于boolean,我认为它仍然使用原生单词大小,所以它几乎与intlong一样快。

双打(使用浮点运算)往往较慢。

只要您处理原始类型,差异就可以忽略不计。真正慢的类型是类类型(如IntegerBoolean) - 如果您想要性能,请避免使用。

答案 2 :(得分:2)

原语比对象更快,原始操作的确切速度将取决于您正在使用的JVM(并假设JIT编译为本机代码,您运行JVM的本机架构),但1 * 1和true&& false可能是现代架构上的单机指令。

如何衡量?编写一个测试,在循环中多次调用您关心的操作,然后计时。

答案 3 :(得分:2)

通常那些使用Java自动装箱机制的人往往较慢,因为JVM必须将基元类型转换为自动装箱类型。

这意味着如果您坚持使用基元,那么您将比JVM为您创建的对象更快。另外,要测量,您可以在伪代码中执行类似的操作:

start timer
  do 10,000 operations on primitive/boolean
stop timer

display time

这可以帮助您衡量系统中的时差,但在多个系统中它可能相同或不同。

希望有所帮助:)干杯!