C
Carlos Ortega
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 = 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
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 = 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