[#42344] [ruby-trunk - Feature #5964][Open] Make Symbols an Alternate Syntax for Strings — Tom Wardrop <tom@...>

23 messages 2012/02/03

[#42443] [ruby-trunk - Bug #5985][Open] miniruby skews "make benchmark" results — Eric Wong <normalperson@...>

21 messages 2012/02/08

[#42444] [ruby-trunk - Bug #5986][Open] Segmentation Fault — Luis Matta <levmatta@...>

16 messages 2012/02/08

[#42471] [ruby-trunk - Feature #5995][Open] calling io_advise_internal() in read_all() — Masaki Matsushita <glass.saga@...>

20 messages 2012/02/10

[#42560] [ruby-trunk - Bug #6011][Open] ruby-1.9.3-p0/lib/webrick/utils.rb:184: [BUG] Segmentation fault — Vit Ondruch <v.ondruch@...>

12 messages 2012/02/13

[#42579] [ruby-trunk - Bug #6012][Open] Proc#source_location also return the column — Roger Pack <rogerpack2005@...>

14 messages 2012/02/14

[#42685] [ruby-trunk - Bug #6036][Open] Test failures in Fedora Rawhide/17 — Bohuslav Kabrda <bkabrda@...>

14 messages 2012/02/16

[#42697] [ruby-trunk - Bug #6040][Open] Transcoding test failure: Big5 to UTF8 not defined (MinGW) — Luis Lavena <luislavena@...>

10 messages 2012/02/16

[#42813] [ruby-trunk - Feature #6065][Open] Allow Bignum marshalling/unmarshalling from C API — Martin Bosslet <Martin.Bosslet@...>

22 messages 2012/02/23

[#42815] [ruby-trunk - Bug #6066][Open] Fix "control may reach end of non-void function" warnings for clang — Eric Hodel <drbrain@...7.net>

15 messages 2012/02/23

[#42857] [ruby-trunk - Feature #6074][Open] Allow alias arguments to have a comma — Thomas Sawyer <transfire@...>

20 messages 2012/02/24

[#42891] [ruby-trunk - Feature #6083][Open] Hide a Bignum definition — Koichi Sasada <redmine@...>

23 messages 2012/02/25

[#42906] [ruby-trunk - Bug #6085][Open] Treatment of Wrong Number of Arguments — Marc-Andre Lafortune <ruby-core@...>

14 messages 2012/02/25

[#42949] [ruby-trunk - Bug #6089][Open] Test suite fails with OpenSSL 1.0.1 — Vit Ondruch <v.ondruch@...>

13 messages 2012/02/26

[ruby-core:42999] Re: 50$ for answering my stackoverflow question about Ruby and GIL

From: Grigory Petrov <grigory.v.p@...>
Date: 2012-02-28 10:43:11 UTC
List: ruby-core #42999
> This test code doesn't show switch time, it shows how fast two ruby threads can append items to a list. ach thread may switch multiple times during appending the item, or may not switch at all, but resume executing the same thread.

Ok, i spelled it incorrectly. The test code shows amount of time a
Ruby thread is working before scheduler suspends it (due to GIL) and
gives time to another Ruby thread. This may or may not correlate with
physical threads - i'm not very good with Ruby scheduling code on
different OS'es.

For example, if resulting list looks like [ 1, 2, 1, 2, 1, 2, 1, 2, 1,
2, 1, 2 ] i can say that scheduler gives threads a small splice. And
if resulting list looks like [ 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2 ] =
splice is big. As numbers shows, splice is VERY big on Windows and OS
:(. Tk lags on OSX and priority trick illustrates this. But on Windows
priority trick don't work and GUI lag is MUCH bigger.

I need to know why :).

On Tue, Feb 28, 2012 at 4:36 AM, Eric Hodel <drbrain@segment7.net> wrote:
> On Feb 27, 2012, at 12:10 PM, Grigory Petrov wrote:
>> I'm not so sure about that.
>
> Since TIME_QUANTUM_USEC is divided by 1000 for the call to WaitForSingleObject(), it's in microseconds, but this is only the maximum amount of time a thread may run for before being interrupted.
>
>> I assembled the following test code. It's very straightforward and
>> simple and will calculate an average splice time ( time scheduler will
>> assign to a thread that is not giving it up via Thread.pass):
>>
>> require 'thread'
>> require 'time'
>> time = 10
>> items = []
>> threads = []
>> threads << Thread.new { loop { items << 1 } }
>> threads << Thread.new { loop { items << 2 } }
>> sleep time
>> threads.each( &:exit ).each( &:join )
>> changes = 0
>> for i in 1 ... items.count do
>> hanges += 1 if items[ i ] != items[ i - 1 ]
>> end
>> printf( "Switch time is %.3f seconds\n", time.to_f / (changes + 1) )
>
> This test code doesn't show switch time, it shows how fast two ruby threads can append items to a list. ach thread may switch multiple times during appending the item, or may not switch at all, but resume executing the same thread.
>
> The constants changed in USA's patch decrease the maximum possible runtime of a thread before the GVL is given to another thread. 澣his helps prevent a CPU bound threads from starving another process (which you are doing). 漓s USA also pointed out, running two CPU-heavy threads is not very good to the GVL, same as in Python.
>
>> The results are astonishing:
>> Ubuntu: 0.010 second, ok
>> OSX 10.7: 0.200 second, wtf?
>> Windows XP: 0.350 second!!! WTF.
>>
>> Switching threads 3-4 times per second on most popular OS'es is VERY
>> weird. Python slice is constant, around 10ms. And default thread
>> scheduling on all OS'es is around 10ms too.
>
> I ran this under Instruments on OS X, and got this report from the Scheduling instrument (counts thread context switches and intervals at the POSIX level):
>
> thread_start_func_1 150284 intervals in 10.72 seconds, average CPU usage of 38.89 オs
> thread_start_func_2 170662 intervals in 10.72 seconds, average CPU usage of 30.37 オs
>
> Running this yourself, you can look at the chart to see that sometimes ruby keeps running one thread for many milliseconds, but sometimes it rapidly switches between the two threads.

In This Thread