Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在Haskell中创建100万个线程需要多长时间?_Multithreading_Haskell_Concurrency_Green Threads - Fatal编程技术网

Multithreading 在Haskell中创建100万个线程需要多长时间?

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 对于这个合成测试

据我所知,Haskell有绿色线程。但它们的重量有多轻。可以创建100万个线程吗

或者10万个线程需要多长时间?

根据默认的堆栈大小是1k,因此我认为理论上可以创建1000000个线程-堆栈将占用大约1Gb的内存。

导入控制。并发
进口管制
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