Advertisement
ro-tex

String concatenation peformance in Go

Jul 21st, 2020
1,979
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*
  2.  
  3. Cloned from: https://pastebin.com/ukxUmAwa
  4.  
  5. AMD Athlon64 X2
  6. 2GB DDR2
  7.  
  8. Go 1.5.1 linux/amd64
  9.  
  10. Ubuntu 15.10
  11. Linux asus 4.2.0-19-generic #23-Ubuntu SMP Wed Nov 11 11:39:30 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
  12.  
  13. BenchmarkStringSprintf-2         100      10140559 ns/op     5518024 B/op       4616 allocs/op
  14. BenchmarkStringJoin-2            200       6962496 ns/op     5388737 B/op       2000 allocs/op
  15. BenchmarkStringAdd-2             500       3440360 ns/op     2694352 B/op        999 allocs/op
  16. BenchmarkStringWrite-2         30000         54597 ns/op       18656 B/op          8 allocs/op
  17. BenchmarkStringAppend-2        30000         41325 ns/op       20736 B/op         13 allocs/op
  18. BenchmarkBytesJoin-2             300       4883126 ns/op     2694449 B/op       1001 allocs/op
  19. BenchmarkBytesAppend-2         30000         53491 ns/op       20736 B/op         13 allocs/op
  20. BenchmarkBytesWrite-2          20000         64233 ns/op       18656 B/op          8 allocs/op
  21.  
  22. Feel free to change the LIMIT.
  23.  
  24. */
  25. package test
  26.  
  27. import (
  28.     "bytes"
  29.     "fmt"
  30.     "strings"
  31.     "testing"
  32. )
  33.  
  34. var (
  35.     s1 = "local"
  36.     b1 = []byte("local")
  37. )
  38.  
  39. const LIMIT = 1000
  40.  
  41. func BenchmarkStringSprintf(b *testing.B) {
  42.     var q string
  43.     for i := 0; i < b.N; i++ {
  44.         for j := 0; j < LIMIT; j++ {
  45.             q = fmt.Sprintf("%s%s", q, s1)
  46.         }
  47.         q = ""
  48.     }
  49.     b.ReportAllocs()
  50. }
  51.  
  52. func BenchmarkStringJoin(b *testing.B) {
  53.     var q string
  54.     for i := 0; i < b.N; i++ {
  55.         for j := 0; j < LIMIT; j++ {
  56.             q = strings.Join([]string{q, s1}, "")
  57.         }
  58.         q = ""
  59.     }
  60.     b.ReportAllocs()
  61. }
  62.  
  63. func BenchmarkStringAdd(b *testing.B) {
  64.     var q string
  65.     for i := 0; i < b.N; i++ {
  66.         for j := 0; j < LIMIT; j++ {
  67.             q = q + s1
  68.         }
  69.         q = ""
  70.     }
  71.     b.ReportAllocs()
  72. }
  73.  
  74. func BenchmarkStringWrite(b *testing.B) {
  75.     q := new(bytes.Buffer)
  76.     for i := 0; i < b.N; i++ {
  77.         for j := 0; j < LIMIT; j++ {
  78.             q.WriteString(s1)
  79.         }
  80.         q = new(bytes.Buffer)
  81.     }
  82. }
  83.  
  84. func BenchmarkStringAppend(b *testing.B) {
  85.     var q []byte
  86.     for i := 0; i < b.N; i++ {
  87.         for j := 0; j < LIMIT; j++ {
  88.             q = append(q, s1...)
  89.         }
  90.         q = nil
  91.     }
  92.     b.ReportAllocs()
  93. }
  94.  
  95. func BenchmarkBytesJoin(b *testing.B) {
  96.     var q []byte
  97.     for i := 0; i < b.N; i++ {
  98.         for j := 0; j < LIMIT; j++ {
  99.             q = bytes.Join([][]byte{q, b1}, nil)
  100.         }
  101.         q = nil
  102.     }
  103.     b.ReportAllocs()
  104. }
  105.  
  106. func BenchmarkBytesAppend(b *testing.B) {
  107.     var q []byte
  108.     for i := 0; i < b.N; i++ {
  109.         for j := 0; j < LIMIT; j++ {
  110.             q = append(q, b1...)
  111.         }
  112.         q = nil
  113.     }
  114.     b.ReportAllocs()
  115. }
  116.  
  117. func BenchmarkBytesWrite(b *testing.B) {
  118.     q := new(bytes.Buffer)
  119.     for i := 0; i < b.N; i++ {
  120.         for j := 0; j < LIMIT; j++ {
  121.             q.Write(b1)
  122.         }
  123.         q = new(bytes.Buffer)
  124.     }
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement