我想知道在构造函数或方法中使用临时变量时,效率或性能是否有差异。
下面是一个例子
// 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
2条答案
按热度按时间kx5bkwkv1#
不,在jit编译之后,不管是使用临时变量还是直接赋值,都是一样的
eoigrqb62#
字节码会有所不同,是的。如果你用这个的话
String s = "Hello World"
,将有两个字节码指令:astore_1
以及aload_1
,用于存储到s
然后从s
.但这只发生在字节码级别。虽然没有必要
s
完全,javac
不会做任何优化(或者更好地说,做得非常,非常少),也不会忽略这一点。是的JIT
使这些义务,并消除当地的s
对它来说是微不足道的。因此,尽管第二个版本的“还有更多的工作要做”的想法是正确的,但这个“更多”甚至不能衡量它有多小。就像12月在西伯利亚外面喝了一杯热水,说外面的温度因为那杯热水而改变了。是的,它确实改变了,但这是不可能的小测量。