Java原语类型转换对性能有影响(关于位CPU)?

时间:2015-03-23 18:14:18

标签: java performance algorithm

什么是更快(如果有差异),使用转换设置一个消耗较少的内存值或不使用转换并使用大变量? 或者它是一个选择,消耗更多的内存或更多的处理?

例如:

import java.time.Duration;
import java.time.Instant;

public class NanoTest {

final int loop = 20000;

public void testNoCasting() {
    long sum = 0;
    long time = System.currentTimeMillis();

    for (int i = 0; i < loop; i++) {
        sum += System.currentTimeMillis() - time;
    }

    System.out.println(sum);
}

public void testIntCasting() {
    int sum = 0;
    long time = System.currentTimeMillis();

    for (int i = 0; i < loop; i++) {
        sum += (int) (System.currentTimeMillis() - time);
    }

    System.out.println(sum);
}

public static void main(String[] args) {
    NanoTest nt = new NanoTest();

    Instant start = Instant.now();

    nt.testNoCasting(); // or nt.testIntCasting();

    Instant end = Instant.now();

    System.out.print("Duration: ");
    System.out.println(Duration.between(start, end).getNano());

}

}

1 个答案:

答案 0 :(得分:0)

从long到int的类型转换只是忽略了前导32位,所以它应该或多或少是免费的。

32位CPU上的长(= 64位)操作更加昂贵 - 32位CPU需要两个机器指令才能添加两个64位数字(其他操作可能需要更多)。在64位CPU上,CPU时间应该没有区别。

(隐式)转换(从int到long)需要“sign extension”,这意味着从较小类型的最高位填充高位。因此它实际上可能具有(小)成本,因为它不仅忽略高位,而且需要将它们带入明确定义的状态。