0

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

在具有 1,2 GHz 处理器的 Android 上执行需要 27 秒(不幸的是,我不知道 CPU 内核的数量)。所以我决定让它平行。好吧,两个Runnables在 51 秒内给我结果,在 83 秒内给我 3 个结果。

我的程序除了在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;
            }
        }
    }
}

PS这不是作业,我真的需要这个。也许是另一种方式。

4

1 回答 1

1

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

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

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

  • 约 6 秒内 2 个线程
  • 约 4 秒内 3 个线程
  • 约 3.5 秒内 4 个线程

在我看来,这似乎是相当线性的(考虑到启动/关闭开销),并向我表明,阻碍你前进的不是代码。

顺便说一句,stopFactorFlag应该是volatile。另外,我看不到您是如何创建result数组的,但我担心那里的竞争条件。

于 2013-07-23T22:12:30.393 回答