Changeset 604

Show
Ignore:
Timestamp:
12/05/07 07:48:36 (1 year ago)
Author:
blackhedd
Message:

replaced the timer implementation in pure Ruby with a much faster one.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • version_0/lib/pr_eventmachine.rb

    r603 r604  
    3333require 'socket' 
    3434require 'fcntl' 
     35require 'set' 
    3536 
    3637 
     
    158159    end 
    159160 
     161    # #set_max_timer_count is a harmless no-op in pure Ruby, which doesn't have a built-in limit 
     162    # on the number of available timers. 
     163    def set_max_timer_count n 
     164    end 
     165 
    160166  end 
    161167 
     
    218224  end 
    219225 
     226  #-- 
     227  # Replaced original implementation 05Dec07, was way too slow because of the sort. 
    220228  def install_oneshot_timer interval 
    221229    uuid = UuidGenerator::generate 
    222     @timers << [Time.now + interval, uuid] 
    223     @timers.sort! {|a,b| a.first <=> b.first} 
     230    #@timers << [Time.now + interval, uuid] 
     231    #@timers.sort! {|a,b| a.first <=> b.first} 
     232    @timers.add([Time.now + interval, uuid]) 
    224233    uuid 
    225234  end 
     
    231240    @stop_scheduled = false 
    232241    @selectables ||= {}; @selectables.clear 
    233     @timers = [] 
    234     set_timer_quantum(0.5
     242    @timers = SortedSet.new # [] 
     243    set_timer_quantum(0.1
    235244  end 
    236245 
     
    264273  def run_timers 
    265274    now = Time.now 
    266     while @timers.length > 0 and @timers.first.first <= now 
    267       t = @timers.shift 
    268       EventMachine::event_callback "", TimerFired, t.last 
    269     end 
     275    @timers.each {|t| 
     276      if t.first <= now 
     277        @timers.delete t 
     278        EventMachine::event_callback "", TimerFired, t.last 
     279      else 
     280        break 
     281      end 
     282    } 
     283    #while @timers.length > 0 and @timers.first.first <= now 
     284    #  t = @timers.shift 
     285    #  EventMachine::event_callback "", TimerFired, t.last 
     286    #end 
    270287  end 
    271288 
  • version_0/tests/test_timers.rb

    r580 r604  
    107107 
    108108 
     109        # This test is only applicable to compiled versions of the reactor. 
     110        # Pure ruby versions have no built-in limit on the number of outstanding timers. 
     111        # 
    109112        def test_timer_change_max_outstanding 
    110113                ten_thousand_timers = proc { 
     
    114117                } 
    115118                EM.run { 
    116                         assert_raise( RuntimeError ) { 
     119                        if EM.library_type == :pure_ruby 
    117120                                ten_thousand_timers.call 
    118                         } 
     121                        else 
     122                                assert_raise( RuntimeError ) { 
     123                                        ten_thousand_timers.call 
     124                                } 
     125                        end 
    119126                        EM.stop 
    120127                }