douduan1953 2017-05-29 14:14
浏览 362

为什么Go的strings.Fields(str)和strings.Split(str,“”)这么慢?

I have been testing functions in Node and Go to compare their performance. In almost every test, Go is much faster than Node, except when strings.Fields() or strings.Split() is used, then Node is 2-3 times as fast.

Go (2.14s):

start := time.Now()
var newWords []string
str := "asd asjhfa lsjdhalsdjhfa dhfald hfaljdh faldhfasjdhfalsdh asd alsdh alksdh alksdh alksd alkjsd fadlkj dalkjdh asdhfef afa d6a 5a85dfa s5da5d ad a6sd58ad5a8sd5f 8as5f as5 a8s5 8as6d5 8asd65f8as6d58 a5sd 8a5ds8f7 a6s5d"

for j := 0; j < 1000000; j++ {
    words := strings.Split(str, " ")
    wordsLen := len(words)
    newWords = nil
    for i := 0; i < wordsLen; i++ {
        if words[i][:1] != "s" {
            newWords = append(newWords, words[i])
        }
    }
}
dur := time.Since(start)

fmt.Println(newWords)
fmt.Println(dur)

Node (847ms):

let start = new Date()
let newWords = []
let str = "asd asjhfa lsjdhalsdjhfa dhfald hfaljdh faldhfasjdhfalsdh asd alsdh alksdh alksdh alksd alkjsd fadlkj dalkjdh asdhfef afa d6a 5a85dfa s5da5d ad a6sd58ad5a8sd5f 8as5f as5 a8s5 8as6d5 8asd65f8as6d58 a5sd 8a5ds8f7 a6s5d"

for (let j = 0; j < 1000000; j++) {
    let words = str.split(' ')
    let wordsLen = words.length
    newWords = []
    for (let i = wordsLen - 1; i >= 0; i--) {
        if (words[i].substr(0, 1) !== 's') {
            newWords.push(words[i])
        }
    }
}

console.log((new Date() - start) + 'ms')
  • 写回答

1条回答 默认 最新

  • dragon7088 2017-05-29 15:29
    关注

    First, let's run your tests.

    $ go run travis.go
    5.892531292s
    $ node travis.js
    4065ms
    $
    

    Go 5.89 seconds versus Node.js 4.07 seconds.

    Second, let's run a Go benchmark and see what you are really doing. It's a lot more than the strings.Fields(str) or strings.Split(str, " ") that you said in your original post.

    travis_test.go:

    package main
    
    import (
        "strings"
        "testing"
    )
    
    var str = "asd asjhfa lsjdhalsdjhfa dhfald hfaljdh faldhfasjdhfalsdh asd alsdh alksdh alksdh alksd alkjsd fadlkj dalkjdh asdhfef afa d6a 5a85dfa s5da5d ad a6sd58ad5a8sd5f 8as5f as5 a8s5 8as6d5 8asd65f8as6d58 a5sd 8a5ds8f7 a6s5d"
    
    func Travis() {
        var newWords []string
        for j := 0; j < 1000000; j++ {
            words := strings.Split(str, " ")
            wordsLen := len(words)
            newWords = nil
            for i := 0; i < wordsLen; i++ {
                if words[i][:1] != "s" {
                    newWords = append(newWords, words[i])
                }
            }
        }
    }
    
    func BenchmarkTravis(b *testing.B) {
        b.ReportAllocs()
        b.ResetTimer()
        for i := 0; i < b.N; i++ {
            Travis()
        }
        b.StopTimer()
    }
    

    Output:

    $ go test -run=! -bench=Travis travis_test.go 
    goos: linux
    goarch: amd64
    BenchmarkTravis-4   1   5832192616 ns/op   1488002816 B/op   7000015 allocs/op
    PASS
    ok      command-line-arguments  5.838s
    $
    
    评论

报告相同问题?

悬赏问题

  • ¥20 模型在y分布之外的数据上预测能力不好如何解决
  • ¥15 processing提取音乐节奏
  • ¥15 gg加速器加速游戏时,提示不是x86架构
  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入
  • ¥20 XP系统在重新启动后进不去桌面,一直黑屏。
  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条