微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

三元运算符 vs [collection if].first 性能?

如何解决三元运算符 vs [collection if].first 性能?

使用此语法的任何性能优势:

ColoredBox(
    color: isValid ? Colors.green : Colors.red,);

而不是这个?

ColoredBox(
    color: <Color>[
        if(isValid) Colors.green
        else Colors.red
    ].first,);

第二个对我来说更易读和干净,使用它有什么性能上的缺点吗?

编辑:

我认为第一个例子没有阐明我的想法,这个例子可以。

DecoratedBox(
      decoration: Boxdecoration(

        borderRadius: (isOpened && isFav)
            ? BorderRadius.circular(30)
            : (isOpened && !isFav && isClicked
                ? BorderRadius.circular(10)
                : BorderRadius.circular(0)),borderRadius: <BorderRadius>[
          if(isOpened && isFav)
            BorderRadius.circular(30)
          else if(isOpened && !isFav && !isClicked)
            BorderRadius.circular(10)
          else 
            BorderRadius.circular(0)
        ].first
      ),);

编辑 2:

我做了一些快速测试来检查哪个更快,结果如下:

测试1: 三元运算符分数:19ms, 收集如果得分:5ms

测试2: 三元运算符分数:22ms, 收集 if score : 7ms

测试源代码

import "dart:math";

int ternaryOperatorscore,collectionIfscore;

void main() {
  test1();
  test2();
}

void test1() {
  int tStartTimeInMs = DateTime.Now().millisecondsSinceEpoch;
  int _;
  for (int i = 0; i < pow(10,5); i++) {
    _ = [if (i.isOdd) 0 else 1].first;
  }
  ternaryOperatorscore = DateTime.Now().millisecondsSinceEpoch - tStartTimeInMs;

  int cStartTimeInMs = DateTime.Now().millisecondsSinceEpoch;
  for (int i = 0; i < pow(10,5); i++) {
    _ = i.isOdd ? 0 : 1;
  }
  collectionIfscore = DateTime.Now().millisecondsSinceEpoch - cStartTimeInMs;

  printTestResult(1);
}

void test2() {
  int tStartTimeInMs = DateTime.Now().millisecondsSinceEpoch;
  List<int> _list = [];
  for (int i = 0; i < pow(10,5); i++) {
    _list.add([if (i.isOdd) 0 else 1].first);
  }
  ternaryOperatorscore = DateTime.Now().millisecondsSinceEpoch - tStartTimeInMs;

  int cStartTimeInMs = DateTime.Now().millisecondsSinceEpoch;
  for (int i = 0; i < pow(10,5); i++) {
    _list.add(i.isOdd ? 0 : 1);
  }
  collectionIfscore = DateTime.Now().millisecondsSinceEpoch - cStartTimeInMs;

  printTestResult(2);
}

void printTestResult(n) {
  print(""" test $n :
       ternary operator score : ${ternaryOperatorscore}ms,collection if score : ${collectionIfscore}ms \n""");
}

解决方法

这两个选项之间的性能差异如此之小,以至于您只能选择一个并继续使用。举个例子,如果你运行 10 亿次三元/if-else,你可能会注意到一些 MS 差异(在这种情况下,三元可能更快 - 0.0001 毫秒,甚至可能比这少得多)。 据我所知,这在很多语言中都是一样的。 选择一个对每个人来说都更易读的。

从你的例子来看,第一个例子看起来对每个人来说都更清晰/更容易阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。