Ruby 1.9.3 多线程实现比单威胁实现花费更长的时间,为什么?

标签 ruby multithreading

首先,我是 Ruby newby,我正在努力学习这门语言。我知道学习某样东西的最好方法就是用它实际解决问题。所以我解决了一个简单的字符串问题并实现了solution1,如下所示:

def similarities(str)
  result = str.length

  (1..str.length - 1).each { |start|
    str2 = str[start..-1]

    index = 0
    str2.split(//).each do |c|
      break if c != str[index, 1]
      index += 1
    end

    result += index
  }

  result
end

然后我想到,这与“并行 foreach”的想法完美匹配。所以我想出了解决方案2

def similarities(str)
  result = str.length

  threads = []
  (1..str.length - 1).each { |start|
    str2 = str[start..-1]
    threads << Thread.new { calculate(str, str2) }
  }

  threads.each { |t| t.join; result += t["index"] }

  result
end

def calculate(str, str2)
  index = 0
  str2.split(//).each do |c|
    break if c != str[index, 1]
    index += 1
  end

  Thread.current["index"] = index
end

令我惊讶的是,对于完全相同的输入,solution2 的运行时间比 solution1 多出 8 倍。为什么?

谢谢

最佳答案

上下文切换的成本很高,比您正在实现的实际的、相当微不足道的计算要昂贵得多。如果您要对此进行分析,您 90% 的时间可能会被与线程相关的系统调用占用。

编辑:此外,如果您使用 CRuby/MRI,您将因缺乏真正的多线程而受到限制。请参阅Does ruby have real multithreading?了解详情。

关于Ruby 1.9.3 多线程实现比单威胁实现花费更长的时间,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512818/

相关文章:

ruby-on-rails - 菠菜与 cucumber 在 Rails 中的 BDD

ruby - 一种在 ruby​​ 中动态添加字段到结构的方法

java - 在java中的给定时间之间执行受控数量的线程

android - 从线程更新 textView

c++ - 了解 QThread 的事件循环何时从另一个线程开始

ruby - Savon - SOAP - ruby - 400 错误请求

ruby - 如何仅使用thin部署sinatra应用程序?

java - 将多个 ByteArrayOutputStream 合并为一个 FileOutputStream

c# - 如何在不循环的情况下等待 bool 值(使用任何类型的等待/信号量/事件/互斥量等)

ruby-on-rails - 将 Gem 'wdm' 添加到您的 GemFile