2013-07-23 45 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

相关问题