【问题标题】:Java: Does primitive type casts performance impact? [duplicate]Java:原始类型是否会影响性能? [复制]
【发布时间】:2020-07-02 08:22:14
【问题描述】:

使用强制转换将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());

    }
}

【问题讨论】:

  • 你的测试揭示了什么?
  • 确实有更好的方法来测试 JVM 的性能,你知道的...
  • 你好 Vivin,另一个问题是关于对象转换的,我的疑问是关于原始类型。谢谢。
  • 为什么不用System.nanoTime();哪个更准确?
  • 我怀疑执行时间太小,无法用毫秒来衡量。我建议你尝试执行数千个转换操作,而不是一次一个。

标签: java performance primitive


【解决方案1】:

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

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

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

【讨论】:

  • 我想要的这种解释水平。谢谢。
  • 32 位 CPU 肯定使用 much 更多指令来进行 64 位操作 - 您使用的术语不正确。即使是最琐碎的操作通常也包含几条指令,有的甚至会导致一个操作产生数千条指令(如硬件 AES 解密/加密)。
  • 你说得对——我只是在谈论加法(因为在示例中使用了它)。我认为乘法应该需要四,然后对于更复杂的操作,这会相应地加起来。我已经相应地更新了答案。
猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2013-03-09
  • 1970-01-01
相关资源
最近更新 更多