Benchmark rozšírení Swift verzus metódy: Swift 4.1 (máj 2018)

Interaktívne tabuľky sú k dispozícii tu: http://minikin.me/extensions

‍ Motivácia

Pred niekoľkými týždňami som mal diskusiu s programátorom iOS, ktorý má veľa silných názorov. Jeden z nich znie takto: „Používanie rozšírení Swift je veľmi zlá prax, pretože časy kompilácie dramaticky zvyšujú a znižujú čitateľnosť a zrozumiteľnosť kódu“. Nebudem posudzovať čitateľnosť a jasnosť. To sú preferencie osobného štýlu, bol som však dosť zamieňaný s argumentom o čase kompilácie. Spomínam si, že o tejto téme sa viedlo pred tromi alebo viacerými rokmi. Tri roky pre Swift, to mi znie, ako pre ľudí 50 rokov. Bol som si celkom istý, že situácia nie je taká zlá, ako si táto osoba myslí, pretože viem, že tím Swift neustále zdokonaľuje jazyk, vrátane kompilácie. Nie som taký človek, ktorý sa bude hádať bez toho, aby mal presvedčivé argumenty.

Benchmarking

Minulý víkend som mal niekoľko hodín na skontrolovanie jeho výpovede. Napísal som rubínový skript na kontrolu výkonnosti rozšírení verzus metódy. Prístup, ktorý som si vybral, je pomerne jednoduchý, pravdepodobne dokonca naivný, ale napriek tomu by som rád videl nejaké výsledky. Overil som tieto prípady:

  • Metódy triedy +
  • Rozšírenia triedy +
  • Metódy Struct +
  • Struct + Extensions

Ruby skript vytvára n počet funkcií pre každý prípad (napríklad n = 3):

Metódy triedy +

trieda MyClass {
    nech n = 1000
    func method_1 () {
      pre položku v 0 .. 

Rozšírenia triedy +

trieda MyClass {
    nech n = 1000
    func method_1 () {
      pre položku v 0 .. 

Tiež som chcel vedieť odpoveď na otázku: Koľko rozšírení je v aplikáciách Swift v reálnom svete? Overil som najpopulárnejšie aplikácie s otvoreným zdrojom napísané v aplikácii Swift a niekoľko aplikácií, ktoré sme vyvinuli v našej spoločnosti pre klientov, pre niekoľko rozšírení.

Na spustenie testov nastavte v Rakefile USE_EXTENSIONS na true alebo false.

Spustiť testy:

porovnávací ukazovateľ

Výsledky testov na vyčistenie:

hrable čistý

Výsledky

Pokiaľ ide o reprezentáciu zozbieraných údajov jasným a zmysluplným spôsobom, moje znalosti v oblasti údajov boli dosť užitočné. Vytvoril som python skript main.py, ktorý generuje grafy s bokehom.

Interaktívne tabuľky sú k dispozícii tu: http://minikin.me/extensions

Testovacie prostredie: macOS 10.13.4, Swift 4.1, 2016 MacBook Pro, 2,6 GHz Intel Core i7, 16 GB 2133 MHz LPDDR3

Clusions Závery

V priemere je použitie metodického prístupu medzi -6% - 70% tak rýchle ako ekvivalentná implementácia s rozšíreniami.

Znamená to však, že by sme nemali používať rozšírenia? Pravdepodobne nie.
V skutočných aplikáciách počet rozšírení zriedka dosiahne 1 000, a ak áno, rozdiel je asi 20%.

Iste, v reálnej aplikácii budeme mať rôzne výsledky, ale pri meraní v absolútnom časovom rozdiele je pravdepodobné, že úspory nebudú vo väčšine prípadov znateľné.

Ak chcete experimentovať, môžete skontrolovať repo na GitHub.

V prípade akýchkoľvek otázok ma neváhajte kontaktovať: @minikin

Aktualizácia 1 (03.06.2018):

Yarik Arsenkin ma požiadal, aby som pridal referenčnú hodnotu pre prípady triedy + súkromné ​​funkcie v rozšírení verzus triedy + súkromné ​​metódy. Skontrolujte aktualizované tabuľky a výsledky.