Golang 字符串连接性能探究

前端之家收集整理的这篇文章主要介绍了Golang 字符串连接性能探究前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Golang 字符串连接性能探究

标签(空格分隔): golang


为何探究

几乎所有的软件项目,不管是什么语言,都会用到处理字符串,而拼接字符是最基本,也最常用的。一般连接字符串都有好几种方式,不同的方式适合不同的场景,此次仅探究如果快速动态连接大量的字符串。

相关问题

  1. https://gocn.io/question/265&sort_key=agree_count&sort=DESC
  2. http://stackoverflow.com/questions/1760757/how-to-efficiently-concatenate-strings-in-go/23857998

探究的代码

还是代码最明了

  1. package main
  2.  
  3. import (
  4. "bytes"
  5. "fmt"
  6. "strings"
  7. "time"
  8. )
  9.  
  10. var way map[int]string
  11.  
  12. func benchmarkStringFunction(n int,index int) (d time.Duration) {
  13. v := "ni shuo wo shi bu shi tai wu liao le a?"
  14. var s string
  15. var buf bytes.Buffer
  16.  
  17. t0 := time.Now()
  18. for i := 0; i < n; i++ {
  19. switch index {
  20. case 0: // fmt.Sprintf
  21. s = fmt.Sprintf("%s[%s]",s,v)
  22. case 1: // string +
  23. s = s + "[" + v + "]"
  24. case 2: // strings.Join
  25. s = strings.Join([]string{s,"[",v,"]"},"")
  26. case 3: // stable bytes.Buffer
  27. buf.WriteString("[")
  28. buf.WriteString(v)
  29. buf.WriteString("]")
  30. }
  31.  
  32. }
  33. d = time.Since(t0)
  34. if index == 3 {
  35. s = buf.String()
  36. }
  37. fmt.Printf("string len: %d\t",len(s))
  38. fmt.Printf("time of [%s]=\t %v\n",way[index],d)
  39. return d
  40. }
  41.  
  42. func main() {
  43. way = make(map[int]string,5)
  44. way[0] = "fmt.Sprintf"
  45. way[1] = "+"
  46. way[2] = "strings.Join"
  47. way[3] = "bytes.Buffer"
  48.  
  49. k := 4
  50. d := [5]time.Duration{}
  51. for i := 0; i < k; i++ {
  52. d[i] = benchmarkStringFunction(10000,i)
  53. }
  54. }
  1. 结果:
  2. string len: 410000 time of [fmt.Sprintf]= 426.001476ms
  3. string len: 410000 time of [+]= 307.044147ms
  4. string len: 410000 time of [strings.Join]= 738.44362ms
  5. string len: 410000 time of [bytes.Buffer]= 742.248µs

结果

结果很明显:

  • strings.Join 最慢
  • fmt.Sprintf 和 string + 差不多
  • bytes.Buffer又比上者快约500倍

猜你在找的Go相关文章