From: "funny_falcon (Yura Sokolov)" Date: 2012-06-26T16:18:45+09:00 Subject: [ruby-core:45880] [ruby-trunk - Feature #3620] Add Queue, SIzedQueue and ConditionVariable implementations in C in addition to ruby ones Issue #3620 has been updated by funny_falcon (Yura Sokolov). File final_queue_without_mutex.diff added It seems that there is no need for mutex in a native queue implementation (considering we have GVL), and so that queue_synchronized wrapper: rb_mutex_sleep could be replaces with rb_thread_sleep_forever without semantic change. Without mutex, native queue becomes 2 times faster. Modified patch is attached. ---------------------------------------- Feature #3620: Add Queue, SIzedQueue and ConditionVariable implementations in C in addition to ruby ones https://bugs.ruby-lang.org/issues/3620#change-27471 Author: panaggio (Ricardo Panaggio) Status: Assigned Priority: Normal Assignee: ko1 (Koichi Sasada) Category: ext Target version: =begin Queue, SizedQueue and ConditionVariable are important synchronization primitives and are nowadays implemented in Ruby. Attached patch (initiated by myself and heavily enriched by Nobu) contains these sync primitives implemented in C, which makes them faster (see [1] for the benchmark's code): Rehearsal ------------------------------------------------- Q#push 1.590000 0.010000 1.600000 ( 1.605502) T#push 0.600000 0.010000 0.610000 ( 0.630444) Q#pop 4.390000 0.000000 4.390000 ( 4.389781) T#pop 0.580000 0.000000 0.580000 ( 0.578918) Q#empty? 0.480000 0.000000 0.480000 ( 0.484305) T#empty? 0.360000 0.000000 0.360000 ( 0.358559) Q#clear 1.210000 0.000000 1.210000 ( 1.214494) T#clear 0.600000 0.000000 0.600000 ( 0.588611) Q#size 0.370000 0.000000 0.370000 ( 0.365587) T#size 0.350000 0.000000 0.350000 ( 0.356985) Q#num_waiting 0.380000 0.000000 0.380000 ( 0.379199) T#num_waiting 0.370000 0.000000 0.370000 ( 0.368075) --------------------------------------- total: 11.300000sec It has already been discussed on ruby-core (see ruby-core:31100). This patch is one of the deliverables of my RubySoC project (slot #17): "Improving Ruby's Synchronization Primitives and Core Libraries" [2,3] [1] http://github.com/panaggio/rubysoc-2010/blob/master/benchmarks/queue.rb [2] http://pastebin.com/viSnfqe6 [3] http://rubysoc.org/projects =end -- http://bugs.ruby-lang.org/