mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 d74fa8e55c
			
		
	
	
		d74fa8e55c
		
	
	
	
	
		
			
			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
 |