Действительно ли миксины замедляют время компиляции?

Раньше имел дело с миксинами, но почувствовал замедление времени компиляции после добавления их в существующий код.

прямо сейчас я читал статью, в которой упоминалось следующее:

Недостатки миксинов

Миксины — полезный метод, но вряд ли панацея. Есть несколько существенных недостатков:

  • Выполнение операторов во время выполнения имеет тенденцию прыгать в разных местах. миксины, что затрудняет отслеживание и отладку
  • Возможность длительного времени компиляции.

Вышеприведенные предложения касаются времени компиляции (говоря о миксинах в целом как принципе). Следующее — об использовании.

предположим, что есть 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');
}

Итак, действительно ли миксины замедляют работу приложения, что приводит к тому, что их следует избегать, и когда их использовать.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этом ответе рассматривается вопрос: «Действительно ли миксины замедляют работу приложения»?

Просто из любопытства я сравнил два подхода. Примечание. Я изменил определения классов, удалив операторы 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 раз для создания выборки оценок. На основе этой выборки рассчитываются среднее значение, стандартное отклонение и т. д.

Получаете ли вы одинаковые результаты при каждом прохождении?

A-E 19.04.2024 16:56

Я добавил свой ответ к сообщению. Вы можете попробовать запустить тесты самостоятельно, чтобы проверить результаты на своем компьютере.

Dan R 19.04.2024 18:14

Спасибо, это отличный ответ согласно средней статистике (измерение производительности для каждого подхода).

A-E 20.04.2024 08:57

Другие вопросы по теме