58 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|   | package main | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"bytes" | ||
|  | 	"fmt" | ||
|  | 	"testing" | ||
|  | 	"unicode" | ||
|  | 	"unicode/utf8" | ||
|  | ) | ||
|  | 
 | ||
|  | /* | ||
|  | Let's run this program to see the speed differences. | ||
|  | 
 | ||
|  | benchDecoder  30000000          46.2 ns/op --> BEST | ||
|  | benchForRange 30000000          53.0 ns/op --> MEDIOCRE | ||
|  | benchConcater 20000000          93.7 ns/op --> WORST | ||
|  | */ | ||
|  | 
 | ||
|  | var word = []byte("öykü") | ||
|  | 
 | ||
|  | func decoder(w []byte) { | ||
|  | 	_, size := utf8.DecodeRune(word) | ||
|  | 	copy(w[:size], bytes.ToUpper(w[:size])) | ||
|  | } | ||
|  | 
 | ||
|  | func forRange(w []byte) { | ||
|  | 	var size int | ||
|  | 	for i := range string(w) { | ||
|  | 		if i > 0 { | ||
|  | 			size = i | ||
|  | 			break | ||
|  | 		} | ||
|  | 	} | ||
|  | 	copy(w[:size], bytes.ToUpper(w[:size])) | ||
|  | } | ||
|  | 
 | ||
|  | var globalString string | ||
|  | 
 | ||
|  | func concater(w []byte) { | ||
|  | 	runes := []rune(string(w)) | ||
|  | 	runes[0] = unicode.ToUpper(runes[0]) | ||
|  | 	globalString = string(runes) | ||
|  | } | ||
|  | 
 | ||
|  | func bench(technique func([]byte)) testing.BenchmarkResult { | ||
|  | 	return testing.Benchmark(func(b *testing.B) { | ||
|  | 		for i := 0; i < b.N; i++ { | ||
|  | 			technique(word) | ||
|  | 		} | ||
|  | 	}) | ||
|  | } | ||
|  | 
 | ||
|  | func main() { | ||
|  | 	fmt.Println("benchDecoder", bench(decoder)) | ||
|  | 	fmt.Println("benchForRange", bench(forRange)) | ||
|  | 	fmt.Println("benchConcater", bench(concater)) | ||
|  | } |