RxJS比命令更快吗?

时间:2016-05-08 21:42:55

标签: javascript functional-programming reactive-programming rxjs

我是功能编程和功能反应式编程的新手。

我多次阅读功能反应式编程的强大功能

奥基;是可读的,避免副作用等。

但是......我不知道如何以功能/反应的方式改进我的代码,以比命令式方式更快地执行。 有可能吗?也许我想念一些东西?因为在我的函数式编程中代码是针对每个任务进行迭代:对于filter,map,reduce ......而且这个问题比较慢。 可以迭代一次吗?也许使用compose()

感谢。

性能测试:势必针对FP与FRP

var array = [];
var i, l;

//INIT ARRAY
for (i = 0; i < 15000; i += 1) {
  array[i] = i;
}

// WITH IMPERATIVE
console.time("IMPERATIVE");
var sum = 0;
var a;
var result = [];
for (i = 0, l = array.length; i < l; i += 1) {
  a = array[i];
  if (a % 2 === 0) {
    result.push(a * 10);
    sum += a * 10;
  }
}
console.log(sum);
console.timeEnd("IMPERATIVE");

// WITH DECLARATIVE: FUNCTIONAL PROGRAMMING
console.time("FUNCTIONAL");
var r = array
  .filter(function(x) {
    return x % 2 === 0
  })
  .map(function(x) {
    return x * 10
  })
  .reduce(function(x, y) {
    return x + y
  })

console.log(r);
console.timeEnd("FUNCTIONAL");

//WITH DELARATIVE: FUNCTIONAL REACTIVE PROGRAMMING
console.time("REACTIVE")
Rx.Observable
  .fromArray(array)
  .filter(function(x) {
    return x % 2 === 0
  })
  .map(function(x) {
    return x * 10
  })
  .reduce(function(x, y) {
    return x + y
  })
  .subscribe(function(x) {
    console.log(x)
  });
console.timeEnd("REACTIVE");
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>

输出:

Output

1 个答案:

答案 0 :(得分:11)

  

功能反应式编程的强大功能

在我看来,

与速度和性能无关。这里有两件事,功能编程和反应式编程,上述编程范例的好处都与执行速度无关。

在极端情况下,如果您想要最佳的执行速度,那么您所针对的特定处理器/体系结构的汇编语言将无法被打败。那么C就是那些接近处理器级别的语言非常高效,一般来说编译语言(因为它们将你的代码转换为汇编语言)比解释语言更高效。

因此,选择函数式编程与命令式编程的合理性不是一个单一的标准选择。其他标准是:

  • 程序员的工作效率。这包括编写代码的时间,还包括审查和理解代码,检测和消除错误,扩展代码功能(可操作性和可扩展性)的时间。
  • 质量保证。一些范例可以更好地确保他们专门针对某些类型的错误的普遍存在,并且这些错误构成了分心和质量损失的主要来源。在那里你必须引入另一种区别,即静态类型与动态类型语言。有些语言专门处理并发问题(并发访问共享状态),其他语言专门用于分析系统问题(容错)等,并专注于减少与这些问题相关的错误类型。

我可以充分利用这个和那个的不同优点,但我不想重复计算机科学文献中已经无处不在的东西。 Programming Languages: Principles and Paradigms书很好读,但还有很多其他书。

回到你的问题,用Rxjs写一些东西不一定比命令更快(尽管你的Rxjs代码仍然是命令式代码,但是我们不要提及)尽管它仍然可以在某些情况下。然后,仅对数组上的操作使用rxjs没有多大意义。当存在高级别的异步时,Rxjs(和反应式编程)会发光,这对于数组上的简单操作来说就不存在了。