执行2个或更多Runnable会导致性能问题

时间:2013-07-23 21:54:58

标签: java android multithreading performance runnable

我需要考虑64位数(n = pq)。 所以我实现了一个方法,搜索[1;范围内的所有数字。 SQRT(N)]。

使用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.这不是作业,我真的需要这个。也许是另一种方式。

1 个答案:

答案 0 :(得分:1)

  

执行2个或更多Runnables会导致性能问题

在我看来,您的Android设备有1个或2个内核,并且为您的问题添加线程而不是会让它运行得更快,因为您已经耗尽了CPU资源。我建议您查看设备规格,以确定它有多少核心。

如果我在我的4核MacBook Pro下运行你的代码:

  • 〜6secs中的2个帖子
  • 〜4secs中的3个帖子
  • 〜3.5secs中的4个帖子

在我看来这是合理线性的(考虑到启动/关闭开销),并向我表明它不是阻止你的代码。

顺便说一下,stopFactorFlag应为volatile。另外,我不知道你是如何创建你的result数组的,但我担心那里的竞争条件。