英文:
I don't know why there's no big performance difference between JS and Go in my case
问题
我刚刚在欧拉计划中解决了#12问题,涉及到约数和三角数,分别用Go和JavaScript实现了一次。我以为Go的代码会比JS的代码快得多,因为JS在运行时执行代码,而Go是构建代码。我知道构建代码并不直接意味着良好的性能,但结果是,即使在不同条件下,JS的代码有时也比Go的代码快。
我使用的代码如下。
https://gist.github.com/noraesae/675e40477e177f9f63f9
我在我的MacBook上进行了测试,规格如下。
处理器:2.6 GHz 英特尔 Core i5
内存:8 GB 1600 MHz DDR3
我使用以下命令运行它们。
$ #js
$ node euler12.js$ #go
$ go build euler12.go
$ ./euler12
我做错了什么吗?如果没有,为什么它们之间没有区别?我还用Python进行了测试,Go和Python之间有很大的差距。提前感谢。
英文:
I've just solved the #12 problem in Project Euler, about divisor and triangle number, once in Go and once in JavaScript. I thought the code in Go would be much faster than one in JS, cause JS runs the code in runtime and Go builds the code. I know that building the code doesn't directly mean good performance, but the result was that even the code in JS was sometimes faster in different conditions.
The code I used is like below.
https://gist.github.com/noraesae/675e40477e177f9f63f9
I tested them in my macbook, and spec is like below.
Processor: 2.6 GHz Intel Core i5
Memory: 8 GB 1600 MHz DDR3
I ran them with commands below.
> $ #js
> $ node euler12.js
>
> $ #go
> $ go build euler12.go
> $ ./euler12
Did I do something wrong? If not, why there's no difference between them? I also tested with Python and there was a big gap between Go and Python. Thanks in advance.
答案1
得分: 1
很有趣,在我的机器上(macbookpro 2013年底,i7 2.3ghz),JS代码比Go代码快得多:
JS:
time node test.js
842161320
real 0m4.437s
user 0m4.900s
sys 0m0.150s
Go:
time GOMAXPROCS=8 ./test
842161320
real 0m7.345s
user 0m7.470s
sys 0m0.010s
然而,在对Go代码进行快速优化之后:
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++
}
}
英文:
Pretty interesting, on my machine (macbookpro late 2013, i7 2.3ghz), the JS code is much faster than the Go one:
JS:
time node test.js
842161320
real 0m4.437s
user 0m4.900s
sys 0m0.150s
Go:
time GOMAXPROCS=8 ./test
842161320
real 0m7.345s
user 0m7.470s
sys 0m0.010s
However, after a quick optimization of the Go code:
Go:
time GOMAXPROCS=8 ./test
842161320
real 0m1.760s
user 0m11.610s
sys 0m0.230s
The quick optimization I am talking about (very naive): parallelize your computation:
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++
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论