【发布时间】:2011-04-29 15:24:23
【问题描述】:
我有点问题。我想使用 scala.concurrent.ops.replicate 来并行化我的程序。但我发现,算法实际上变得慢得多。 所以我写了一个小测试,仍然得到相同的结果。所以他们来了。
序列号:大约需要 63 秒才能完成
object SerTest {
def main(args: Array[String]) {
for(x <- 1 to 10){
for(i <- 1 to 4) {
for(j <- 1 to 100000) {
val a = BigInt(j).isProbablePrime(1000)
if(!a && j == 100000) println(i + " is ready")}}}}}
并发代码:大约需要 161 秒才能完成
object ParTest {
def main(args: Array[String]) {
for(x <- 1 to 10){
replicate(1,5) { i =>
for(j <- 1 to 100000) {
val a = BigInt(j).isProbablePrime(1000)
if(!a && j == 100000) println(i + " is ready")}}}}}
那么,我犯的完全明显且令人尴尬的错误在哪里? :)
编辑:哦,我在四核 CPU 上运行它。所以它实际上应该更快:)
Edit2:由于 Kevin Wright 的回答,我稍微更改了程序以延长运行时间。
【问题讨论】:
-
BigInt.isProbalyPrime 中是否发生了一些奇怪的事情?我用一些愚蠢的斐波那契线替换了那条线,复制代码确实更快(在双核上)。
-
哦,哇,你是对的 :) 永远不会想到这一点。只是想使用一种我认为需要一些时间来计算的方法。尽管为什么会发生这种情况仍然很有趣。因为我在原始程序中得到了相同的行为,并且我没有使用 isProbablePrime 或类似的东西。
标签: scala concurrency scala-2.8