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

临时变量的效率(例如java),java,performance,garbage-collection,temporary,Java,Performance,Garbage Collection,Temporary,我想知道在构造函数或方法中使用临时变量时,效率或性能是否会有所不同 这里有一个例子 // Get bufferedImage BufferedImage trayIconImage = ImageIO.read(getClass().getResource("/images/D.gif")); // Calculate width int trayIconWidth = new TrayIcon(trayIconImage).getSize(

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

这里有一个例子

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

不,在JIT编译之后,这一切都是一样的,无论您是使用临时变量还是直接分配它

字节码都会不同,是的。在使用
String s=“Hello World”
的情况下,还会有两条字节码指令:
astore\u 1
aload\u 1
,用于存储到
s
中,然后从
s
读取


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

我怀疑即使字节码也会是相同的…@assylias这将取决于是否包含调试符号,这是Java通常的默认情况。您好,感谢您的直接回答,但我比较了它,它们不一样。见上面编辑的文章。因此,这意味着pc必须执行更多的步骤,直到程序完成。@assylias字节码不可能是相同的…始终记住:可读性比任何东西都重要,但主要的效率问题除外,因为程序员效率低下比CPU效率低下贵得多。嗨,谢谢-这实际上提供了足够的信息,可以将其标记为解决方案。但是RAM的使用情况如何呢?就像线程对这些临时变量执行多次操作一样。它在任何时候都不会影响性能吗?我想我会尝试对它进行基准测试。@Nur1线程的整个堆栈是在创建线程时分配的。创建更多的局部变量可能会将其中的一些字节从未使用变为已使用,但大多数情况下,这些预先分配的堆栈空间中的大部分都是未使用的。只要你没有得到一个
堆栈溢出错误
,你额外的局部变量就没有效果。