gpt4 book ai didi

ruby - 在这种情况下,为什么并发循环比普通循环慢?

转载 作者:数据小太阳 更新时间:2023-10-29 08:49:48 24 4
gpt4 key购买 nike

我正在学习 Ruby 中的线程,从 The Ruby Programming Language 一书中找到了这个方法,它被描述为每个迭代器的并发版本,

module Enumerable
def concurrently
map {|item| Thread.new { yield item }}.each {|t| t.join }
end
end

下面的代码

 start=Time.now
arr.concurrently{ |n| puts n} # Ran using threads
puts "Time Taken #{Time.now-start}"

输出:所用时间 6.6278332

同时

start=Time.now
arr.each{ |n| puts n} # Normal each loop
puts "Time Taken #{Time.now-start}"

输出:所用时间 0.132975928

为什么没有线程会更快?是实现错误还是第二个只有 puts 语句,而第一个需要时间进行资源分配/初始化/终止线程?

最佳答案

MRI(“黄金标准” ruby )中的线程并不是真正的并发。有一个全局 VM 锁 (GVL) 可以防止线程并发运行。但是,当当前线程在 I/O 上被阻塞时,它允许其他线程运行,但这不是你的情况。

因此,您的代码串行运行,并且您有线程开销(创建/销毁线程等)。这就是它变慢的原因。

关于ruby - 在这种情况下,为什么并发循环比普通循环慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15950608/

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