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

djp7away  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(420)

我想知道在构造函数或方法中使用临时变量时,效率或性能是否有差异。
下面是一个例子

// 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值的步骤。
有很多例子可以跳过多个临时变量,我知道这与可读性有关。但我想知道在速度、性能、效率或ram使用方面是否有任何差异。
垃圾收集器(例如java)是否处理这种临时操作?
编辑1:
我比较了两个基本片段的字节码。他们是不同的。

第二

所以这意味着电脑必须执行一个或多个指令来完成执行-我说的对吗?
问候nur1

kx5bkwkv

kx5bkwkv1#

不,在jit编译之后,不管是使用临时变量还是直接赋值,都是一样的

eoigrqb6

eoigrqb62#

字节码会有所不同,是的。如果你用这个的话 String s = "Hello World" ,将有两个字节码指令: astore_1 以及 aload_1 ,用于存储到 s 然后从 s .
但这只发生在字节码级别。虽然没有必要 s 完全, javac 不会做任何优化(或者更好地说,做得非常,非常少),也不会忽略这一点。是的 JIT 使这些义务,并消除当地的 s 对它来说是微不足道的。因此,尽管第二个版本的“还有更多的工作要做”的想法是正确的,但这个“更多”甚至不能衡量它有多小。就像12月在西伯利亚外面喝了一杯热水,说外面的温度因为那杯热水而改变了。是的,它确实改变了,但这是不可能的小测量。

相关问题