我是新來的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