Immutable.js
是一个为 JavaScript 提供不可变集合的库,其灵感来源于 Clojure[脚本] 的不可变数据结构。它由 Facebook 开发。
他们在网站上解释如下:
不可变数据一旦创建就不可以更改,这使应用开发变得简单,不需要保护性复制,带来了先进的存储,以及通过简单逻辑就可以检测变化的技术。 持久化数据提供了一个可变的 API,它不会更新原有的数据,而是产生新的变更后的数据。
本文中我们会讲到在一个常见情形中, immutable.js
比 javascript
会快得多:不修改原数组的情况下向数组添加元素。
在 javascript
中要做这件事情,唯一的方法是先拷贝一个数组,再向其中添加元素。而 immutable.js
的 push
的返回一个添加了新元素的新列表;而且,这非常快。
首先,在浏览器中加载 immutable.js
:
Object.keys(Immutable)
这里有一个计算代码执行时间的 benchmark
函数:
function benchmark(iterations, f) {
var start = new Date();
for (var i = 0; i < iterations; i++) {
f();
}
var end = new Date();
return "Elapsed time: " + (end - start) + " msec";
}
benchmark(1000000, function() {});
顺便提一下,你能看到 javascript
函数调用机制超级快。
这个页面中所有代码片段均由klipse 插件提供对环境和交互的支持。
现在我们比较一下性能:
javascript
数组,与创建一个不可变列表之间的对比
javascript
数组中插入元素,与向 immutable.js
列表中插入元素的对比
创建大小为 100000
的 javascipt
数组几乎不花时间:
benchmark(1, function() {
var jsArr = [];
jsArr[100000] = 42;
});
而创建大小为 100000
的 immutable.js
列表花了一点时间:
benchmark(1, function() {
immutableList = Immutable.Range(0,100000).toList();
})
使用 slice
和 push
来操作 javascript
数组代价很高
var jsArr = [];
jsArr[100000] = 42;
benchmark(100, function() {
jsArr.slice(0).push(43);
})
说明:
slice(0)
等价于拷贝整个数组
push
会修改调用它个方法的数组
myArr = []; myArr.push(42); myArr.push(43); myArr
向 immutable
列表中添加元素非常快:
immutableList = Immutable.Range(0, 100000).toList();
benchmark(100, function() {
immutableList.push(43);
})
如果你看到花费的时间是 0msec
,请相信这不是一个BUG:它真地很快。增加到10倍的迭代次数来看看效果。
在我的计算机上,
immutable.js
的push
比原生javascript
的push
快约 100 倍。
注意,在往 immutable.js
列表中添加元素时,列表本身并未改变。返回的是一个添加了元素的新列表:不可变集合就是这么运作的。
myList = Immutable.Range(0, 10).toList();
myList.push(42);
myList.size
往期精选文章 |
---|
使用虚拟dom和JavaScript构建完全响应式的UI框架 |
扩展 Vue 组件 |
使用Three.js制作酷炫无比的无穷隧道特效 |
一个治愈JavaScript疲劳的学习计划 |
全栈工程师技能大全 |
WEB前端性能优化常见方法 |
一小时内搭建一个全栈Web应用框架 |
干货:CSS 专业技巧 |
四步实现React页面过渡动画效果 |
让你分分钟理解 JavaScript 闭包 |
小手一抖,资料全有。长按二维码关注京程一灯,阅读更多技术文章和业界动态。