ちなみに

火曜日の空は僕を押しつぶした。

非同期ブームに乗って非同期mapを考えてみた

require 'benchmark'

module Enumerable
  def amap
    map {|e| Thread.new { yield e } }.map(&:value)
  end
end

ary = [1, 2, 3, 4, 5]


res = {}

Benchmark.bm(4) do |x|
  x.report('map')  { res[:map]  = ary.map  {|e| sleep 1; e } }
  x.report('amap') { res[:amap] = ary.amap {|e| sleep 1; e } }
end

p [:map, res[:map]]
p [:amap, res[:amap]]

結果はこんな感じ

          user     system      total        real
map   0.000000   0.000000   0.000000 (  5.000851)
amap  0.000000   0.010000   0.010000 (  1.001148)
[:map, [1, 2, 3, 4, 5]]
[:amap, [1, 2, 3, 4, 5]]

名前がださいのが欠点ですね!(Rubyでは名前重要)

# ある程度時間のかかるような処理でないとThreadを作るコストの方が高くつくので、遅いです。#=> Oh, very useless!

(追記)

1年以上前にdisられていた件

Ruby 1.8までのスレッドはスタックを毎回まるごとコピーしているのでコンテキストスイッチのコストがめちゃめちゃ高い。「動く」とか「使える」とかは言えるけど、間違っても「性能が良くなる」なんてことは言えない。