非常有趣,我的機器(MacBook Pro的2013年底,酷睿i7 2.3GHz的)上的JS代碼比圍棋一個快得多:
JS:
time node test.js
842161320
real 0m4.437s
user 0m4.900s
sys 0m0.150s
轉到:
time GOMAXPROCS=8 ./test
842161320
real 0m7.345s
user 0m7.470s
sys 0m0.010s
但是,在Go代碼的快速優化之後:
轉到:
time GOMAXPROCS=8 ./test
842161320
real 0m1.760s
user 0m11.610s
sys 0m0.230s
快速優化我說的(很幼稚):並行化計算:
package main
import (
"fmt"
"os"
"runtime"
)
func numberOfDevisor(n int64) int64 {
var result int64
var i int64 = 1
for true {
if n%i == 0 {
opposite := n/i
if opposite == i {
result++
return result
} else if opposite > i {
result += 2
} else {
return result
}
}
i++
}
return result
}
func main() {
var acc int64
var i int64 = 1
maxRoutines := runtime.NumCPU()
c := make(chan struct{}, maxRoutines)
for i := 0; i < maxRoutines; i++ {
c <- struct{}{}
}
for true {
<-c
acc += i
go func(acc int64) {
defer func() { c <- struct{}{} }()
if numberOfDevisor(acc) > 1000 {
fmt.Println(acc)
os.Exit(0)
}
}(acc)
i++
}
}
這正是相同的代碼,一個被通過轉到編譯器編譯,其他通過的JIT Javascript VM。那麼:你爲什麼期望在合成的人造代碼上存在重大差異? – Volker 2014-10-29 14:25:31
非常真實,感謝提及JIT,因爲我沒有注意到它。雖然,與JavaScript相比,Go是一種低級和靜態類型的語言,我認爲可能會有一些性能優勢。此外,我認爲Go可能不需要解釋過程,這讓我期待Go更快。我想錯了嗎? – Jun 2014-10-29 16:08:08
儘管代碼的外觀如何,它並不是相同的代碼。具體而言:類型是不同的。一種是在JavaScript情況下隱式處理浮點雙精度,Go代碼使用'int64'。由於數字類型在JavaScript中是隱含的,因此一些評估人員可以在表面下方切換類型表示,以便它可以使用更便宜的表示法。例如,當V8知道數字不是那麼大時,將使用31位小整數。 http://thibaultlaurens.github.io/javascript/2013/04/29/how-the-v8-engine-works/ – dyoo 2014-10-29 17:39:03