Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么Go';s strings.Fields(str)和strings.Split(str,“str”)这么慢?_Arrays_Node.js_String_Performance_Go - Fatal编程技术网

Arrays 为什么Go';s strings.Fields(str)和strings.Split(str,“str”)这么慢?

Arrays 为什么Go';s strings.Fields(str)和strings.Split(str,“str”)这么慢?,arrays,node.js,string,performance,go,Arrays,Node.js,String,Performance,Go,我一直在Node中测试函数,并比较它们的性能。在几乎所有测试中,Go都比Node快得多,除非使用strings.Fields()或strings.Split(),否则Node的速度是Node的2-3倍 Go(2.14秒): start:=time.Now() var newWords[]字符串 str:=“asd asjhfa lsjdhalsdjhfa DHFALDH FALDHFASDH ALLDH alksdh alksdh alksdh alksdh alksd ALKKJDH ASDH

我一直在Node中测试函数,并比较它们的性能。在几乎所有测试中,Go都比Node快得多,除非使用
strings.Fields()
strings.Split()
,否则Node的速度是Node的2-3倍

Go(2.14秒):

start:=time.Now()
var newWords[]字符串
str:=“asd asjhfa lsjdhalsdjhfa DHFALDH FALDHFASDH ALLDH alksdh alksdh alksdh alksdh alksd ALKKJDH ASDHF afa d6a 5a85dfa s5da5d和a6sd58ad5a8sd5f 8AS5A8S5 8as6d5 ASD65F8AS6D58 A5SD8F7 a6s5d”
对于j:=0;j<1000000;j++{
单词:=strings.Split(str,“”)
wordsLen:=len(字)
新词=零
对于i:=0;i
节点(847ms):

let start=new Date()
让新词=[]
let str=“asd asjhfa lsjdhalsdjhfa dhfald hfaljdh FALDHFASD ALLDH alksdh alksdh alksdh alksdh alksd alksd alksd fadlkj dalkjdh asdhfef afa d6a 5a85dfa s5da5d ad a6sd58ad5a8sd5f 8as5f as5 a8s5 AS6D5 ASD6 5F8ASD58 A5SD8F7 a6s5d”
对于(设j=0;j<1000000;j++){
让单词=str.split(“”)
让wordsLen=words.length
新词=[]
for(设i=wordsLen-1;i>=0;i--){
if(字[i].substr(0,1)!='s'){
newWords.push(单词[i])
}
}
}
console.log((new Date()-start)+“ms”)

首先,让我们运行您的测试

$ go run travis.go
5.892531292s
$ node travis.js
4065ms
$
与Node.js 4.07秒相比,增加5.89秒

其次,让我们运行一个Go基准测试,看看您真正在做什么。这比你在原始帖子中说的
strings.Fields(str)
strings.Split(str,“”)
要多得多

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()
}

但是
strings.Split(str,“”)
是否有效:您是如何衡量性能的?@peterSO我编辑了question@icza我为你编辑了这个问题,这不是你如何衡量Go中的执行时间。看看这个答案:
$ go run travis.go
5.892531292s
$ node travis.js
4065ms
$
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()
}
$ 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
$