Rob,


Rob Biedenharn wrote:
> On Jun 24, 2008, at 12:23 PM, Philip Rhoades wrote:
>> People,
>>
>> I have asked before about Ruby to C conversion programs and other 
>> alternatives with no really satisfactory solution for my particular 
>> situation.
> 
> Are you looking at all solutions?
> 
>> I decided to test out a conversion of one of the C programs and see 
>> what sort of results I get.  This particular small C program is called 
>> 32,000 times from loops within a shell script.  The program then 
>> processes a text file, writes a text file and exits.  The same shell 
>> script with a Ruby program replacing the C program does exactly the 
>> same thing but takes 8.5 times as long (27m/227m).
> 
> Can you replace the whole shell script with a ruby program?  Then 
> whatever startup cost you have for the Ruby interpreter is paid once 
> rather than 32_000 times.
> 
>> The profile on ONE execution of the Ruby program produced:
>>
>>  %   cumulative   self              self     total
>> time   seconds   seconds    calls  ms/call  ms/call  name
>> 65.18    14.15     14.15        1 14150.00 21700.00  Array#each
>> 12.44    16.85      2.70    93792     0.03     0.03  Array#[]
>>  8.15    18.62      1.77    62108     0.03     0.03  String#split
>>  6.73    20.08      1.46    53215     0.03     0.03  String#==
>>  2.58    20.64      0.56       66     8.48    12.73  Range#each
>>
>> It would be SO much nicer to rewrite some stuff that needs rewriting 
>> and write ALL new stuff in Ruby but this looks impossible with these 
>> times . .
>>
>> Any suggestions for performance improvements?
>>
>> I am using F9.
> 
> F9?  Is that some key in an IDE that runs your ruby code?
> 
>> Thanks,
>>
>> Phil.
>> -- 
>> Philip Rhoades
>>
>> Pricom Pty Limited  (ACN 003 252 275  ABN 91 003 252 275)
>> GPO Box 3411
>> Sydney NSW    2001
>> Australia
>> E-mail:  phil / pricom.com.au
> 
> Depending on what your C program has to do and why a shell script is 
> calling it in the first place, you might have other benefits from using 
> Ruby in place of the shell script.  A couple years back, I worked on a 
> similar kind of project that was replacing shell scripts with Perl and 
> there were many benefits that Perl could exploit that just could not be 
> managed by constructs in the shell.


I tried:

- Using v1.9:  This was actually a little bit worse than the already 8.4 
times slower v1.8

- Replacing the shell scripts as well and having one consolidated Ruby 
script:  This improved the slowness from a factor of 8.4 to 7.4

- Replacing the array in the Ruby script (I was reading a large file 
into an array for processing):  This improved the slowness from a factor 
of 7.4 to 4.0

It would be nice if I could improve the Ruby script still further but 
the profile now looks like:

%	cumulative	self	self	total			
time	seconds	seconds	calls	ms/call	ms/call		name
59.94	8.44	8.44	1	8440	14080		Object#statz
10.44	9.91	1.47	58318	0.03	0.03		Array#[]
8.1	11.05	1.14	26630	0.04	0.04		String#split
4.05	11.62	0.57	70	8.14	616.14		Range#each
4.05	12.19	0.57	17737	0.03	0.03		String#==
3.05	12.62	0.43	8872	0.05	0.05		IO#gets
2.98	13.04	0.42	8866	0.05	0.05		Fixnum#-
2.34	13.37	0.33	9737	0.03	0.03		Fixnum#+
2.06	13.66	0.29	8916	0.03	0.03		String#to_i
1.92	13.93	0.27	9955	0.03	0.03		Array#[]=

The change to a single Ruby script simplified the previous setup quite 
markedly but I'm not sure that much more can be done with the relatively 
small script now.  I logged into "ruby Talk" on 
http://codeforpeople.com/ but I couldn't see anywhere to post the code. 
  I can mail the files to anyone who is interested in having a look.

Thanks,

Phil.
-- 
Philip Rhoades

Pricom Pty Limited  (ACN 003 252 275  ABN 91 003 252 275)
GPO Box 3411
Sydney NSW	2001
Australia
E-mail:  phil / pricom.com.au