Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java编译器创建新的局部变量或访问全局/成员变量的工作量是否较少?_Java_Swing_Timer - Fatal编程技术网

Java编译器创建新的局部变量或访问全局/成员变量的工作量是否较少?

Java编译器创建新的局部变量或访问全局/成员变量的工作量是否较少?,java,swing,timer,Java,Swing,Timer,我有一个关于最佳实践的问题 我已经编写了一个动画模拟时钟类,它使用Swing计时器将秒指针、分针和时针的位置重新绘制到一个每秒调用一次的时钟上 我使用三个int变量来存储当前秒、分钟和小时的临时值 如果paintComponent()方法是使用这三个变量的唯一方法,那么如果变量被全局声明为,paintComponent(),那么它们将被创建一次,并且在计时器每次调用paintComponent()时被简单地编辑,程序的处理器负载是否会更有效,或者每次使用时最好在paintComponent()方

我有一个关于最佳实践的问题

我已经编写了一个动画模拟时钟类,它使用
Swing
计时器
将秒指针、分针和时针的位置重新绘制到一个每秒调用一次的时钟上

我使用三个
int
变量来存储当前秒、分钟和小时的临时值


如果
paintComponent()
方法是使用这三个变量的唯一方法,那么如果变量被全局声明为
paintComponent()
,那么它们将被创建一次,并且在计时器每次调用
paintComponent()
时被简单地编辑,程序的处理器负载是否会更有效,或者每次使用时最好在
paintComponent()
方法的作用域中声明局部变量

不管用哪种方法。局部变量将在堆栈上分配,无论发生什么情况,都将创建该堆栈。变量的额外存储只会更改从堆栈分配的增量(即SP=SP+10 vs SP=SP+6)。全局将被分配一次,但堆栈分配也不会“花费任何东西”

所以这里没有区别


简单地说,您应该编写“惯用”Java,并让JIT处理诸如提升局部变量之类的边缘情况优化。

您想将本质上的局部变量转换为全局变量吗?每个方面都有一个坏主意:可维护性、可读性、性能,随便你怎么说。但这并不能回答关于性能(“处理器负载”)的问题:与局部变量相比,每次创建变量是否比额外访问字段更昂贵?不过,我同意你的结论,尤其是在这种情况下。这确实回答了问题,不必担心“处理器负载”,不管这意味着什么,内存访问都是堆栈上的内存访问。@JarrodRoberson性能上肯定存在差异,由于引用的局部性和由此产生的缓存友好性,它有利于局部变量。您可以看到,我们有两个案例,它们的差异与这里提出的两种方法之间的差异完全相同。@JarrodRoberson问题中明确说明了这一点,因此当然有人对此表示担忧。这是问题中提出的一个问题(“如果这样做,程序的处理器负载会更有效吗”)。它可能没有效果,但那将是一个答案。这个术语可能有点离题,但我认为它的意思是显而易见的。“额外存储”不是问题的一部分。