mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	 5ada23ac12
			
		
	
	
		5ada23ac12
		
	
	
	
	
		
			
			The checkmatch instruction with VM_CHECKMATCH_TYPE_CASE calls
=== without a call cache. Emit a send instruction to make the call
instead. It includes a call cache.
The call cache improves throughput of using when statements to check the
class of a given object. This is useful for say, JSON serialization.
Use of a regular send instead of checkmatch also avoids taking the VM
lock every time, which is good for multi-ractor workloads.
    Calculating -------------------------------------
                             master        post
         vm_case_classes    11.013M     16.172M i/s -      6.000M times in 0.544795s 0.371009s
             vm_case_lit      2.296       2.263 i/s -       1.000 times in 0.435606s 0.441826s
                 vm_case    74.098M     64.338M i/s -      6.000M times in 0.080974s 0.093257s
    Comparison:
                      vm_case_classes
                    post:  16172114.4 i/s
                  master:  11013316.9 i/s - 1.47x  slower
                          vm_case_lit
                  master:         2.3 i/s
                    post:         2.3 i/s - 1.01x  slower
                              vm_case
                  master:  74097858.6 i/s
                    post:  64338333.9 i/s - 1.15x  slower
The vm_case benchmark is a bit slower post patch, possibily due to the
larger instruction sequence. The benchmark dispatches using
opt_case_dispatch so was not running checkmatch and does not make the
=== call post patch.
		
	
			
		
			
				
	
	
		
			9 lines
		
	
	
	
		
			127 B
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			9 lines
		
	
	
	
		
			127 B
		
	
	
	
		
			YAML
		
	
	
	
	
	
| benchmark:
 | |
|   vm_case_classes: |
 | |
|     case :foo
 | |
|     when Hash
 | |
|       raise
 | |
|     when Array
 | |
|       raise
 | |
|     end
 | |
| loop_count: 6000000
 |