gpt4 book ai didi

java - 哪种声明变量的方式最快?

转载 作者:行者123 更新时间:2023-12-03 06:52:33 25 4
gpt4 key购买 nike

对于经常调用的函数中使用的变量以及黑莓机上 J2ME 中的实现(如果这改变了某些内容,您能解释一下吗)?

class X {
int i;
public void someFunc(int j) {
i = 0;
while( i < j ){
[...]
i++;
}
}
}

class X {
static int i;
public void someFunc(int j) {
i = 0;
while( i < j ){
[...]
i++;
}
}
}

class X {
public void someFunc(int j) {
int i = 0;
while( i < j ){
[...]
i++;
}
}
}

我知道静态类变量与非静态类变量的访问方式存在差异,但我不知道这会影响速度。我还记得在某处读到过,函数内变量可以访问得更快,但我不知道为什么以及在哪里读到的。

问题背景:游戏中的某些绘画函数被过度频繁地调用,当在较大的循环中使用变量时,即使访问时间的微小差异也会影响整体性能。

更新

我设置了一个小测试(下面的代码)并在真实设备上运行它以查看结果如何。我对一个函数调用了 10000 次,该函数循环访问一个变量 10000 次。

  • 如果变量在函数中,则需要约 9250 毫秒才能运行
  • 如果变量属于该类,则运行时间约为 21700 毫秒
  • 如果变量属于该类,但是静态的,则运行时间约为 210000 毫秒。

我不知道测试结果的相关性如何,它们是否适用于现实世界的程序以及是否没有其他外部因素在起作用。但是,假设它们这样做,因为它与此处最常见的 View 相匹配,那么访问时间之间存在相当大的差异。

这是否属于过早优化?也许吧,但这似乎也是尽可能使用函数内变量的有用指南。即使将类变量复制到函数内变量似乎也会影响执行时间。

   final static int MAX = 10000;
private void runTest()
{
long startTime = System.currentTimeMillis();
for(int count = 0; count < MAX; count++)
test1(MAX);
test1.setText(""+(System.currentTimeMillis()-startTime));

startTime = System.currentTimeMillis();
for(int count = 0; count < MAX; count++)
test2(MAX);
test2.setText(""+(System.currentTimeMillis()-startTime));

startTime = System.currentTimeMillis();
for(int count = 0; count < MAX; count++)
test3(MAX);
test3.setText(""+(System.currentTimeMillis()-startTime));

}

void test1(int j)
{
int i = 0;
while(i < j)
{
i++;
}
}
int i2;
void test2(int j)
{
i2 = 0;
while(i2 < j)
{
i2++;
}
}
static int i3;
void test3(int j)
{
i3 = 0;
while(i3 < j)
{
i3++;
}
}

最佳答案

它们具有完全不同的语义 - 您希望该值成为类状态的一部分、类实例状态的一部分,还是方法的本地状态?

JIT 有更多机会优化最后一个版本,因为它知道有关变量可能在哪里使用的所有信息(并且不需要担心其他线程访问它)。我想说它可能是最快的。

不过,您应该真正进行测试 - 一般来说,首先编写最易读的代码,并在尝试这种微优化之前看看是否确实遇到瓶颈。

关于java - 哪种声明变量的方式最快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2929881/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com