2013-07-23 46 views
0

我需要計算一個64位數(n = pq)。 所以我實現了一個方法,它必須搜索範圍[1; SQRT(N)]。執行2個或多個Runnables會導致性能問題

在1,2 GHz處理器的Android上執行需要27秒鐘(不幸的是,我不知道一些CPU內核)。所以我決定把它平行。那麼,兩個Runnables給我的結果在51秒和3 - 在83.

我的程序只是在onCreate做什麼,只是調用此方法。

final static private int WORKERS_COUNT = 3; 

final static public int[] pqFactor(final long pq) { 
    stopFactorFlag = false; 

    long blockSize = (long)Math.ceil(Math.sqrt(pq)/WORKERS_COUNT); 
    ExecutorService executor = Executors.newFixedThreadPool(WORKERS_COUNT); 

    for (int workerIdx = 0; workerIdx < WORKERS_COUNT; ++workerIdx) { 
     Runnable worker = new FactorTask(pq, workerIdx * blockSize, (workerIdx + 1) * blockSize); 
     executor.execute(worker); 
    } 

    executor.shutdown(); 
    try { 
     executor.awaitTermination(5, TimeUnit.MINUTES); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

    return result; 
} 


private static boolean stopFactorFlag; 
private static int p, q; 

static private class FactorTask implements Runnable { 
    final private long pq; 
    private long leftBorder; 
    private long rightBorder; 
    public long pInternal; 
    public long qInternal; 

    /* Constructor was there */ 

    @Override 
    public void run() { 
     for (qInternal = rightBorder; !stopFactorFlag && qInternal > leftBorder && qInternal > 1L; qInternal -= 2L) { 
      if (pq % qInternal == 0L) { 
       pInternal = pq/qInternal; 
       p = (int)pInternal; 
       q = (int)qInternal; 
       stopFactorFlag = true; 
       break; 
      } 
     } 
    } 
} 

P. S.這不是一個家庭作業,我真的需要這個。也許是另一種方式。

+0

當你多線程的問題時,你的'for'循環中的條件會變得很糟糕。優化之後,'x - = 2L'的方式比'x - '慢,並且額外的停止標誌也會增加開銷。這些可能是問題的一部分 – torquestomp

回答

1

執行2個或更多的Runnable會導致性能問題

這在我看來,你的Android設備有1首或2個內核,並且增加線程您的問題要使其運行因爲你耗盡了你的CPU資源,速度更快。我建議查找您的設備規格以確定它有多少個內核。

如果我運行代碼,在我的4個核心的MacBook Pro:在〜

  • 2個線程6secs
  • 3線程〜4secs
  • 4線程〜3.5secs

這在我看來似乎是合理的線性的(考慮到啓動/關閉開銷),並向我指出,這不是妨礙你的代碼。

順便說一句,stopFactorFlag應該是volatile。我也看不出你是如何創建result陣列,但我擔心那裏的比賽條件。

+0

結果數組在try..catch塊之後創建,所以沒有競爭條件。所以,因爲我不知道這個設備的規格(沒有名字的中文平板電腦,程序沒有告訴我什麼,除了CPU速度),我認爲它是一個單核。我希望問題出現在我的代碼中,但現在我寧願複製其他人的Rho-Pollard算法。 – efpies

相關問題