【发布时间】:2020-08-07 23:33:04
【问题描述】:
我试图对 javascript 和 .net 核心进行基准测试,以便选择一个服务器端框架来提供一些需要迭代大型数组的特定 RESTful 服务(大约 21 亿)。在编写一个简单的代码时,我意识到节点在特定数字迭代后有奇怪的行为。我在多个平台上重复并达到了相同的结果。测试的平台是:
- macOS catalina (nodeJS v.12.18) intel core i9 4ghz 6 core
- linux centos 7 (nodeJS v.12.18) vm intel core i9 4ghz 2 core
- google chrome 版本 84.0.4147.105(官方版本)(64 位)
- Mozilla firefox 78.2 版
running video shows surprisingly increase process time about two times from 300ms to 600ms
示例代码:
1。节点:
var cnt = 0;
var logPeriod=100000000;
var max=10000000000;
for (let i = 0; i < max; i++) {
if (i % logPeriod === 0) {
// var end = Date.now();
if (i !== 0) {
console.timeEnd(cnt*logPeriod, i);
cnt++;
}
console.time(cnt*logPeriod);
}
}
2.浏览器
<!DOCTYPE html>
<html>
<head>
<script>
function doloop() {
var cnt = 0;
var logPeriod = 100000000;
var max = 10000000000;
for (let i = 0; i < max; i++) {
if (i % logPeriod === 0) {
// var end = Date.now();
if (i !== 0) {
console.timeEnd(cnt * logPeriod, i);
cnt++;
}
console.time(cnt * logPeriod);
}
}
}
</script>
</head>
<body>
<button onclick="doloop()">doloop</button>
</body>
</html>
【问题讨论】:
-
可能
cnt*logPeriod最终会超出真正的整数范围(31 位)并转而使用更大整数的浮点表示,因此速度会变慢。 -
等等,您的应用程序真的有一个用例,您的服务器需要迭代一个包含 21 亿个条目的数组?
-
好的。是的。然而,在幕后执行“引擎”时,为了提高效率,在适当的位范围内使用规范类型的整数。这取决于引擎的实现。因此,这很可能是 OP 环境变慢的原因。
-
@GetSet:你在现场;除了
cnt*logPeriod和i本身超出 int32 范围之外。 -
@AhadRafatTalebi:这是意料之中的。在浮点运算总是比整数运算慢的意义上,操作系统和 CPU 无关紧要。只有差异的大小可能取决于硬件(我在我的机器上看到大约 4 倍:120 对 540 毫秒)。它是否是 64 位操作系统也无关紧要:“在内部使用 int32”技巧不能扩展到 int64,因为可能的 int32 值是 double 值的子集,但 int64 值不是:它们将是 太精确了,所以如果引擎使用它们,那将是一个错误。这很棘手:-)
标签: javascript for-loop v8 slowdown