gpt4 book ai didi

multithreading - 为什么我的斯卡拉 future 没有效率更高?

转载 作者:行者123 更新时间:2023-12-03 14:10:32 26 4
gpt4 key购买 nike

我在32位四核Core2系统上运行以下scala代码:

def job(i:Int,s:Int):Long = {
val r=(i to 500000000 by s).map(_.toLong).foldLeft(0L)(_+_)
println("Job "+i+" done")
r
}

import scala.actors.Future
import scala.actors.Futures._

val JOBS=4

val jobs=(0 until JOBS).toList.map(i=>future {job(i,JOBS)})
println("Running...")
val results=jobs.map(f=>f())
println(results.foldLeft(0L)(_+_))

(是的,我的确知道有很多更有效的方法可以对一系列整数求和;这只是让CPU做某事)。

根据我将JOBS设置为的内容,代码将在以下时间运行:
JOBS=1 : 31.99user 0.84system 0:28.87elapsed 113%CPU
JOBS=2 : 27.71user 1.12system 0:14.74elapsed 195%CPU
JOBS=3 : 33.19user 0.39system 0:13.02elapsed 257%CPU
JOBS=4 : 49.08user 8.46system 0:22.71elapsed 253%CPU

令我惊讶的是,这实际上并没有超出2个“正在运行”的 future 范围。我做了很多多线程C++代码,毫无疑问,如果我用Intel的TBB或 boost::threads编码这种事情,我可以很好地扩展到4个内核,并看到> 390%的CPU使用率(它的详细程度要高得多)类(class))。

因此:发生了什么事,如何将扩展到我希望看到的4个内核?这受scala或JVM中的限制吗?它发生在我身上,我实际上并不知道scala的 future 运行在“哪里”……是每个 future 产生的线程,还是“ future ”提供了专门用于运行它们的线程池?

[我在带有sun-java6(6-20-0lennny1)的Lenny系统上使用Debian/Squeeze的scala 2.7.7软件包。]

更新:

正如Rex的回答所建议的那样,我重新编码以避免创建对象。
def job(i:Long,s:Long):Long = {
var t=0L
var v=i
while (v<=10000000000L) {
t+=v
v+=s
}
println("Job "+i+" done")
t
}
// Rest as above...

这是如此之快,以至于我不得不显着增加迭代计数才能在任意时间内运行!结果是:
JOBS=1: 28.39user 0.06system 0:29.25elapsed 97%CPU
JOBS=2: 28.46user 0.04system 0:14.95elapsed 190%CPU
JOBS=3: 24.66user 0.06system 0:10.26elapsed 240%CPU
JOBS=4: 28.32user 0.12system 0:07.85elapsed 362%CPU

这更像我希望看到的(尽管3个工作案例有点奇怪,一个任务始终比其他两个任务持续完成几秒钟)。

再进一步说明一下,在四核超线程i7上,带有 JOBS=8的后者版本实现了x4.4的加速,而JOBS = 1,CPU使用率为571%。

最佳答案

我的猜测是,垃圾收集器所做的工作比添加本身要多。因此,您受到垃圾收集器可管理内容的限制。尝试使用不会创建任何对象的东西再次运行测试(例如,使用while循环而不是range/map/fold)。如果您的实际应用程序会严重影响GC,那么您也可以使用并行GC选项。

关于multithreading - 为什么我的斯卡拉 future 没有效率更高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3627367/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com