Hi Folks.
While starting to study the benefits of using threads in Ruby, I tried
to solve the following problem:
I have 3 text files ( numbers0.txt, numbers1.txt, c:\numbers2.txt ),
each file contains a very large list of numbers.
I attempt to read and compute each file by using a different thread.
Finally I tried to sum all subtotals to provide the final result.
Here is the code.
require ‘thread’
m_threads = []
print "INITIAL TIME := ", initial_time = Time.now, “\n”
3.times do |i|
m_threads[i] = Thread.new do
total_per_thread = 0
case i
when 0 then path = “C:\numbers0.txt”
when 1 then path = “C:\numbers1.txt”
when 2 then path = “C:\numbers2.txt”
end
File.open( path, “r” ) do |m_file|
while line = m_file.gets
total_per_thread = line.to_i + total_per_thread
end
Thread.current[:INDEX] = total_per_thread
end
end
end
result = 0
m_threads.each{ |t| t.join; result = t[:INDEX] + result; }
print "FINAL TIME := ", final_time = Time.now, “\n”
print "TOTAL TIME := ", total_time = final_time-initial_time, “\n”
print "Total := ", result, “\n”
=======================================
Output (CONCURRENT - Using Threads):
INITIAL TIME := Sun Oct 05 22:07:26 -0500 2008
FINAL TIME := Sun Oct 05 22:07:38 -0500 2008
TOTAL TIME := 11.485
Total := 1150000000
I verified and each thread made the job, result is OK too.
I also solved the same problem by using a sequential program with no
threads at all
Here is the code:
print "INITIAL Time := ", initial_time = Time.now, “\n”
paths = [ “C:\numbers0.txt”, “C:\numbers1.txt”, “C:\numbers2.txt” ]
result = 0
for m_path in paths
File.open( m_path, “r+” ) do |m_file|
while line = m_file.gets
result = line.to_i + result
end
end
end
print "FINAL time := ", final_time = Time.now, “\n”
print "TOTAL time := ", total_time = final_time - initial_time, “\n”
print "Total := ", result, “\n”
=======================================
Output: (SECUENCIAL- NO Threads)
INITIAL TIME := Sun Oct 05 22:34:47 -0500 2008
FINAL TIME := Sun Oct 05 22:34:57 -0500 2008
TOTAL TIME := 10.656
Total := 1150000000
=======================================
As you see, the thread based program run slower.
I thought that by using threads it will be faster, but it didn’t…Why
is it slower?
Any help will be very appreciated