gpt4 book ai didi

javascript - Golang 与 JavaScript (v8/node.js) 映射性能

转载 作者:IT王子 更新时间:2023-10-29 01:33:35 29 4
gpt4 key购买 nike

出于好奇,我写了一些简单的基准测试,比较了 golang 映射与用作映射的 JavaScript (v8/node.js) 对象的性能,并对它们的相对性能感到惊讶。 JavaScript 对象的执行速度似乎大约是 go 映射的两倍(甚至包括 go 的一些小性能优势)!

这是 go 的实现:

// map.go
package main
import "fmt"
import "time"
func elapsedMillis(t0, t1 time.Time) float64 {
n0, n1 := float64(t0.UnixNano()), float64(t1.UnixNano())
return (n1 - n0) / 1e6
}
func main() {
m := make(map[int]int, 1000000)
t0 := time.Now()
for i := 0; i < 1000000; i++ {
m[i] = i // Put.
_ = m[i] + 1 // Get, use, discard.
}
t1 := time.Now()
fmt.Printf("go: %fms\n", elapsedMillis(t0, t1))
}

这是 JavaScript:

#!/usr/bin/env node
// map.js
function elapsedMillis(hrtime0, hrtime1) {
var n0 = hrtime0[0] * 1e9 + hrtime0[1];
var n1 = hrtime1[0] * 1e9 + hrtime1[1];
return (n1 - n0) / 1e6;
}
var m = {};
var t0 = process.hrtime();
for (var i=0; i<1000000; i++) {
m[i] = i; // Put.
var _ = m[i] + 1; // Get, use, discard.
}
var t1 = process.hrtime();
console.log('js: ' + elapsedMillis(t0, t1) + 'ms');

请注意,go 实现有几个潜在的性能优势:

  1. Go 将整数直接映射到整数,而 JavaScript 会将整数键转换为字符串属性名称。

  2. Go 使其 map 的初始容量等于基准大小,而 JavaScript 是从其默认容量增长)。

然而,尽管上面列出了潜在的性能优势,go map 的使用率似乎只有 JavaScript object map 的一半左右!例如(代表):

go: 128.318976ms
js: 48.18517ms

我是不是在使用 go maps 做一些明显错误的事情,或者以某种方式将苹果与橘子进行比较?

我本来希望 go maps 的性能至少和 JavaScript 对象一样好——如果不比 JavaScript 对象更好的话。这只是 go 不成熟的标志(darwin/amd64 上的 1.4)还是它代表了我所缺少的两种语言数据结构之间的一些根本差异?

[更新]

请注意,如果您显式使用字符串键(例如通过 s := strconv.Itoa(i)var s = ''+i 在 Go 和 JavaScript 中,分别)那么它们的性能大致相当。

我的猜测是,v8 的非常高的性能与该运行时中针对键为连续整数的对象的特定优化有关(例如,通过替换数组实现而不是哈希表)。

我投票决定关闭,因为这里可能没有什么可看的......

最佳答案

您的基准测试有点综合,就像任何基准测试一样。纯属好奇尝试

for i := 0; i < 1000000; i += 9 {

在 Go 实现中。你可能会感到惊讶。

关于javascript - Golang 与 JavaScript (v8/node.js) 映射性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29758980/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com