mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	I noticed that in case of cache misshit, re-calculated cc->me can
be the same method entry than the pevious one.  That is an okay
situation but can't we partially reuse the cache, because cc->call
should still be valid then?
One thing that has to be special-cased is when the method entry
gets amended by some refinements.  That happens behind-the-scene
of call cache mechanism.  We have to check if cc->me->def points to
the previously saved one.
Calculating -------------------------------------
                          trunk        ours
vm2_poly_same_method     1.534M      2.025M i/s -      6.000M times in 3.910203s 2.962752s
Comparison:
             vm2_poly_same_method
                ours:   2025143.9 i/s
               trunk:   1534447.2 i/s - 1.32x  slower
		
	
			
		
			
				
	
	
		
			25 lines
		
	
	
	
		
			457 B
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			25 lines
		
	
	
	
		
			457 B
		
	
	
	
		
			YAML
		
	
	
	
	
	
prelude: |
 | 
						|
  module AR; end
 | 
						|
  class AR::Base
 | 
						|
    def create_or_update
 | 
						|
      nil
 | 
						|
    end
 | 
						|
    def save
 | 
						|
      create_or_update
 | 
						|
    end
 | 
						|
  end
 | 
						|
  class Foo < AR::Base; end
 | 
						|
  class Bar < AR::Base; end
 | 
						|
  o1 = Foo.new
 | 
						|
  o2 = Bar.new
 | 
						|
benchmark:
 | 
						|
  vm2_poly_same_method: |
 | 
						|
    o1.save; o2.save;
 | 
						|
    o1.save; o2.save;
 | 
						|
    o1.save; o2.save;
 | 
						|
    o1.save; o2.save;
 | 
						|
    o1.save; o2.save;
 | 
						|
    o1.save; o2.save;
 | 
						|
    o1.save; o2.save;
 | 
						|
    o1.save; o2.save;
 | 
						|
loop_count: 6000000
 |