临时变量的效率(例如java)

Efficiency of temporary variables (e.g java)

我想知道在构造函数或方法中使用临时变量时,效率或性能是否存在差异。

这是一个例子

    // Get bufferedImage
    BufferedImage trayIconImage = ImageIO.read(getClass().getResource("/images/D.gif"));

    // Calculate width
    int trayIconWidth = new TrayIcon(trayIconImage).getSize().width;
    
    // Create TrayIcon
    TrayIcon trayIcon = new TrayIcon(trayIconImage.getScaledInstance(trayIconWidth, -1, Image.SCALE_SMOOTH));

所以我有一个临时变量“trayIconWidth”

不过我也可以这样做:

    //Get bufferedImage
    BufferedImage trayIconImage = ImageIO.read(getClass().getResource("/images/D.gif"));

    // Create TrayIcon
    TrayIcon trayIcon = new TrayIcon(trayIconImage.getScaledInstance(new TrayIcon(trayIconImage).getSize().width, -1, Image.SCALE_SMOOTH));

所以基本上我跳过了获取宽度的 int 值的步骤。

有很多示例可以跳过多个临时变量,我知道这与可读性和内容有关。 但我想知道在速度、性能、效率或内存使用方面是否有任何差异。

(例如 java)垃圾收集器是否处理这种临时操作?

编辑 1:

我比较了两个基本片段的字节码。它们是不同的。 第二

所以这意味着 pc 必须执行一条或多条指令才能完成执行 - 我说得对吗?

问候 Nur1

不是,JIT编译后,不管你是用临时变量还是直接赋值都一样

字节码会有所不同,是的。在使用 String s = "Hello World" 的情况下,还会有两个字节码指令:astore_1aload_1,用于存储到 s 中,然后从 [=13] 中读取=].

但这只发生在字节码级别。虽然根本不需要 s,但 javac 没有做任何优化(或者更好地说 - 做的非常非常少)并且不会消除它。制作这些是 JIT 的职责,而删除本地 s 对它来说是微不足道的。因此,虽然这个想法是正确的——第二个版本“还有更多工作要做”,但这个“更多”甚至不能用它有多小来衡量。这就像在十二月的西伯利亚,在外面拿了一杯热水,然后说因为那杯热水,外面的温度发生了变化。是的,它确实发生了变化,但这小到无法衡量。