Java: 原始类型转换对性能有影响吗?

Java: Does primitive type casts performance impact?

是使用强制转换将 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 位 CPUs 上更昂贵——32 位 CPU 将需要两条机器指令来添加两个 64 位数字(其他操作可能需要还有很多)。在 64 位 CPUs 上,CPU 时间应该没有区别。

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