之前处理过mixin,但将其添加到现有代码后,我感觉编译时间变慢了。
现在,我正在阅读一篇文章,其中提到了以下内容:
mixin 的缺点
Mixins 是一种有用的技术,但并不是万能药。有一些明显的缺点:
上面几句话是关于编译时间的(一般来说mixins是一个原则),接下来是关于用法。
假设有一个
dog
和 horse
需要运行。
mixin RunMixy{
void run()=>print('running');
}
class Dog with RunMixy{}
class Horse with RunMixy{}
现在,运行功能与这两个类混合在一起,但是还有另一种方法可以通过使用继承或抽象来完成此操作。
abstract class RunningMamal{
void run();
}
class Dog extends RunningMamal{
void run()=>print('running');
}
class Horse extends RunningMamal{
void run()=>print('running');
}
那么,mixin 是否真的会减慢应用程序的速度,从而导致避免使用它们,以及何时使用它们。
这个回复解决了这个问题:“mixin 真的会减慢应用程序的速度吗”?
出于好奇,我对这两种方法进行了基准测试。注意:我通过删除
print
语句更改了您的类定义。这样,基准测试分数应该反映使用 mixins 带来的性能损失。
import 'package:benchmark_runner/benchmark_runner.dart';
abstract class RunningMamal {
void run();
String _state = 'resting';
String get state => _state;
}
class Dog extends RunningMamal {
@override
void run() => _state = 'running';
}
class Horse extends RunningMamal {
@override
void run() => _state = 'running';
}
final dog = Dog();
final horse = Horse();
void main(List<String> args) {
group('Inheritance:', () {
benchmark('horse running', () {
horse.run();
});
benchmark('dog running', () {
dog.run();
});
});
}
import 'package:benchmark_runner/benchmark_runner.dart';
mixin RunMixy {
String _state = 'resting';
void run() => _state = 'running';
String get state => _state;
}
class Dog with RunMixy {}
class Horse with RunMixy {}
final dog = Dog();
final horse = Horse();
void main(List<String> args) {
group('Mixin:', () {
benchmark('horse running', () {
horse.run();
});
benchmark('dog running', () {
dog.run();
});
});
}
这里是基准测试分数(在 Intel Core i5-6260U 上):
$ dart run benchmark_runner
Finding benchmark files...
benchmark/animal_benchmark.dart
benchmark/animal_mixin_benchmark.dart
Running: dart --define=isBenchmarkProcess=true benchmark/animal_benchmark.dart
Inheritance: horse running; mean: 0.093 ± 0.13 us, median: 0.083 ± 0.00 us
sample size: 100 (averaged over 171 runs)
Inheritance: dog running; mean: 0.066 ± 0.00035 us, median: 0.066 ± 0.00 us
sample size: 100 (averaged over 208 runs)
Running: dart --define=isBenchmarkProcess=true benchmark/animal_mixin_benchmark.dart
Mixin: horse running; mean: 0.091 ± 0.094 us, median: 0.083 ± 0.00100 us
sample size: 100 (averaged over 167 runs)
Mixin: dog running; mean: 0.082 ± 0.038 us, median: 0.066 ± 0.00100 us
sample size: 100 (averaged over 201 runs)
------- Summary --------
Total run time: [01s:224ms]
Completed benchmarks: 4.
Completed successfully.
Exiting with code: 0.
结论:至少在这种情况下,基准分数表明使用 Dart
mixins
不会影响性能。