问题描述
使用此语法的任何性能优势:
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 毫秒,甚至可能比这少得多)。 据我所知,这在很多语言中都是一样的。 选择一个对每个人来说都更易读的。
从你的例子来看,第一个例子看起来对每个人来说都更清晰/更容易阅读。