【发布时间】:2016-12-18 05:01:22
【问题描述】:
作为学校评估,我有一个非常大的for(从 1 到 13 位数字),里面有一些 BigInteger 操作。为了减少循环,我可以跳过所有偶数并避免不必要的 BigInteger 操作,我可以检查 3、5、7 和 11 的倍数。这是一个示例:
for(long i = min; i < max; i += 2){
if( i%3 != 0 && i%5 != 0 && i%7 != 0 && i%11 != 0){
BigInteger aux = new BigInteger(Long.toString(i));
BigInteger[] aux2 = k.divideAndRemainder(aux);
if(aux2[1].longValueExact() == 0){
list.add(aux);
list.add(aux2[0]);
}
}
现在,这个循环需要几个月才能完成,所以我想在多个线程中打破for,每个线程都覆盖原始 13 位数字的窗口。
我的第一个问题是:使用 i7-3770 处理器,我需要多少线程才能尽可能高效?
编辑:评估是为了优化需要大量 CPU 的问题。在这种情况下,要找到 23 位数字的所有除数(k.divideAndRemainder(aux) 中的“k”),这就是我使用 BigIntegers 的原因。 for使用的13位数字是k的根。
【问题讨论】:
-
你确定学校的作业是要大量消耗 CPU,而不是想出一些聪明的算法来避免 CPU 消耗吗?
-
如果需要几个月才能完成,语言选择不是您主要关心的问题:算法是瓶颈。
-
第一个可以自己回答。生成应用程序可以处理的尽可能多的线程。然后检查日志,你知道你可以使用多少。这个程序的目的是什么?可能是您的实施效率低下。
-
如果您想避免问题被关闭,请编辑掉最后一个关于 Java 的问题,并尽快更改标题。编程语言在这里绝对不是问题。
-
听起来像XY problem。你真的应该解释一下学校的作业是什么。你想找到一个大数的所有除数吗?想看看一个数是否是素数?
标签: java multithreading performance biginteger