如何提高效率?

时间:2016-08-11 12:38:16

标签: java multithreading performance biginteger

作为学校的分配,我有一个非常大的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的根。

1 个答案:

答案 0 :(得分:2)

  • Java适用于多线程。 BigInteger的表现并不完全正确,但这不是问题所在。
  • 在该处理器上,最多8个线程可以完全利用这些内核。我怀疑你运行的自定义操作系统允许你将完全CPU控制权交给应用程序,所以你想为操作系统和相关服务保留至少1个逻辑核心,以及1个Java misc线程。
  • 如果您的程序需要数月才能在单个线程上完成,那么使用4个线程有效将需要数周才能完成。虽然这是一个很大的加速,但我认为这对你来说还不够,是吗?
  • 这是一项学校作业,正如你自己所说的那样。就像Project Euler一样,有很多方法可以做到,并且有很多方法可以做到。第一个在编程10分钟后在强大的机器上进行计算需要数天,后者需要数天的思考和数秒的计算。您的问题不是硬件或语言,而是算法。

现在你可以做得更好。从明显到不那么。

  • BigInteger aux = new BigInteger(Long.toString(i));你疯了吗?为什么要将long转换为String,然后将其解析为数字?!这是愚蠢的慢。只需使用BigInteger.valueOf(long val)
  • BigInteger比原语慢。如果你的价值(最多13位数,正如你自己所说的那样)适合long,你为什么需要呢?如果唯一的原因是divideAndRemainder方法 - 自己写一个!它将成为2行代码......
  • 你似乎在寻找特定数字的除数。 (对3,5,7,11的倍数的过滤使我认为你正在寻找素数并且稍后会进行一些过滤)这些算法有很多加速,主要是(和它的#39) ;不清楚你是否正在使用它)使得最大的检查数字是目标的平方根,而不是数字本身,它的一半,或任何人的任意组合。其他可以在wikimore complex wiki
  • 中找到