2017-05-29 31 views
0

我一直在測試Node和Go的功能來比較它們的性能。在幾乎所有測試中,Go比Node快得多,除非使用strings.Fields()strings.Split(),那麼Node的速度是其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 
$ 

轉5.89秒,比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 
$ 
相關問題