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