我正在对数组的创建和编辑性能进行一些性能测试,并注意到大约有 13k-16k 元素的数组周围有一些奇怪的特征。
下图显示了创建数组并从中读取每个元素所需的时间(在本例中是对数组中的数字求和)。capacity并push与数组的创建方式相关:
const arr = new Array(length)然后arr[i] = dataconst arr = [];然后arr.push(data)正如您所看到的,在这两种情况下,创建数组并读取数组时,与元素少 1k 时每个元素的性能相比,性能降低了约 2-3 倍。
当使用push方法创建数组时,与事先使用正确的容量创建数组相比,这种跳转发生得更早一些。我认为发生这种情况是因为,当推送到已经达到最大容量的阵列时,添加的额外容量超过了实际需要的额外容量(以避免很快再次添加新容量),并且达到了较慢性能路径的阈值早些时候。
如果您想查看代码或自己测试:github
对我来说,在 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)是否可以命名或以其他方式描述 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更具描述性(除了评论之外)?
是否可以匹配动态变量而不仅仅是文字?
在此代码中,第一个match应该执行与注释掉的相同的操作match(number[0]being0和number[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) 从 chrome 81 或 82 开始,输入类型时间的右侧有一个时钟符号 - 我该如何隐藏它(输入应该仍然是可编辑的,所以不是只读的)?
我是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)
这似乎更简单.为什么建议第一个选项,有什么区别?