2011-12-14 10 views
2

まず私はRuby newbyです。私は言語を学ぼうとしています。私が何かを学ぶために知っている最善の方法は、実際に問題を解決することです。だから私は、単純な文字列の問題を取り、このようソリューション1を実装:Ruby 1.9.3のマルチスレッド実装は、単一の脅威の実装よりも時間がかかります。なぜですか?

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対処方法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 

を思い付いたが、全く同じ入力でソリューション1よりも実行に約8倍以上の時間がかかりました。どうして ?

おかげで、

答えて

3

コンテキストの切り替えは、はるかにあなたが実装しようとしている実際、かなり些細な計算よりも、高価です。これをプロファイルすると、スレッド関連のシステムコールによって90%の時間が消費される可能性があります。

編集:CRuby/MRIを使用している場合は、真のマルチスレッドの欠如によって制限されます。詳細はDoes ruby have real multithreading?を参照してください。

関連する問題