Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中通用地解决生成增量整数ID的问题_Javascript_Performance_Optimization_Integer - Fatal编程技术网

如何在JavaScript中通用地解决生成增量整数ID的问题

如何在JavaScript中通用地解决生成增量整数ID的问题,javascript,performance,optimization,integer,Javascript,Performance,Optimization,Integer,我已经思考了几天,试图看看是否有一种通用的方法来编写这个函数,这样你就不必担心它会再次崩溃。也就是说,它尽可能健壮,并且可以支持高效地使用所有内存(在JavaScript中) 所以问题是关于一件基本的事情。通常情况下,在JavaScript中创建特定类型的对象时,您可能会给它们一个ID。在浏览器中,例如对于虚拟DOM元素,您可能只给它们一个全局唯一ID(GUID),并将其设置为递增整数 GUID = 1 let a = createNode() // { id: 1 } let b = cre

我已经思考了几天,试图看看是否有一种通用的方法来编写这个函数,这样你就不必担心它会再次崩溃。也就是说,它尽可能健壮,并且可以支持高效地使用所有内存(在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\u SAFE\u整数==2⁵³-1。这显然是一个非常大的数字:
9007199254740991
10亿美元。几十亿。但若JS能达到每秒1000万次的运算,比如说以一种权宜之计,那个么达到这个数字大约需要
900719925s
,或者10416天,或者大约30年。所以在这种情况下,如果你让你的计算机运行30年,它最终会用完递增的ID。这将是一个很难找到的错误

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

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

但我的问题是,作为一个理论练习,如何解决生成递增整数的问题,这样,如果你达到
Number.MAX\u SAFE\u INTEGER
,你就可以从一开始就循环回去,而不使用你已经“活的和绑定的”可能的数十亿(或几百万)整数。您需要使用什么样的方案才能使它成为一个简单的整数循环,并且始终知道您有一个可用的自由整数

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

整体上最快的是Chrome11(每十亿次迭代不到2秒,或者每次迭代最多4个CPU周期);最慢的是IE8(大约每十亿次迭代55秒,或者每次迭代超过100个CPU周期)


基本上,这个问题源于这样一个事实,即我们典型的“实用”解决方案将在超级边缘的情况下遇到
Number.MAX\u SAFE\u INTEGER
,这是很难测试的。我想知道一些方法,你可以解决这个问题,而不只是以某种方式出错

但是当整数用完时会发生什么呢

你不会的。永远

但是,如果JS能够达到每秒1000万次的运算速度(这将需要)大约30年

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

如何解决生成递增整数的问题,这样如果达到Number.MAX\u SAFE\u INTEGER,就可以从头开始循环

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

如果将ID的生成并行化,则可以更实际(更快)地用完递增的整数

不可以。要使ID严格递增,您必须在这些并行代理之间共享一个计数器。而对共享内存的访问只能通过同步来实现,所以不会更快

如果您仍然认为将耗尽52位,请使用bigint。或符号,取决于您的用例

但是当整数用完时会发生什么呢

你不会的。永远

但是,如果JS能够达到每秒1000万次的运算速度(这将需要)大约30年

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

如何解决生成递增整数的问题,这样如果达到Number.MAX\u SAFE\u INTEGER,就可以从头开始循环

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

如果将ID的生成并行化,则可以更实际(更快)地用完递增的整数

不可以。要使ID严格递增,您必须在这些并行代理之间共享一个计数器。而对共享内存的访问只能通过同步来实现,所以不会更快


如果您仍然认为将耗尽52位,请使用bigint。或者符号,这取决于您的用例。

为什么不只使用guid呢?碰撞的几率远远低于天文数字。因为对于粒子系统和高强度游戏来说,guid的生成速度比增量id慢。啊,明白了。我不确定是否存在此限制。我会使用字符串而不是数字。@一定的性能会将问题推到更大的范围。为什么不使用GUID呢?碰撞的几率远远低于天文数字。因为对于粒子系统和高强度游戏来说,guid的生成速度比增量id慢。啊,明白了。我不确定是否存在此限制。我会使用字符串而不是数字。@某些性能只会将问题推到更大的范围内。但仍然无法解决问题,它会将问题推到更大的值上。我想知道如何解决这个问题,但它一直困扰着我:)你试图用更高级的语言解决一个低级的不存在的问题。答案是你不能。接受这一点。或者至少,这毫无意义。仍然如此