【问题标题】:avoid multiple if-statements when true conditions are rare在很少见的情况下避免使用多个 if 语句
【发布时间】:2021-07-03 18:54:29
【问题描述】:

我想创建一个脚本来比较来自两个不同来源的变量。 我需要将一些值 a1, a2, ..., an 与其他一些值 b1, b2, ..., bn 进行比较。我想知道a1 = b1,a2 = b2,...,an = bn。如果其中一些不相等,我想知道其中哪些不相等。这些变量是整数和字符串。所有对都有相同的可能性相等。

我也知道这些变量不相等的情况极为罕见。事实上,在 1000 对变量中,几乎 1 对变量可能是不相等的。每次我都会为近 20 个变量运行脚本数百次,因此大多数情况下所有对都是相等的。我想知道我是否可以以某种方式利用这个事实。

作为第一种方法,我想的是多个 if 语句。例如:

let equal = true;
let issues = [];

if (a1 !== b1){
   equal = false;
   issues.push("a1!=b1");
}

...

if (a20 !== b20){
   equal = false;
   issues.push("a20!=b20");
}

只要大多数时候不存在不等对,我就想将所有 a1,..,an 变量转换为单个变量 variableA 并将所有 b1,...,bn 转换为变量 @ 987654323@。比较两个变量,只有当它们不相等时,才进行上述过程。如果我的数据被清理(没有 null、未定义、“”等),那么做这样的事情是否有意义?我不确定这是否会减少时间,我认为这可能是一种不好的做法。

let variableA = a1 + a2 + ... + a20;
let variableB = b1 + b2 + ... + b20;
let equal = true;
let issues = [];

if (variableA !== variableB){
   equal = false;

   if (a1 !== b1){
      issues.push("a1!=b1");
   }

    ...

    if (a20 !== b20){
      issues.push("a20!=b20");
    }
}

或者:

if (!((a1===b1) && (a2===b2) && ... && (a20===b20))){ ...

我还考虑将变量存储在数组或对象中并进行比较。我认为将它们存储在对象中可能会更好。我的脚本将用 javascript 编写,尽管我最感兴趣的是方法而不是语言。

不管它们可以以何种方式进行比较,有什么方法可以优化它,因为我知道几乎所有时候我的条件都是错误的?

【问题讨论】:

  • 真的不会有独立于语言的答案。不同的语言和不同的编译器/解释器可能会以非常不同的方式处理看起来相似的代码。

标签: javascript performance if-statement optimization time-complexity


【解决方案1】:

知道我的条件几乎所有时候都是错误的,有什么办法可以优化它?

如果是这种情况,运行时会注意到并进行相应的优化。你没有理由这样做。

此外,尝试通过连接字符串来优化比较是一个非常糟糕的主意,因为连接比您尝试优化的比较更昂贵。此外,比较字符串的成本大致与其长度成正比,因此比较一个长字符串并不比比较多个短字符串快。并且重复比较(首先比较连接,然后是单个字符串)当然比只查看每个字符串一次要慢。

话虽如此,除非该函数非常频繁地执行,否则这无关紧要:现代 JavaScript 运行时每秒可以比较大约 10 亿个字符。通常,您会因此希望通过编写清晰易懂的代码来优化程序员时间而不是运行时性能。

【讨论】:

    【解决方案2】:
    // place variables in 'a' group into ordered array
    a_array = [a1, a2, a3, ..., an]
    
    // place variables in 'b' group into ordered array
    b_array = [b1, b2, b3, ..., bn]
    
    // compare each item in array storing indexes of items which are not equal
    not_equal_indexes = []
    for (i = 0; i < a_array.length; i++) {
        not_equal_indexes.push(i) ? a_array[i] != b_array[i] : ""
    }
    print(not_equal_indexes)
    

    您必须使用在数组中接受多类型元素的运行时(即弱类型语言,如 PHP、Python 或 Javascript)才能工作。

    否则,为每个组和每个组的元素可用的每种数据类型创建一个数组。 for 循环配置应该看起来相同,只是在记住元素的原始索引位置或其原始变量名称方面稍作修改,而不管它在强类型数组组中的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多