我是新来的Scala问题,只是写了这个程序:上斯卡拉性能tunning
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;
检查这个http://stackoverflow.com/questions/9711785/find-prime-numbers-using-scala-help-me-to-improve/13202109#13202109 – 2014-10-31 09:45:40
你说什么运行“你真的很慢“?有更快的方法,但你的方法似乎并不合理 – 2014-10-31 11:08:05
花费10秒钟,发现200万的质数是缓慢的,因为使用Eratosthenes的一个简单的基本Sieve只需要几十个毫秒的微不足道的任务。部分原因是模数(“%”)操作所隐含的分割是现代CPU在每秒钟10个CPU时钟周期内执行的最慢基元整数操作之一,而添加通常需要CPU时钟周期的一小部分,而即使乘法只需要大约一个时钟周期。 Eratosthenes的Sieve使用简单的基本操作执行所有内循环操作,每个循环只有几个时钟。 – GordonBGood 2015-04-02 06:48:18