Java:基元类型是否会对性能产生影响



使用强制转换将long值分配给int变量更快,还是使用long变量更快?

或者这是一种选择,在消耗更多内存和处理更多内存之间?

下面是一个测试示例:

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());
    }
}

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

长(=64位)操作在32位CPU上更昂贵——一个32位CPU需要两条机器指令来添加两个64位数字(其他操作可能需要更多)。在64位CPU上,CPU时间应该没有差异。

相反(从int到long)的(隐式)强制转换需要"符号扩展",这意味着高位是从较小类型的最高位填充的。因此,它实际上可能有(小)成本,因为它不仅忽略了高位,而且需要将它们带入定义良好的状态。

最新更新