From: Erik Veenstra Date: 2008-10-07T05:58:01+09:00 Subject: Re: Concurent (using threads) slower than sequential -doubt If you are on Linux, you might want to have a look at the gem "forkandreturn" [1]. ForkAndReturn handles each element in an enumeration in a seperate process [2]. gegroet, Erik V. - http://www.erikveen.dds.nl/ [1] http://www.erikveen.dds.nl/forkandreturn/doc/index.html [2] ...if you're on a multicore machine. Oops. Will be fixed in the next release. ---------------------------------------------------------------- $ cat count1.rb files = ["numbers0.txt", "numbers1.txt", "numbers2.txt"] result = 0 files.collect do |file| res = 0 File.open(file) do |file| file.each do |line| res += line.to_i end end res end.each do |res| result += res end p result ---------------------------------------------------------------- $ diff -ur count[12].rb | clean_diff +require "forkandreturn" + files = ["numbers0.txt", "numbers1.txt", "numbers2.txt"] result = 0 -files.collect do |file| +files.concurrent_collect do |file| res = 0 File.open(file) do |file| ---------------------------------------------------------------- $ time ruby count1.rb 81627450482688 real 0m15.309s user 0m15.201s sys 0m0.076s ---------------------------------------------------------------- $ time ruby count2.rb 81627450482688 real 0m8.976s <=== Multicore! user 0m17.177s <=== Multicore! sys 0m0.204s ---------------------------------------------------------------- $ uname -a Linux laptop 2.6.24-19-generic #1 SMP Wed Aug 20 22:56:21 UTC 2008 i686 GNU/Linux ---------------------------------------------------------------- $ ruby --version ruby 1.8.6 (2008-06-20 patchlevel 230) [i686-linux] ---------------------------------------------------------------- $ gem list | grep -ie forkandreturn forkandreturn (0.2.0) ----------------------------------------------------------------