作为学校的分配,我有一个非常大的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的根。
答案 0 :(得分:2)
现在你可以做得更好。从明显到不那么。
BigInteger aux = new BigInteger(Long.toString(i));
你疯了吗?为什么要将long
转换为String
,然后将其解析为数字?!这是愚蠢的慢。只需使用BigInteger.valueOf(long val)
。BigInteger
比原语慢。如果你的价值(最多13位数,正如你自己所说的那样)适合long
,你为什么需要呢?如果唯一的原因是divideAndRemainder
方法 - 自己写一个!它将成为2行代码......