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