2014-10-06 68 views
0

最近,我开发了一个十亿计数器应用程序来衡量手机的性能。Performance-Billion Counter

我用下面的代码来衡量采取计数到十亿。

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秒,使用此代码计数到10亿。

但是当我测量从谷歌Play商店下载的另一个应用程序的时间,我的手机花费了37秒数到十亿。

如何让我的代码尽可能快?

或者还有另外一种方法吗?

注: - 无论是应用了同一时间数到一百万,(约)0.110秒

+0

没有其他应用程序的代码是不是真的可以说出为什么一个人比另一个花费更长的时间。 – Shaded 2014-10-06 16:20:50

+0

这是一部非常慢的手机。我最老的电话需要60秒,而新的八核电话少于三个。试用'count--'。 – greenapps 2014-10-06 16:28:34

+0

@resueman你的意思是,该应用程序是假的价值?请注意,它总是不准确的37秒。值相差几毫秒 – 2014-10-06 16:33:45

回答

2

更快的将是:

int count=1000000000; 
while (count--!=0) 
    ; 

注意,这里使用不同的结构循环(只有一次读取count),它使用本地变量而不是实例字段。使用局部变量的速度更快,因为它驻留在堆栈中的已知位置,并且只需要一个操作让JVM检索它;而对于实例字段,JVM需要查找this实例,然后在右边加载领域。对于大多数用途而言,这一额外步骤的差异是非常微不足道的,但是您的循环非常紧凑(即无内容),因此额外步骤非常重要。

你甚至可能与

long count=1000000000L; 

做的更好,因为这很可能是一个64位JVM。

(至于其他的应用程序去,它可能会使用JNI(本地代码),在这种情况下,不管你做什么都会竞争。我对此表示怀疑,虽然)。

+0

'因为这可能是一个64位的JVM。'我看不出JVM如何改变你想要初始化多头的方式。 – njzk2 2014-10-06 16:42:00

+0

@ njzk2 64位版本的64位JVM可能使用64位指令作为long,32位用于int。可以想象的是(虽然远未确定)64位芯片将对64位值执行基本操作,而不是对32位操作系统进行基本操作。 (对于32位80386的16位操作,这肯定是真的,它比32位操作慢得多) – 2014-10-06 16:50:40

+0

@ njzk2啊,我没有改变我初始化值的方式,我改变了类型从“int”到“long”。 – 2014-10-06 16:51:29