| 
									
										
										
										
											2016-04-13 22:08:22 +08:00
										 |  |  | // Copyright 2016 The Prometheus Authors
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //     http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-02 23:53:37 +08:00
										 |  |  | package local | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"sync" | 
					
						
							|  |  |  | 	"testing" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-20 23:18:46 +08:00
										 |  |  | 	"github.com/prometheus/common/model" | 
					
						
							| 
									
										
										
										
											2014-10-02 23:53:37 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkFingerprintLockerParallel(b *testing.B) { | 
					
						
							|  |  |  | 	numGoroutines := 10 | 
					
						
							|  |  |  | 	numFingerprints := 10 | 
					
						
							|  |  |  | 	numLockOps := b.N | 
					
						
							| 
									
										
										
										
											2014-10-06 21:58:12 +08:00
										 |  |  | 	locker := newFingerprintLocker(100) | 
					
						
							| 
									
										
										
										
											2014-10-02 23:53:37 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	wg := sync.WaitGroup{} | 
					
						
							|  |  |  | 	b.ResetTimer() | 
					
						
							|  |  |  | 	for i := 0; i < numGoroutines; i++ { | 
					
						
							|  |  |  | 		wg.Add(1) | 
					
						
							|  |  |  | 		go func(i int) { | 
					
						
							|  |  |  | 			for j := 0; j < numLockOps; j++ { | 
					
						
							| 
									
										
										
										
											2015-08-20 23:18:46 +08:00
										 |  |  | 				fp1 := model.Fingerprint(j % numFingerprints) | 
					
						
							|  |  |  | 				fp2 := model.Fingerprint(j%numFingerprints + numFingerprints) | 
					
						
							| 
									
										
										
										
											2014-10-02 23:53:37 +08:00
										 |  |  | 				locker.Lock(fp1) | 
					
						
							|  |  |  | 				locker.Lock(fp2) | 
					
						
							|  |  |  | 				locker.Unlock(fp2) | 
					
						
							|  |  |  | 				locker.Unlock(fp1) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			wg.Done() | 
					
						
							|  |  |  | 		}(i) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	wg.Wait() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func BenchmarkFingerprintLockerSerial(b *testing.B) { | 
					
						
							|  |  |  | 	numFingerprints := 10 | 
					
						
							| 
									
										
										
										
											2014-10-06 21:58:12 +08:00
										 |  |  | 	locker := newFingerprintLocker(100) | 
					
						
							| 
									
										
										
										
											2014-10-02 23:53:37 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	b.ResetTimer() | 
					
						
							|  |  |  | 	for i := 0; i < b.N; i++ { | 
					
						
							| 
									
										
										
										
											2015-08-20 23:18:46 +08:00
										 |  |  | 		fp := model.Fingerprint(i % numFingerprints) | 
					
						
							| 
									
										
										
										
											2014-10-02 23:53:37 +08:00
										 |  |  | 		locker.Lock(fp) | 
					
						
							|  |  |  | 		locker.Unlock(fp) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |