【问题标题】:how to improve the efficiency? [closed]如何提高效率? [关闭]
【发布时间】: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


【解决方案1】:
  • Java 非常适合多线程。 BigInteger 并不完全是高性能的,但这不是问题。
  • 在该处理器上,最多 8 个线程可以完全利用内核。我怀疑您运行的自定义操作系统允许您将完全 CPU 控制权让给应用程序,因此您希望为操作系统和相关服务保留至少 1 个逻辑核心,以及为 Java 杂项线程保留 1 个逻辑核心。
  • 如果您的程序需要数月才能在单个线程上完成,那么使用 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 的倍数让我觉得您正在寻找素数,稍后会进行一些过滤)此类算法有许多加速,主要是(不清楚您是否'正在使用它)正在使最大检查数字成为目标的平方根,而不是数字本身,它的一半,或任何任意绑定的人组成。其他的可以在wikimore complex wiki找到

【讨论】:

  • 我编辑了我的帖子。我会尝试目前给出的一些建议。
猜你喜欢
  • 2019-04-27
  • 2013-03-27
  • 2013-07-03
  • 2011-02-21
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 2022-10-28
  • 1970-01-01
相关资源
最近更新 更多