【发布时间】:2014-10-31 09:17:39
【问题描述】:
我是 Scala 新手,刚刚写了这个程序:
def isPrime(num: Int, primes: scala.collection.mutable.MutableList[Int]): Boolean = {
primes.takeWhile( i => i * i <= num).forall( num % _ > 0)
}
//def isPrime(num: Int, primes: scala.collection.mutable.MutableList[Int]): Boolean = {
// !primes.forall(num%_!=0)
//}
def primeListUnder(upper: Int) = {
val primes=scala.collection.mutable.MutableList(2,3);
var num=4
while(num<upper) {
if(isPrime(num,primes))
{
primes+=num
}
num+=1
}
primes
}
这是试图获取某个指定上限下的所有素数。但它运行得非常慢。 有什么建议吗?
添加: 其实我的意思是要知道为什么这个程序运行得这么慢。这不是关于如何计算素数。
编辑: 将 isPrime 方法更改为首先过滤掉一些数字(数学上)。 现在运行速度更快,在我的 mac 上大约需要 10 秒才能数到 2000000;
【问题讨论】:
-
您说它运行“非常慢”的依据是什么?有更快的方法,但你的方法似乎不是不合理的方法
-
花 10 秒来找到 200 万个素数是很慢的,因为即使使用简单的 Eratosthenes 基本筛,这样一项微不足道的任务也只需要 10 毫秒。部分原因是您的模(“%”)运算所暗示的除法是现代 CPU 以每 10 个 CPU 时钟周期执行的最慢的原始整数运算之一,而加法通常需要 CPU 时钟周期的一小部分,并且甚至乘法只需要大约一个时钟周期。 Eratosthenes 筛子使用简单的基本操作来执行所有内部循环操作,每个循环只需几个时钟。
标签: performance scala