Раньше имел дело с миксинами, но почувствовал замедление времени компиляции после добавления их в существующий код.
прямо сейчас я читал статью, в которой упоминалось следующее:
Недостатки миксинов
Миксины — полезный метод, но вряд ли панацея. Есть несколько существенных недостатков:
Вышеприведенные предложения касаются времени компиляции (говоря о миксинах в целом как принципе). Следующее — об использовании.
предположим, что есть 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');
}
Итак, действительно ли миксины замедляют работу приложения, что приводит к тому, что их следует избегать, и когда их использовать.





В этом ответе рассматривается вопрос: «Действительно ли миксины замедляют работу приложения»?
Просто из любопытства я сравнил два подхода. Примечание. Я изменил определения классов, удалив операторы print. Таким образом, результаты тестов должны отражать снижение производительности, связанное с использованием примесей.
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 не влияет на производительность.
Ответ на вопрос ОП: получаете ли вы одинаковые результаты при каждом запуске?
Результаты тестов не будут точно такими же, но будут колебаться примерно в пределах 0,1 мкс. Вот почему статистика результатов может быть полезна.
Просто чтобы уточнить, например, в первом тесте функция horse.run() вызывается в цикле 171 раз. Затем время усредняется и записывается результат. Этот процесс повторяется 100 раз для создания выборки оценок. На основе этой выборки рассчитываются среднее значение, стандартное отклонение и т. д.
Я добавил свой ответ к сообщению. Вы можете попробовать запустить тесты самостоятельно, чтобы проверить результаты на своем компьютере.
Спасибо, это отличный ответ согласно средней статистике (измерение производительности для каждого подхода).
Получаете ли вы одинаковые результаты при каждом прохождении?