临时变量的效率(例如java)
Efficiency of temporary variables (e.g java)
我想知道在构造函数或方法中使用临时变量时,效率或性能是否存在差异。
这是一个例子
// 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
不是,JIT编译后,不管你是用临时变量还是直接赋值都一样
字节码会有所不同,是的。在使用 String s = "Hello World"
的情况下,还会有两个字节码指令:astore_1
和 aload_1
,用于存储到 s
中,然后从 [=13] 中读取=].
但这只发生在字节码级别。虽然根本不需要 s
,但 javac
没有做任何优化(或者更好地说 - 做的非常非常少)并且不会消除它。制作这些是 JIT
的职责,而删除本地 s
对它来说是微不足道的。因此,虽然这个想法是正确的——第二个版本“还有更多工作要做”,但这个“更多”甚至不能用它有多小来衡量。这就像在十二月的西伯利亚,在外面拿了一杯热水,然后说因为那杯热水,外面的温度发生了变化。是的,它确实发生了变化,但这小到无法衡量。
我想知道在构造函数或方法中使用临时变量时,效率或性能是否存在差异。
这是一个例子
// 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
不是,JIT编译后,不管你是用临时变量还是直接赋值都一样
字节码会有所不同,是的。在使用 String s = "Hello World"
的情况下,还会有两个字节码指令:astore_1
和 aload_1
,用于存储到 s
中,然后从 [=13] 中读取=].
但这只发生在字节码级别。虽然根本不需要 s
,但 javac
没有做任何优化(或者更好地说 - 做的非常非常少)并且不会消除它。制作这些是 JIT
的职责,而删除本地 s
对它来说是微不足道的。因此,虽然这个想法是正确的——第二个版本“还有更多工作要做”,但这个“更多”甚至不能用它有多小来衡量。这就像在十二月的西伯利亚,在外面拿了一杯热水,然后说因为那杯热水,外面的温度发生了变化。是的,它确实发生了变化,但这小到无法衡量。