也就是说,如果我需要频繁地对数组进行单个插入操作,那么使用树或跳表数据结构是否更适合?
也就是说,如果我需要频繁地对数组进行单个插入操作,那么使用树或跳表数据结构是否更适合?
您可以考虑是否要使用对象,所有 JavaScript 对象(包括Array
实例)都是具有可选原型的键/值对的(高度优化的)集合。一个实现应该(请注意我没有说“会”)拥有合理的性能哈希算法。(更新:这是在2010年。在2018年,所有重要的JavaScript引擎上对象都高度优化。)
除此之外,splice
的性能在不同的实现(例如供应商)之间可能会有很大差异。这就是为什么“不要过早地进行优化”这一建议适用于多个供应商实现(例如 Web 应用程序)运行的 JavaScript 应用程序比普通编程更为合适的原因之一。保持良好的模块化代码结构,并在出现性能问题时进行处理。
Array
(在JavaScript中,它实际上只是一个有定义顺序和神奇length
属性的map)。 - T.J. Crowdersplice
来完成,但是 splice
的 Array
是否适合这样的任务?如果不是,还有哪些 JS 数据结构可能适合这种情况? - tonix:-)
)! - tonixe in arr
、arr.includes(e)
和e in obj
之间的性能差异,其中obj为{ e: 0, e2: 0, ... }
。以下是测试结果:https://jsben.ch/YIsLr - NoxFly根据在Chrome、Safari和Firefox中进行的测试,以下是一个好的经验法则:将单个值插入到数组的中间大约比将值推送/移动到数组的一端慢一半。(注意:仅测试了大小为10,000的数组。)
http://jsperf.com/splicing-a-single-value
这已经非常快了。因此,不太可能需要实现另一种数据结构来提高性能。
更新:如下面评论中的eBusiness所指出的,在每个splice
、push
和shift
操作中,该测试执行了昂贵的复制操作,这意味着它低估了性能差异。这里有一个经过修订的测试,避免了数组复制,因此应该更准确:http://jsperf.com/splicing-a-single-value/19
移动单个值
// tmp = arr[1][i];
// arr[1].splice(i, 1); // splice is slow in FF
// arr[1].splice(end0_1, 0, tmp);
tmp = arr[1][i];
ii = i;
while (ii<end0_1)
{
arr[1][ii] = arr[1][++ii];
cycles++;
}
arr[1][end0_1] = tmp;