Multithreading 在Haskell中创建100万个线程需要多长时间?
据我所知,Haskell有绿色线程。但它们的重量有多轻。可以创建100万个线程吗 或者10万个线程需要多长时间?根据默认的堆栈大小是1k,因此我认为理论上可以创建1000000个线程-堆栈将占用大约1Gb的内存。从Multithreading 在Haskell中创建100万个线程需要多长时间?,multithreading,haskell,concurrency,green-threads,Multithreading,Haskell,Concurrency,Green Threads,据我所知,Haskell有绿色线程。但它们的重量有多轻。可以创建100万个线程吗 或者10万个线程需要多长时间?根据默认的堆栈大小是1k,因此我认为理论上可以创建1000000个线程-堆栈将占用大约1Gb的内存。从 导入控制。并发 进口管制 n=100000 main=do 左使用此处的基准 通过将线程堆栈大小缩小到适合基准测试的大小,可以在每个基准测试的基础上提高性能。例如,1M线程,每个线程有512字节堆栈,需要2.7秒 $ time ./A +RTS -s -k0.5k 对于这个合成测试
导入控制。并发
进口管制
n=100000
main=do
左使用此处的基准
通过将线程堆栈大小缩小到适合基准测试的大小,可以在每个基准测试的基础上提高性能。例如,1M线程,每个线程有512字节堆栈,需要2.7秒
$ time ./A +RTS -s -k0.5k
对于这个合成测试用例,生成硬件线程会导致大量开销。仅使用绿色线程看起来是首选选项。请注意,在Haskell中生成绿色线程确实很便宜。我在MacBook Pro上重新运行了上述程序,n=1m,i7,8GB内存,使用:
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
使用-threaded和-rtsopts编译:
$ time ./thr
1000000
real 0m5.974s
user 0m3.748s
sys 0m2.406s
减少堆栈有助于:
$ time ./thr +RTS -k0.5k
1000000
real 0m4.804s
user 0m3.090s
sys 0m1.923s
然后,无线程编译:
$ time ./thr
1000000
real 0m2.861s
user 0m2.283s
sys 0m0.572s
最后,无线程和减少堆栈:
$ time ./thr +RTS -k0.5k
1000000
real 0m2.606s
user 0m2.198s
sys 0m0.404s
这完全取决于你的硬件。你为什么不试穿一下,告诉我们结果呢?我的问题是我不认识哈斯克尔。我希望得到Haskell密码。现在不是每个人都在使用2.5Ghz的笔记本电脑吗?好吧,1K听起来很大。原线程中的堆栈大小是128字节。真的吗?我认为1K很小,C++中默认的堆栈大小是1MB。如果需要的话,你总是可以改变默认的堆栈大小。谢谢!在64位Linux上生成1000000个线程非常快!真正的0m4.176s用户0m2.833s系统0m1.284s
$ time ./thr +RTS -k0.5k
1000000
real 0m2.606s
user 0m2.198s
sys 0m0.404s