小编Tei*_*iem的帖子

JavaScript 数组性能在 13k-16k 元素时下降

我正在对数组的创建和编辑性能进行一些性能测试,并注意到大约有 13k-16k 元素的数组周围有一些奇怪的特征。

下图显示了创建数组并从中读取每个元素所需的时间(在本例中是对数组中的数字求和)。capacitypush与数组的创建方式相关:

  • 容量const arr = new Array(length)然后arr[i] = data
  • const arr = [];然后arr.push(data)

根据长度创建数组的时间 基于长度的数组操作时间

正如您所看到的,在这两种情况下,创建数组并读取数组时,与元素少 1k 时每个元素的性能相比,性能降低了约 2-3 倍。
当使用push方法创建数组时,与事先使用正确的容量创建数组相比,这种跳转发生得更早一些。我认为发生这种情况是因为,当推送到已经达到最大容量的阵列时,添加的额外容量超过了实际需要的额外容量(以避免很快再次添加新容量),并且达到了较慢性能路径的阈值早些时候。

如果您想查看代码或自己测试:github

我的问题是,为什么性能会下降到 13k-16k 左右?

对我来说,在 v8 中,从大约 13k-16k 元素开始,较大的数组会受到不同的处理,以提高它们的性能,但截止点(至少在我的代码中)有点太早,因此在优化带来之前性能下降任何好处。

您可以看到性能改进在大约 500 个元素后下降,并在下降后再次上升。

遗憾的是我找不到任何相关信息。

另外,如果您碰巧知道为什么在容量创建和推送求和结束时会出现这些峰值,请随时告诉我:)

编辑:

正如 @ggorlen 所建议的,我在另一台机器上运行相同的测试,以排除缓存作为所见行为的原因(使用不同的、较弱的 CPU 和较少的 RAM)。结果看起来非常相似。

在不同机器上根据长度创建数组的时间 在不同机器上基于长度的数组操作时间

编辑:

我使用该--allow-natives-syntax标志运行节点来调试日志创建的数组%DebugPrint(array);,希望看到不同数组长度之间的差异,但除了长度和内存地址之外,它们看起来都相同。这是一个例子:

// For array created with capacity
DebugPrint: 000002CB8E1ACE19: [JSArray]
 - map: 0x035206283321 <Map(HOLEY_SMI_ELEMENTS)> [FastProperties]
 - prototype: 0x036b86245b19 <JSArray[0]>
 - …
Run Code Online (Sandbox Code Playgroud)

javascript arrays v8

17
推荐指数
1
解决办法
907
查看次数

枚举中的 Rust 名称字段

是否可以命名或以其他方式描述 in rust 的字段enum
让我们看看这段代码

enum Move {
    Capture(Piece, Piece, (i8, i8), (i8, i8)),
    ...
}
Run Code Online (Sandbox Code Playgroud)

这些值的含义可能并不明显,在这种情况下,第一块是我的块,它捕获第二块,从而从第一个位置 ( (i8, i8)) 移动到第二个位置。

理想的是这样的

enum Move {
    Capture(piece: Piece, captured: Piece, from: (i8, i8), to: (i8, i8)),
    ...
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是这不起作用。

有什么方法可以让我的内容enum更具描述性(除了评论之外)?

enums rust

12
推荐指数
1
解决办法
4445
查看次数

如何根据动态变量进行匹配?

是否可以匹配动态变量而不仅仅是文字?

在此代码中,第一个match应该执行与注释掉的相同的操作matchnumber[0]being0number[1]being 1):

const NUMBERS: [i8; 2] = [0, 1];

fn test() {
    let current = 5;

    let string = match current % 2 {
        NUMBERS[0] => "even", // This does not work
        NUMBERS[1] => "odd",  // This does not work
        _ => unreachable!(),
    };

    // let string = match current % 2 {
    //     0 => "even",
    //     1 => "odd",
    //     _ => unreachable!()
    // };
}
Run Code Online (Sandbox Code Playgroud)

pattern-matching rust

9
推荐指数
2
解决办法
4392
查看次数

chrome 82 - 隐藏输入类型时间“时钟”符号

从 chrome 81 或 82 开始,输入类型时间的右侧有一个时钟符号 - 我该如何隐藏它(输入应该仍然是可编辑的,所以不是只读的)?

html input

6
推荐指数
1
解决办法
986
查看次数

列表中的差异名称和任何(列表中s的名称)

我是Python的新手,并查找如何查找,如果列表中有内容并找到

if any(name in s for s in list):
Run Code Online (Sandbox Code Playgroud)

后来我发现了

if name in list:
Run Code Online (Sandbox Code Playgroud)

这似乎更简单.为什么建议第一个选项,有什么区别?

python python-3.x

3
推荐指数
1
解决办法
91
查看次数

标签 统计

rust ×2

arrays ×1

enums ×1

html ×1

input ×1

javascript ×1

pattern-matching ×1

python ×1

python-3.x ×1

v8 ×1