循环与if语句的效率

我有一个用例,我想知道一组数据是否与一个非常小的条件列表匹配(为了说明起见,假设它小于20)。

我正在客户端和服务器端(NodeJS)上执行JavaScript。 我试图在两个选项(或其他任何你可能拥有的选项)之间进行select,但我不确定复杂性和计算时间会有多不同。 我有一种感觉,他们微不足道。

选项1:重复条件列表

var conditions = [{ prop: 'a', check: '===', val: 'foo' }, { prop: 'b', check: '!==', val: 'bar' }]; for (var i=0;i<conditions.length;i++) { // Check conditions[i] if (conditions[i].check === '===') { if (data[conditions[i].prop] === conditions[i].val) { // Keep checking } else { // Fail } } else if (conditions[i].check === '!==') { ... } } 

选项2:将条件转换为JavaScript

 if (data.a === 'foo' && data.b !== 'bar' && ... ) { // Passes } 

选项1在O(n)中执行,而选项2在技术上是O(1),但是对于这样一个小列表真的很重要,特别是当你考虑执行JSON.eval()和/或为帐户设置唯一的代码?

首先, eval不好的 (大部分时间)。

如果条件不符合条件,代码看起来会很糟糕,但是如果条件不符合的话,那么代码将不能运行。 所以最终需要更长的时间来parsing,而不是运行它。

如果你的迭代计数很低,使用第一个例子时的性能不应该是一个问题。

当你想要精确的时间使用测量,你可以写一个testing。

一般来说,“编制”你的条件清单要比“解释”它们要快得多,如果那真的很重要的话; 你需要基准来找出它是否。 您可以使用eval或使用Function构造eval来“编译”。 但是,只有在真正需要的情况下才应该采取这种做法,这应该是一种罕见的情况。

但我不确定你为什么要发明这个小语言来检查; 通过“语言”,我的意思是forms{prop: 'a', check: '===', val: 'foo'} 。 你必须写这些东西; 那么你必须在运行时“parsing”它们; 那么你必须在运行时执行它们。 JavaScript已经有了一个完美的方法来封装这些function; 他们被称为“function”。 除了其他优点之外,如果调用足够多的时间,则这种function可以通过发动机来优化

基于function的方法来解决你的问题将是写:

 var conditions = [ data => data.a === 'foo', data => data.b !== 'bar' ]; for (var i=0;i<conditions.length;i++) { // Check conditions[i] if (conditions[i](data)) { // Keep checking } else { // Fail } ... } } 

或者更通俗些

 conditions.every(condition => condition(data)) 

不pipe你怎么写这个,性能基本上都是O(n)的条件数。 正在进行的比较/testing的次数不会改变。 问题是执行这些testing的速度,而不是大O的顺序。