From: Adam Kramer Date: 2007-09-04T13:53:44+09:00 Subject: Ruby is much slower on linux when compiled with --enable-pthread? 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