2017-05-29 11 views
0

NodeとGoの機能をテストしてパフォーマンスを比較しました。ほぼすべてのテストで、GoはNodeよりもはるかに高速ですが、strings.Fields()またはstrings.Split()が使用されている場合を除き、ノードは2〜3倍高速です。なぜGoのstrings.Fields(str)とstrings.Split(str、 "")が遅いのですか?

ゴー(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) 

ノード(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') 
+2

しかし 'strings.Split(STR、"「) 'ない作品:[ゴー遊び場](https://play.golang.org/p/E7VaBxY_iT) – icza

+1

どのようにパフォーマンスを測定しましたか? – peterSO

+0

@peterSO質問を編集しました – Travis

答えて

1

まずは、あなたのテストを実行してみましょう。

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

Node.jsと4.07秒の間になります。

次に、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() 
} 

出力:

$ 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 
$ 
関連する問題