Dart属性结果需要缓存吗?

时间:2017-08-31 05:27:56

标签: dart flutter micro-optimization

我是否需要在发布flutter VM中缓存Dart属性结果以获得最佳性能?

它的dartpad,缓存将提高性能。

class Piggybank {
  List<num> moneys = [];
  Piggybank();

  save(num amt) {
    moneys.add(amt);
  }

  num get total {
    print('counting...');
    return moneys.reduce((x, y) => x + y);
  }

  String get whoAmI {
    return total < 10 ? 'poor' : total < 10000 ? 'ok' : 'rich';
  }

  String get uberWhoAmI {
    num _total = total;
    return _total < 10 ? 'poor' : _total < 10000 ? 'ok' : 'rich';
  }
}

void main() {
  var bank = new Piggybank();
  new List<num>.generate(10000, (i) => i + 1.0)..forEach((x) => bank.save(x));
  print('Me? ${bank.whoAmI}');
  print('Me cool? ${bank.uberWhoAmI}');
}

结果

counting...
counting...
Me? rich
counting...
Me cool? rich

属性方法是无副作用。

1 个答案:

答案 0 :(得分:4)

这完全取决于计算的成本以及从财产中请求结果的频率。

如果你真的想要缓存

,Dart有很好的缓存语法
  num _total;
  num get total {
    print('counting...');
    return _total ??= moneys.reduce((x, y) => x + y);
  }

  String _whoAmI;
  String get whoAmI =>
    _whoAmI ??= total < 10 ? 'poor' : total < 10000 ? 'ok' : 'rich';


  String _uberWhoAmI;
  String get uberWhoAmI =>
    _uberWhoAmI ??= total < 10 ? 'poor' : _total < 10000 ? 'ok' : 'rich';

要重置缓存,因为结果所依赖的某些值已更改,只需将其设置为null

  save(num amt) {
    moneys.add(amt);
    _total = null;
    _whoAmI = null;
    _uberWhoAmI = null;
  }

,下次访问属性时,将重新计算值。