syncmap: add benchmark for Range
adjust BenchmarkAdversarialDelete to be somewhat more adversarial. updates golang/go#18177 Change-Id: Id01ed1077a0447dcfc6ea3929c22baaddbc9d6ee Reviewed-on: https://go-review.googlesource.com/37151 Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
		
					parent
					
						
							
								54b13b0b03
							
						
					
				
			
			
				commit
				
					
						37569ff763
					
				
			
		
					 1 changed files with 23 additions and 4 deletions
				
			
		|  | @ -145,8 +145,27 @@ func BenchmarkLoadOrStoreCollision(b *testing.B) { | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func BenchmarkRange(b *testing.B) { | ||||||
|  | 	const mapSize = 1 << 10 | ||||||
|  | 
 | ||||||
|  | 	benchMap(b, bench{ | ||||||
|  | 		setup: func(_ *testing.B, m mapInterface) { | ||||||
|  | 			for i := 0; i < mapSize; i++ { | ||||||
|  | 				m.Store(i, i) | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 
 | ||||||
|  | 		perG: func(b *testing.B, pb *testing.PB, i int, m mapInterface) { | ||||||
|  | 			for ; pb.Next(); i++ { | ||||||
|  | 				m.Range(func(_, _ interface{}) bool { return true }) | ||||||
|  | 			} | ||||||
|  | 		}, | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // BenchmarkAdversarialAlloc tests performance when we store a new value | // BenchmarkAdversarialAlloc tests performance when we store a new value | ||||||
| // immediately whenever the map is promoted to clean. | // immediately whenever the map is promoted to clean and otherwise load a | ||||||
|  | // unique, missing key. | ||||||
| // | // | ||||||
| // This forces the Load calls to always acquire the map's mutex. | // This forces the Load calls to always acquire the map's mutex. | ||||||
| func BenchmarkAdversarialAlloc(b *testing.B) { | func BenchmarkAdversarialAlloc(b *testing.B) { | ||||||
|  | @ -165,8 +184,8 @@ func BenchmarkAdversarialAlloc(b *testing.B) { | ||||||
| 	}) | 	}) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // BenchmarkAdversarialDelete tests performance when we delete and restore a | // BenchmarkAdversarialDelete tests performance when we periodically delete | ||||||
| // value immediately after a large map has been promoted. | // one key and add a different one in a large map. | ||||||
| // | // | ||||||
| // This forces the Load calls to always acquire the map's mutex and periodically | // This forces the Load calls to always acquire the map's mutex and periodically | ||||||
| // makes a full copy of the map despite changing only one entry. | // makes a full copy of the map despite changing only one entry. | ||||||
|  | @ -191,7 +210,7 @@ func BenchmarkAdversarialDelete(b *testing.B) { | ||||||
| 						return false | 						return false | ||||||
| 					}) | 					}) | ||||||
| 					m.Delete(key) | 					m.Delete(key) | ||||||
| 					m.Store(key, key) | 					m.Store(i, i) | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		}, | 		}, | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue