2014-12-23 67 views
0

我已經寫了一些代碼來計算Android設備上的CPU負載通過閱讀proc/stat中的第一行,大多數時間工作正常,除了它一次又一次地返回負值我意識到,空閒時間值有時下降,我創建了一個虛擬運行的類來演示此行爲:proc/stat空閒時間減少

public class MyRunnable implements Runnable{ 

    String[]cpuTimeInfo; 
    long idle2; 
    long idle1; 
    @Override 
    public void run() { 

     if (new File("/proc/stat").exists()) { 

      try{ 
       BufferedReader br = new BufferedReader(new FileReader(new File("/proc/stat"))); 
       String aLine; 

       while ((aLine = br.readLine()) != null){ 

        if(aLine.substring(0, 3).equals("cpu")){ 

         cpuTimeInfo = aLine.split("\\s+"); 
         idle1 = Long.parseLong(cpuTimeInfo[4]);; 

         try{ 
          Thread.sleep(1000); 
          br = new BufferedReader(new FileReader(new File("/proc/stat"))); 
          aLine = br.readLine(); 
          cpuTimeInfo = aLine.split("\\s+"); 
         } 
         catch(InterruptedException e){ 

         } 

         idle2 = Long.parseLong(cpuTimeInfo[4]);; 
         if(idle2 < idle1) 
          Log.d("????", "Idle 1: " + idle1 + " Idle 2: " + idle2); 
         break; 
        } 
       } 
       if (br != null) { 
        br.close(); 
       } 
      } 
      catch (IOException | NumberFormatException e){ 
      } 
     } 
     new Thread(this).start(); 
    } 

} 
  1. 可有人請向我解釋,這怎麼可能。
  2. 是否有適當的解決辦法或真正解決這個問題
+0

沒有解決問題,而是'Thread.sleep(1000)',你可以使用'TimeUnit.SECONDS.sleep(1L)';也可以使用'.split(「\\ s +」)':創建一個'private static fnal Pattern SPACES = Pattern.compile(「\\ s +」)'並使用'SPACES.split()'。最後,使用'ExecutorService'而不是'Thread'。 – fge

+0

@fge好的,我會的,謝謝 – Kakarot

回答

0

我遇到了同樣的問題,在Android設備上。我的想法是,閒置列的價值並沒有隨着時間的推移而減少,而是隨時間降低了三分之一。我的猜測是,它與每個CPU核心值的聚合有關。

但是我不知道如何解決這個問題。也許我們必須得到每個核心的價值,並自己進行增加。不知道,我還沒有走過那麼遠,我認爲這太過無關緊要。

解決方法其實很簡單:爲每個獲得的idleX更新一個空閒變量。如果新值低於空閒值,則跳過循環迭代。簡單地說,它意味着跳過閒置不會升高的任何情況。

這裏有幾個痕跡,很好地說明了手頭的問題。它是定期間隔/ proc/stat第一行的轉儲。看第5列,即從大約7M(錯誤)到10M(正確)的那一列。

Wed Mar 18 11:40:25 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392408 78027 265140 10190657 28775 74 3969 0 0 0] 
Wed Mar 18 11:40:31 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392602 78031 265285 10195990 28794 74 3974 0 0 0] 
Wed Mar 18 11:40:37 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392731 78049 265399 10197540 28804 74 3988 0 0 0] 
Wed Mar 18 11:40:43 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392882 78058 265521 7938411 28655 74 4017 0 0 0] 
Wed Mar 18 11:40:49 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 392956 78058 265636 10199960 28827 74 4029 0 0 0] 
Wed Mar 18 11:40:55 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393032 78058 265720 10201160 28836 74 4030 0 0 0] 
Wed Mar 18 11:41:01 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393159 78059 265809 7941553 28668 74 4030 0 0 0] 
Wed Mar 18 11:41:07 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393316 78070 265917 7942154 28679 74 4038 0 0 0] 
Wed Mar 18 11:41:13 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393441 78085 266048 7943935 28691 75 4054 0 0 0] 
Wed Mar 18 11:41:19 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393614 78086 266206 7950457 28704 75 4086 0 0 0] 
Wed Mar 18 11:41:26 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393716 78086 266295 10213601 28875 75 4087 0 0 0] 
Wed Mar 18 11:41:32 CET 2015,INFO,cpu: getSystemCpuUsage start=[cpu 393812 78086 266372 10214027 28875 75 4087 0 0 0] 
+0

嗨,謝謝你的回覆,我將空閒時間存儲在一個變量中,並在新的空閒時間低於前一個時跳過循環,我認爲這足夠好,我同意,這是浪費時間試圖弄清楚這一點 – Kakarot