我需要考虑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.这不是作业,我真的需要这个。也许是另一种方式。
答案 0 :(得分:1)
执行2个或更多Runnables会导致性能问题
在我看来,您的Android设备有1个或2个内核,并且为您的问题添加线程而不是会让它运行得更快,因为您已经耗尽了CPU资源。我建议您查看设备规格,以确定它有多少核心。
如果我在我的4核MacBook Pro下运行你的代码:
在我看来这是合理线性的(考虑到启动/关闭开销),并向我表明它不是阻止你的代码。
顺便说一下,stopFactorFlag
应为volatile
。另外,我不知道你是如何创建你的result
数组的,但我担心那里的竞争条件。