Hi,
I was seeing significant performance differences between ruby 1.8.4 on
an old distribution and a newer one. I spent some hours tracking down
the differences and it appears that --enable-pthread causes ruby to be
significantly slower. I tried searching for the reason why this is but
came up empty handed.
On Ubuntu 6.06 I built a new binary of 1.8.4 (from the package source
- nothing else was different) with --disable-pthread and compared the
execution times of the benchmark files in SVN. Here are the results:
Second column is with --enable-pthread, third column
--disable-pthread. Look at almost every test that took more than a
second, of real note is app_pentomino and loop_times.
app_answer 0.674 0.504
app_factorial 0.020 0.013
app_fib 9.377 6.623
app_mandelbrot 2.384 1.862
app_pentomino 158.618 84.739
app_raise 1.176 0.964
app_strconcat 1.197 1.215
app_tak 12.390 8.158
app_tarai 9.872 6.473
loop_generator 22.547 15.394
loop_times 11.616 4.050
loop_whileloop 9.334 9.491
loop_whileloop2 1.878 1.906
so_ackermann 5.038 9.291
so_array 10.608 6.376
so_concatenate 3.633 1.620
so_count_words 0.272 0.267
so_exception 3.012 2.221
so_lists 1.302 1.023
so_matrix 2.753 1.906
so_nested_loop 9.877 5.060
so_object 5.705 3.780
so_random 1.967 1.752
so_sieve 0.627 0.591
vm1_block 35.529 19.547
vm1_const 14.287 14.482
vm1_ensure 28.497 15.053
vm1_length 18.162 18.991
vm1_rescue 18.771 11.221
vm1_simplereturn 31.387 16.038
vm1_swap 16.581 16.850
vm2_array 4.078 4.129
vm2_case 4.041 4.076
vm2_method 21.762 9.765
vm2_mutex 31.299 17.910
vm2_poly_method 25.094 13.121
vm2_poly_method_ov 4.192 4.125
vm2_proc 8.404 5.506
vm2_regexp 3.919 3.743
vm2_send 5.280 3.780
vm2_super 7.573 4.337
vm2_unif1 4.833 3.183
vm2_zsuper 8.120 4.848
vm3_thread_create_join 0.012 0.008
vm3_thread_mutex 5.787 3.278
It appears that when compiled with --enable-pthread ruby will call
sigprocmask MANY MANY more times than without. You can verify this
with strace -c:
$ strace -c ruby -e '1.upto(100000) {|i| i.to_s}'
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.000655 0 200006 sigprocmask
Yeah - it called sigprocmask over 200,000 times during that 100,000
iteration loop.
When compiled with --disable-pthread and running the same command,
rt_sigprocmask gets called 4 times.
I also tested on OS X, ruby is compiled with --enable-pthread but
sigprocmask doesn't get called an inordinate number of times, so this
may be a linux-only issue.
Has anyone else witnessed this? Is this a "feature" that's to be expected?
--
Thanks!
-Adam