gpt4 book ai didi

Ruby 多线程每个线程都很慢

转载 作者:行者123 更新时间:2023-12-02 04:31:27 25 4
gpt4 key购买 nike

我曾尝试使用多线程来处理大量数据,但它根本没有提高性能。我尝试探索这个问题,结果发现每个线程所花费的时间与在没有线程的情况下运行任务所花费的时间大致相同。

以下是我在 irb 上运行的简化版本。

arr = (0...1000000000).to_a and 1  # just to prevent irb from printing arr
>> 1

lambda { from = Time.now; arr.each{}; Time.now - from }.call
>> 58.062952

arr.each_slice((arr.size / 8.0).round).to_a.map{|arrr| Thread.new{ lambda { from = Time.now; arrr.each{}; Time.now - from }.call }}.map(&:join).map(&:value)
>> [56.541044, 46.74521, 47.887555, 49.059258, 55.008338, 55.687892, 55.997382, 55.404157]

如您所见,每个线程所花费的时间与没有线程的任务所花费的时间惊人地相似。

请注意,这些时间是针对每个线程内的任务本身测量的,因此它与通信开销无关。

我测试了其他大小的数组,结果相似 - 与没有线程的任务没有显着差异。

我很疑惑。我很想知道为什么会这样。

最佳答案

您可以使用 parallel gem 来加速您的示例

  1. 通过在终端中运行 gem install parallel 安装 gem
  2. 运行irb:

    irb(main):006:0> require 'parallel'
    => true
    irb(main):001:0> arr = (0...100000000).to_a and 1
    => 1
    irb(main):002:0> lambda { from = Time.now; arr.each{}; Time.now - from }.call
    => 7.424087

    irb(main):009:0> arr.each_slice((arr.size / 8.0).round).to_a.map{|arrr| Thread.new{ lambda { from = Time.now; arrr.each{}; Time.now - from }.call }}.map(&:join).map(&:value)
    => [4.425176, 3.593438, 4.000537, 4.039098, 3.817529, 3.743535, 3.683716, 3.6868]

    irb(main):008:0> Parallel.map(arr.each_slice((arr.size / 8.0).round).to_a, in_threads: 4) { |arrr| from = Time.now; arrr.each{}; Time.now - from }
    => [2.364945, 2.365872, 2.358072, 2.469698, 2.396479, 2.283937, 2.154116, 1.910335]

    irb(main):008:0> Parallel.map(arr.each_slice((arr.size / 8.0).round).to_a, in_processes: 4) { |arrr| from = Time.now; arrr.each{}; Time.now - from }
    => [1.45764, 1.478868, 1.475091, 1.470171, 1.707919, 1.728389, 1.735843, 1.72616]

关于Ruby 多线程每个线程都很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48407429/

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