Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环与if语句的效率_Javascript_Arrays_Node.js_Time Complexity - Fatal编程技术网

Javascript 循环与if语句的效率

Javascript 循环与if语句的效率,javascript,arrays,node.js,time-complexity,Javascript,Arrays,Node.js,Time Complexity,我有一个用例,我想看看一组数据是否匹配一个非常小的条件列表(为了便于论证,假设它小于20) 我正在客户端和服务器端(NodeJS)上执行JavaScript。我试图在两个选项(或任何其他选项)之间进行选择,但不确定复杂性和计算时间会有多大不同。我觉得它们微不足道 选项1:迭代条件列表 var conditions = [{ prop: 'a', check: '===', val: 'foo' }, { prop: 'b', check: '!==', val: 'bar' }];

我有一个用例,我想看看一组数据是否匹配一个非常小的条件列表(为了便于论证,假设它小于20)

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

选项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 === '!==') {
    ...
  }
}

选项1在O(n)中执行,而选项2是O(1),从技术上讲,但这对一个小的列表是否真的很重要,特别是当您考虑执行<代码> JSON.EVAL(<)>代码>,或者为该帐户提供唯一代码时?

首先,代码> EVA/COD> > <强>坏< /强>(大多数次)。 所有这些if条件下的代码看起来都很难看,但从性能角度看,如果不满足这些条件,其中的代码将无法运行。因此,最终需要更长的时间来解析,而不是运行它

如果您的迭代计数很低,那么使用第一个示例时的性能应该不会有问题

当你想要精确测量时间使用情况时,你可以编写一个测试。

一般来说,“编译”你的条件列表要比“解释”它们快得多,如果这真的很重要的话;您需要对其进行基准测试,以确定其是否符合要求。您可以使用
eval
或使用
函数
构造函数“编译”。然而,只有在真正需要时才应该采取这种方法,这应该是一种罕见的情况

但我不知道你为什么要发明这种用于检查的小语言;所谓“语言”,我指的是形式为
{prop:'a',check:'=',val:'foo'}
。你必须写那些东西;然后您必须在运行时“解析”它们;然后您必须在运行时执行它们。JavaScript已经有了一个很好的方法来封装这些功能;它们被称为“函数”。在其他优点中,如果调用足够的次数,引擎可以优化这些函数

解决问题的基于函数的方法是:

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
    }
    ...
  }
}

无论您如何编写,性能基本上都是
O(n)
。正在进行的比较/测试的数量不变。问题是执行这些测试的速度,而不是大订单。

分析它。其他一切都是巫毒优化。也许,你不应该试图发明一种基于对象属性的表达式语言。取而代之的是使用泛型函数来处理JavaScript中已经定义好的操作符<代码>条件是用户提供的条件列表,因此我需要一种基于未知输入评估数据的方法。我尝试过Javascript编译、迭代列表,甚至在数据库服务器上运行用户定义的函数。试图找到一个既高效又可扩展到上千个客户端(自定义
条件
数组)的解决方案。
条件
是用户定义的一组条件,因此我无法按描述编译它们。问题是您指的是相对或绝对意义上的“可忽略不计”。相对而言,会有很大的不同。就绝对值而言,可能不是。
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))