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