First of all I am Ruby newby and I am trying to learn the language. The best way I know to learn something is to actually solve problems with it. So I took a simple string problem and implemented solution1 like this:
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
It then occurred to me that this is perfect match for a "parallel foreach" kind of think. So I came up with solution2
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
To my surprise solution2 took about 8 times more time to run than solution1 on the exact same input. Why ?
Thanks,