我有一个整数列表:
var times = [
1573613134,
1573623934,
1573631134,
1573659934,
1573746334,
1573731934,
1573764334,
1573789534,
1573847134,
1573933534,
1573893934,
1573980334,
1574153134,
1574178334
];
我想看看此列表中的值是否小于指定的整数。
var staticTime = [1573764334];
简单但耗时的解决方案是使用for循环并将列表中的每个值与staticTime
进行比较。
Dart是否包含用于对值列表运行基本不等式运算的内置方法?
答案 0 :(得分:2)
您是否尝试过不同的方法来比较它们的速度?答案可能会让您感到惊讶。以此快速基准为例:
final values = <some list of numbers with values ranging from 0 to 1000000>;
void withForLoop() {
final start = DateTime.now();
final results = <int>[];
for (int i = 0; i < values.length; i++) {
if (values[i] < 500000) {
results.add(i);
}
}
final end = DateTime.now();
print('withForLoop method duration: ${end.difference(start)}');
}
void withForEachLoop() {
final start = DateTime.now();
final results = <int>[];
for (int v in values) {
if (v < 500000) {
results.add(v);
}
}
final end = DateTime.now();
print('withForEachLoop method duration: ${end.difference(start)}');
}
void withWhere() {
final start = DateTime.now();
final results = values.where((i) => i < 500000).toList();
final end = DateTime.now();
print('withWhere method duration: ${end.difference(start)}');
}
在value
中使用长度为1,000,000的脚本运行此脚本,这在我的计算机上出现了以下情况:
withForLoop method duration: 0:00:00.125000
withForEachLoop method duration: 0:00:00.129000
withWhere method duration: 0:00:00.470000
由此可以推断出几件事:
where
方法是迄今为止最慢的。 (慢276%)result
调用导致add
列表的大小调整和重新分配({ {1}}方法在显示的代码中未明确执行此操作,但确实在内部发生)。生成器方法(例如where
,map
,where
等)之所以良好,是因为它们的便利性而不是它们的速度。就原始性能而言,沼泽标准for循环几乎总是最快的(忽略一些低级语言中可能存在的相当技术性的技巧,其中大多数是Dart无法完成的)。话虽这么说,它花费了一百万个或更多的元素来进行任何尝试,以花费任何可观的时间,而且您在Dart中进行的任何应用都可能无法处理如此大的数据集。对于更合理大小的数据集,以上任何尝试都可能足够快地满足您的目的。
如果您从此答案中学到了什么,希望那是这两件事:
(如果您想自己尝试上述代码,try it out in DartPad。)
答案 1 :(得分:0)
有内置的every()
函数。
var allSmaller = times.every((time) => time > staticTime);
答案 2 :(得分:0)
如果您想知道是否有任何小于staticTime的值,请使用:
bool hasAnySmaller = times.any((time)=> time<staticTime);
如果要使整数列表小于staticTime,请使用:
List<int> allSmaller = times.where((time)=>time<staticTime).toList();