我想知道在构造函数或方法中使用临时变量时效率或性能是否有所不同。
这是一个例子
// 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
字节码会有所不同,是的。在使用该代码的情况下String s = "Hello World"
,还会有另外两个字节码指令:astore_1
和aload_1
,用于存储到s
,然后从中读取s
。
但这仅发生在字节码级别。尽管根本没有必要s
,javac
但不做任何优化(或者更好的说-做的非常非常少),也不会消除它。JIT
制作这些文字是有责任的,而删除本地s
文字对于它来说是微不足道的。因此,尽管第二个版本的想法“是,还有很多工作要做”是正确的,但甚至无法衡量这个“更多”工作的大小。这就像是在12月在西伯利亚喝一杯热水,然后说外面的温度由于那杯热水而改变了。是的,它确实发生了变化,但是这很难衡量。
嗨,谢谢-实际上,此信息足以将其标记为解决方案。但是RAM的使用情况呢?就像线程对这些临时变量执行几次操作时一样。它会在任何时候影响性能吗?我想试试看并进行基准测试。
@ Nur1在创建线程时分配线程的整个堆栈。创建更多的局部变量可能会将其中的几个字节从未使用变为已使用,但是在大多数情况下,大部分预分配的堆栈空间还是未使用。只要您没有获得
StackOverflowError
,您的其他局部变量都将无效。