javascript - 我不知道为什么在我的案例中 JS 和 Go 之间没有很大的性能差异

标签 javascript performance go

我刚刚解决了 #12 Project Euler 中的问题,关于除数和三 Angular 数,一次在 Go 中,一次在 JavaScript 中。我认为 Go 中的代码会比 JS 中的代码快得多,因为 JS 在运行时运行代码,而 Go 构建代码。我知道构建代码​​并不直接意味着良好的性能,但结果是即使 JS 中的代码有时在不同条件下更快。

我使用的代码如下。

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

我在我的 macbook 上测试了它们,规范如下。

处理器:2.6 GHz 英特尔酷睿 i5
内存:8 GB 1600 MHz DDR3

我用下面的命令运行了它们。

$ #js
$ node euler12.js

$ #go
$ go build euler12.go
$ ./euler12

我做错了什么吗?如果不是,为什么它们之间没有区别?我还用 Python 进行了测试,Go 和 Python 之间存在很大差距。提前致谢。

最佳答案

非常有趣,在我的机器上(macbookpro 2013 年末,i7 2.3ghz),JS 代码比 Go 代码快得多:

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++
        }
}

关于javascript - 我不知道为什么在我的案例中 JS 和 Go 之间没有很大的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26632627/

相关文章:

javascript - 在javascript中获取值时出错?

Javascript $ ('li' ).length 调用抛出未捕获的异常

performance - Ember 0.9.6 性能更新 - 重要吗?

jquery - 处理javascript中的特殊字符

javascript - 运行 JQuery 异步 - 不中断站点加载

c++ - 计算一个巨大的c++程序的运行时间

types - 为什么我可以键入别名函数并在不强制转换的情况下使用它们?

go - 从 golang 使用 AMQP 1.0 连接到 IBM MQ 时出现 EOF

用于训练目的的 Golang 概要分析简单示例

javascript - 完成后如何使用 jQuery 加载模块?