Swifti laiendite ja meetodite võrdlusalus: Swift 4.1 (mai 2018)

Interaktiivsed diagrammid on saadaval siin: http://minikin.me/extensions

‍ Motivatsioon

Mõni nädal tagasi oli mul vestlus iOS-i programmeerijaga, kellel on palju tugevaid veendumusi. Üks neist kõlab järgmiselt: „Swifti laiendite kasutamine on väga halb tava, kuna kompileerimise ajad on dramaatiliselt suurenenud ning see vähendab loetavust ja koodi selgust. Ma ei hakka loetavuse ja selguse üle otsustama. Need on isiklikud stiilieelistused, kuid olin segamini argumendiga kompileerimise aja kohta. Ma mäletan, et kolm või enam aastat tagasi arutati seda teemat. Kolm aastat Swifti jaoks kõlab mulle nagu 50 aastat inimkonnale. Olin üsna kindel, et olukord pole nii halb, kui see inimene arvab, sest tean, et Swifti meeskond parandab pidevalt keelt, sealhulgas kompileerimise aega. Ma ei ole selline inimene, kes vaidleb ilma kindlate argumentideta.

Võrdlusuuringud

Eelmisel nädalavahetusel oli mul paar tundi vaba tema avalduse kontrollimiseks. Kirjutasin rubiini skripti, et kontrollida laiendite ja meetodite toimivust. Minu valitud lähenemisviis on üsna lihtne, tõenäoliselt isegi naiivne, kuid igatahes tahaksin näha mingeid tulemusi. Kontrollisin järgmisi juhtumeid:

  • Klass + meetodid
  • Klass + laiendused
  • Struct + meetodid
  • Struct + laiendid

Ruby-skript loob iga juhtumi jaoks n arvu funktsiooni (näites n = 3):

Klass + meetodid

klass MyClass {
    laske n = 1000
    func method_1 () {
      kirje jaoks 0 .. 

Klass + laiendused

klass MyClass {
    laske n = 1000
    func method_1 () {
      kirje jaoks 0 .. 

Samuti soovisin teada vastust küsimusele: mitu laiendit on reaalainete Swifti rakendustes? Kontrollisin kõige populaarsemaid Swiftis kirjutatud avatud rakendusi ja väheseid rakendusi, mille me oma ettevõttes klientidele välja töötasime, mitmete laienduste jaoks.

Testide tegemiseks seadke Rakefile'is USE_EXTENSIONS väärtuseks tõene või vale.

Käivitage testid:

reha etalon

Puhastustestide tulemused:

reha puhtaks

Tulemused

Kui asi puudutas kogutud andmete selget ja tähenduslikku esindamist, olid minu andmetöötlusoskused üsna kasulikud. Koostasin pythoni skripti main.py, mis genereerib bokehi graafikuid.

Interaktiivsed diagrammid on saadaval siin: http://minikin.me/extensions

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

Järeldused

Keskmiselt on meetodite kasutamise lähenemine vahemikus -6% - 70% sama kiire kui samaväärne rakendamine laiendustega.

Kuid kas see tähendab, et me ei peaks laiendeid kasutama? Ilmselt mitte.
Pärisrakendustes ulatub laiendite arv harva 1000-ni ja kui nad seda teevad, on erinevus umbes 20%.

Muidugi, reaalse rakenduse korral on meil erinevad tulemused, kuid absoluutse ajavahena mõõdetuna pole kokkuhoid tõenäoliselt enamikus olukordades märgatav.

Kui soovite katsetada, saate vaadata repot GitHubis.

Küsimuste korral võtke minuga julgelt ühendust: @minikin

1. värskendus (03.06.2018):

Yarik Arsenkin palus mul lisada võrdlusalus klassi + privaatfunktsioonide jaoks laienduses vs klass + privaatmeetodid. Palun kontrollige värskendatud graafikuid ja tulemusi.