整数列表的基本操作

时间:2019-12-13 22:10:30

标签: flutter dart

我有一个整数列表:

var times = [
  1573613134,
  1573623934,
  1573631134,
  1573659934,
  1573746334,
  1573731934,
  1573764334,
  1573789534,
  1573847134,
  1573933534,
  1573893934,
  1573980334,
  1574153134,
  1574178334
];

我想看看此列表中的值是否小于指定的整数。

var staticTime = [1573764334];

简单但耗时的解决方案是使用for循环并将列表中的每个值与staticTime进行比较。

Dart是否包含用于对值列表运行基本不等式运算的内置方法?

3 个答案:

答案 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

由此可以推断出几件事:

  1. 常规for循环完成最快。
  2. 基于迭代器的“ for-each”循环仅比for循环稍慢。 (慢3.2%)
  3. 基于生成器的where方法是迄今为止最慢的。 (慢276%)
  4. 在给定样本量的情况下,所有三个完成的速度都非常快,特别是考虑到执行时间的很大一部分很可能是由于result调用导致add列表的大小调整和重新分配({ {1}}方法在显示的代码中未明确执行此操作,但确实在内部发生)。

生成器方法(例如wheremapwhere等)之所以良好,是因为它们的便利性而不是它们的速度。就原始性能而言,沼泽标准for循环几乎总是最快的(忽略一些低级语言中可能存在的相当技术性的技巧,其中大多数是Dart无法完成的)。话虽这么说,它花费了一百万个或更多的元素来进行任何尝试,以花费任何可观的时间,而且您在Dart中进行的任何应用都可能无法处理如此大的数据集。对于更合理大小的数据集,以上任何尝试都可能足够快地满足您的目的。

如果您从此答案中学到了什么,希望那是这两件事:

  1. 在您自己对某些模式进行基准测试之前,不要过早地批评它们的性能。 (通常,您的假设可能是错误的。)
  2. 不要担心本来就快的事物的性能。 (程序的其他部分将在此之前成为瓶颈。)

(如果您想自己尝试上述代码,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();