【发布时间】:2019-11-25 09:32:00
【问题描述】:
import { of, from, asyncScheduler } from 'rxjs';
import { map, filter } from 'rxjs/operators';
let arr = [];
console.log("A");
console.log(new Date());
for(let i = 0; i < 10000000; i++){
arr.push(i);
}
console.log("B");
console.log(new Date());
let arr2 = arr.filter(x => x%2 === 0)
.map(x => x * 3)
.map(x => x * 3)
.map(x => x * 3);
console.log("C");
console.log(new Date());
console.log(arr2.length);
const source = from(arr).pipe(
filter(x => x%2 === 0),
map(x => x * 3),
map(x => x * 3),
map(x => x * 3)
);
console.log("D");
console.log(new Date());
let arr3 = [];
source.subscribe(x => arr3.push(x),
x => {},
() => { console.log("E");console.log(new Date()); }
);
console.log("F");
console.log(new Date());
console.log(arr3.length);
这是我的测试代码。
我测试了 RxJS 运算符和 Javascript 数组方法之间的数组过滤器和映射性能。
对于 10,000,000 大小的数组,我做了 1 个过滤器和 3 个映射。
JS 方法大约需要 3 秒(控制台日志 B 和 C 之间的时间间隔),
但是 RxJS 需要不到 1 秒(控制台日志 D 和 E 之间的时间间隔)
当我检查 100 大小的数组时,JS 显然更快,但对于大数组,RxJS 更快。
我想知道 RxJS 如何比原生 JS 实现更快。请帮帮我。
【问题讨论】:
-
我想这是因为 RxJS 在整个操作链上使用惰性求值,而普通 JS 将对
.filter进行一次完整的遍历,然后对.map调用进行另外三次完整的遍历。跨度>
标签: javascript arrays rxjs