Warm tip: This article is reproduced from serverfault.com, please click

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

(performance - Efficiency of temporary variables (e.g java))

发布于 2020-11-28 09:41:48

我想知道在构造函数或方法中使用临时变量时效率或性能是否有所不同。

这是一个例子

    // 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

Questioner
Nur1
Viewed
0
Eugene 2020-11-28 20:49:38

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

但这仅发生在字节码级别。尽管根本没有必要sjavac但不做任何优化(或者更好的说-做的非常非常少),也不会消除它。JIT制作这些文字是有责任的,而删除本地s文字对于它来说是微不足道的。因此,尽管第二个版本的想法“是,还有很多工作要做”是正确的,但甚至无法衡量这个“更多”工作的大小。这就像是在12月在西伯利亚喝一杯热水,然后说外面的温度由于那杯热水而改变了。是的,它确实发生了变化,但是这很难衡量。