我需要计算一个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.这不是一个家庭作业,我真的需要这个。也许是另一种方式。
当你多线程的问题时,你的'for'循环中的条件会变得很糟糕。优化之后,'x - = 2L'的方式比'x - '慢,并且额外的停止标志也会增加开销。这些可能是问题的一部分 – torquestomp