2014-10-29 167 views
2

JS和圍棋之間沒有大的性能差異,我只是解決了項目歐拉#12問題,關於除數和三角形數量,一旦進入,一次在JavaScript中。我認爲Go中的代碼比JS中的代碼快得多,因爲JS在運行時運行代碼並且Go編譯代碼。我知道構建代碼​​並不直接意味着良好的性能,但結果是即使JS中的代碼在不同的條件下有時也更快。我不知道爲什麼會出現在我的情況下

我使用的代碼是象下面這樣。

https://gist.github.com/noraesae/675e40477e177f9f63f9

我測試了他們在我的MacBook,以及規範是像下面。

處理器:2.6 GHz英特爾酷睿
內存:8 GB 1600 MHz的DDR3

我跑它們與下面的命令。

$ #js
$節點euler12.js

$ #go
$去建立euler12.go
$ ./euler12

難道我做錯了什麼?如果沒有,爲什麼他們之間沒有區別?我還用Python進行了測試,Go和Python之間存在很大差距。提前致謝。

+2

這正是相同的代碼,一個被通過轉到編譯器編譯,其他通過的JIT Javascript VM。那麼:你爲什麼期望在合成的人造代碼上存在重大差異? – Volker 2014-10-29 14:25:31

+0

非常真實,感謝提及JIT,因爲我沒有注意到它。雖然,與JavaScript相比,Go是一種低級和靜態類型的語言,我認爲可能會有一些性能優勢。此外,我認爲Go可能不需要解釋過程,這讓我期待Go更快。我想錯了嗎? – Jun 2014-10-29 16:08:08

+1

儘管代碼的外觀如何,它並不是相同的代碼。具體而言:類型是不同的。一種是在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

回答

1

非常有趣,我的機器(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++ 
     } 
} 
相關問題