最近我开发了一个十亿计数器应用程序来测量手机的性能。
我使用以下代码来测量十亿的计数。
Start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
t1 = System.currentTimeMillis();
count = 1000000000;
while (count != 0){
--count;
}
t2 = System.currentTimeMillis();
tf = (t2-t1)/1000;
CountDisp.setText(""+tf);
}
});
使用此代码,我的手机花了(大约)75 秒数到十亿。
但是当我测量从 Google Play 商店下载的另一个应用程序的时间时,我的手机花了 37 秒才数到 10 亿。
如何使我的代码尽可能快?
或者还有其他方法吗?
注意:- 两个应用程序数到一百万所需的时间相同,(大约)0.110 秒
最佳答案
更快:
int count=1000000000;
while (count--!=0)
;
请注意,这对循环使用了不同的结构(仅读取一次 count
),并且它使用局部变量而不是实例字段。使用局部变量速度更快,因为它驻留在堆栈上的已知位置,并且 JVM 只需要一次操作即可检索它,而对于实例字段,JVM 需要查找 this
实例,然后加载到右侧字段中。对于大多数目的来说,这个额外的步骤所带来的差异是完全微不足道的,但你的循环是如此紧密(即,内容自由),以至于这个额外的步骤非常重要。
你甚至可以做得更好
long count=1000000000L;
因为这很可能是 64 位 JVM。
(就其他应用程序而言,它可能正在使用 JNI( native 代码),在这种情况下,您所做的任何操作都不会竞争。但我对此表示怀疑。)
关于java - 绩效十亿计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26220437/