代码之家  ›  专栏  ›  技术社区  ›  Murhaf Sousli

使用键vs条件语句获取值

  •  1
  • Murhaf Sousli  · 技术社区  · 8 年前

    我试图优化滑块的性能,该滑块有许多在滑动/滑动时执行的条件语句。

    哪种方式性能更好?

    1-使用键条件访问准备好的对象

    const controller = (config) => {
        top: {
          positionVertical: false,
          orderAfter: false,
          width: '100%',
          height: config.height + 'px',
        },
        bottom: {
          positionVertical: false,
          orderAfter: true,
          width: '100%',
          height: config.height + 'px',
        },
        left: {
          positionVertical: true,
          orderAfter: false,
          width: config.width + 'px',
          height: '100%'
        },
        right: {
          positionVertical: true,
          orderAfter: true,
          width: config.width + 'px',
          height: '100%'
        }
    };
    
    this.gallery.sub$.pipe(
      map(({state, config}) => this.controller(config)[config.position])
    );
    

    2-使用标准的if-else或switch case语句

    this.gallery.sub$.pipe(
      map(({state, config}) => {
        switch(config.position) {
           case 'top': return {
             positionVertical: false,
             orderAfter: false,
             width: '100%',
             height: config.height + 'px',
           }
           case 'left': return {
             positionVertical: true,
             orderAfter: false,
             width: config.width + 'px',
             height: '100%'
           }
           case 'right': return {
             positionVertical: true,
             orderAfter: true,
             width: config.width + 'px',
             height: '100%'
           }
           default: return {
             positionVertical: false,
             orderAfter: true,
             width: '100%',
             height: config.height + 'px',
          }
        }
      })
    );
    

    敬请解释

    2 回复  |  直到 8 年前
        1
  •  1
  •   Michael Geary    8 年前

    很可能您永远不会看到这两个版本的代码之间有任何性能差异。根据袁的测试结果,即使滑块中有10000个条目,也不会有任何明显的差异。我假设这些测试是在桌面CPU上进行的,但即使是在移动CPU上,也不会有太大区别。

    这就是说,从第一个原则很容易判断哪个版本可能更快:第二个,只是因为它做的工作更少。袁的测试证明了这一点,在一个有10000000个条目的极端情况下(尽管我还没有查看详细的测试设置)。

    为什么第二个更快?看看第一个。对于每个条目,它执行以下操作:

    1. 计算所有四种情况的所有值,并为每种情况创建一个对象。
    2. 构造一个新的外部对象,其中包含所有四个内部对象。
    3. 根据选择其中一个内部对象 config.position 并丢弃其余部分。

    第二个版本就是这样做的:

    1. 使用 配置。位置 选择要创建的四种对象类型中的哪一种。
    2. 仅构建一个对象,而不构建其他三个对象。
    3. 没有第三步。

    很显然,计算和构造四个不同的对象,再加上一个包装器对象来容纳它们,所需的时间将比仅计算和构造要长 在这些对象中。

    在风格上,我想在第二个版本中改变一件事。这个 default: 案例应为 case 'bottom': 与其余部分相匹配,并使意图更加明确。