Mixin 真的会减慢编译时间吗?

问题描述 投票:0回答:1

之前处理过mixin,但将其添加到现有代码后,我感觉编译时间变慢了。

现在,我正在阅读一篇文章,其中提到了以下内容:

mixin 的缺点

Mixins 是一种有用的技术,但并不是万能药。有一些明显的缺点:

  • 运行时语句的执行往往会在不同的地方跳转 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 是否真的会减慢应用程序的速度,从而导致避免使用它们,以及何时使用它们。

flutter dart oop mixins software-design
1个回答
0
投票

这个回复解决了这个问题:“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
不会影响性能。

© www.soinside.com 2019 - 2024. All rights reserved.