javascript - 如何一般性地解决在 JavaScript 中生成增量整数 ID 的问题

标签 javascript performance optimization integer

我几天来一直在思考这个问题,试图看看是否有一种通用方法来编写这个函数,这样你就不必担心它再次崩溃。也就是说,它尽可能强大,并且可以支持高效且有效地用完所有内存(在 JavaScript 中)。

所以问题是关于一个基本的事情。通常,当您在 JavaScript 中创建某种类型的对象时,您可能会给它们一个 ID。在浏览器中,例如对于虚拟 DOM 元素,您可能只需为它们提供一个全局唯一 ID (GUID) 并将其设置为递增整数。

GUID = 1

let a = createNode() // { id: 1 }
let b = createNode() // { id: 2 }
let c = createNode() // { id: 3 }

function createNode() {
  return { id: GUID++ }
}

但是当你用完整数时会发生什么? Number.MAX_SAFE_INTEGER == 2⁵³ - 1。这显然是一个非常大的数字:也许是 9,007,199,254,740,991 千万亿。数十亿亿。但如果 JS 可以达到每秒 1000 万次操作,那么大约需要 900,719,925 秒才能达到这个数字,或者 10416 天,或者大约 30 年。因此,在这种情况下,如果您让计算机运行 30 年,它最终会耗尽递增的 ID。这将是一个很难发现的错误!!!

如果并行生成 ID,那么您可以更实际(更快)地用完递增的整数。假设您不想使用 GUID 方案。

考虑到计算机的内存限制,您只能创建一定数量的对象。在 JS 中,你可能无法创建超过几十亿的值。

但我的问题是,作为一个理论练习,如何解决生成递增整数的问题,这样如果达到 Number.MAX_SAFE_INTEGER,您将从头开始循环,但不要使用您已经“生活和束缚”的潜在数十亿(或仅数百万)。您必须使用哪种方案来实现它,以便您可以简单地循环整数并始终知道您有一个可用的免费整数?

function getNextID() {
  if (i++ > Number.MAX_SAFE_INTEGER) {
    return i = 0
  } else {
    return i
  }
}

随机notes :

The fastest overall was Chrome 11 (under 2 sec per billion iterations, or at most 4 CPU cycles per iteration); the slowest was IE8 (about 55 sec per billion iterations, or over 100 CPU cycles per iteration).

<小时/>

基本上,这个问题源于这样一个事实:我们典型的“实用”解决方案将在遇到 Number.MAX_SAFE_INTEGER 的 super 边缘情况下崩溃,这是很难测试的。我想知道您可以解决这个问题的一些方法,而不仅仅是以某种方式出错。

最佳答案

But what happens when you run out of integers?

你不会的。曾经。

But if JS can reach 10 million ops per second [it'll take] about 30 years.

没什么可补充的。没有一台计算机能够在同一个程序上运行 30 年。同样,在这个非常人为的示例中,您只生成 ids。在实际计算中,您可能会花费 1/10000 的时间来生成 ids,因此 30 年变成了 300000 年。

how can you solve this problem of generating the incremented integers such that if you got up to Number.MAX_SAFE_INTEGER, you would cycle back from the beginning,

如果你“从头开始循环”,它们将不再是“增量”。无法满足您的一项要求。

If you parallelized the generation of the IDs, then you could more realistically (more quickly) run out of the incremented integers.

没有。为了使 id 严格递增,您必须在这些并行代理之间共享一个计数器。而且对共享内存的访问只能通过同步来实现,因此根本不会更快。

如果您仍然认为您将用完 52 位,请使用 BigInts。或符号,具体取决于您的用例。

关于javascript - 如何一般性地解决在 JavaScript 中生成增量整数 ID 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57670010/

相关文章:

javascript - 我多久可以重命名一次不和谐 channel 的名称?

python - 不要每次迭代都检查变量

c# - .NET MongoDB 连接的最佳实践?

c++ - std::string 上下文中首字母缩写词 SSO 的含义

javascript - n+Math.random() 总是小于 n+1 吗?

javascript - 如何从客户端 View 中定位语法错误的错误

javascript - 使用 JQuery/JavaScript 导致内存泄漏的常见方法有哪些?

javascript - 如何改进或减少此 JavaScript 的冗余?

python - 如何加速从具有位置 (X, Y) 和强度的点创建图像?

python - 将 Keras 与 Spearmint 集成的问题