2014-10-06 50 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