Kanavien käyttäminen verrattuna mutexeihin samanaikaisuuden hallintaan liittyy useita suorituskykyvaikutuksia, jotka ovat juurtuneet niiden perustavanlaatuisiin eroihin suunnittelu- ja käyttömallissa.
Go-kanavat ilmentävät viestinpäästötyyliä samanaikaisesti, jossa tiedonomistus siirretään nimenomaisesti lähettämällä ja vastaanottamalla viestejä goroutinien välillä. Kanavat tarjoavat synkronoinnin estämällä lähettäjiä, kunnes vastaanottimet ovat valmiita, tai puskuroimalla viestejä, jos puskuri on olemassa. Tämä malli pakottaa sarjanmuodon datanvaihtojen suhteen, mikä tekee kanavista erittäin ilmaisevana samanaikaisten työnkulkujen mallintamisessa, joihin sisältyy koordinaatio, hajautettu työ tai tapahtumailmoitus.
Mutexes (synkronointipaketista) ovat toisaalta alemman tason primitiivit suojaamaan jaettua muistia, jota useat goroutiinit ovat käyttäneet. Mutexes-koordinaatti pääsy lukitsemalla ja lukitsemalla kriittiset osiot, jolloin käytetään useita lukijoita tai yhden kirjoittajan kerrallaan, jos käytetään lukutapojen mutexia. He vartioivat sisäistä tilaa tehokkaasti minimaalisella yleiskustannuksella, mutta vaativat huolellista huomiota umpikujojen tai kilpailuolosuhteiden välttämiseksi.
Suorituskyvyn kannalta mutexes ylittää yleensä kanavat suojaamalla jaettua muuttuvasta tilasta, koska:
- Mutexes ovat kevyitä ja optimoituja minimaalisiin yläpuolella lukittuihin kriittisiin osiin.
- Mutexien lukko/lukituspolku on erittäin tehokas GO: n ajonaikana.
- Mutexes Vältä ylimääräisiä kopiointi- tai tiedonsiirtoja, jotka ovat luontaisia kanavaviestinnässä.
Kanavat sitä vastoin sisältävät ajonaikataulun yleiskustannukset goroutiinin synkronointiin ja tietojen ohittamiseen. Kun tiedot välitetään kanavien läpi, niihin voi aiheutua kopiointikustannuksia ja kontekstikytkimet tapahtuvat, kun Goroutines estää lähettämistä tai vastaanottamista. Kanavat voivat olla huomattavasti hitaampia kuin mutexit yksinkertaisen jaetun tilan suojelun suhteen, usein useita kertoja hitaammin kiistanalaisesta ja työmäärästä riippuen.
Kanavat kuitenkin loistavat suorituskykyä skenaarioissa, joihin liittyy:
- Useiden goroutinien koordinointi asynkronisesti.
- Työyksiköiden jakaminen luonnollisen omistajuuden siirto -semantiikan kanssa.
- Tapahtumapohjaiset tai putkilinjan arkkitehtuurit, joissa sarjoitettu viestintä parantaa turvallisuutta ja koodin selkeyttä.
Kun mitataan synkronoinnin raa'an läpäisyn yksinkertaisten jaettujen muuttujien kanssa, vertailuarvot osoittavat jatkuvasti mutexien olevan useita kertoja nopeampia kuin kanavat, koska niiden osuuskunnallinen lukitusmenetelmä puuttuu pakotettua tiedonvaihto -semantiikkaa.
Sisäinen toteutus eroaa myös: Go -kanavat käyttävät futex -muotoa ja sisältävät monimutkaisemman synkronointilogiikan odotusjonoilla ja signaloinnilla goroutiinien välillä, kun taas mutexes ovat yksinkertaisempia lukitusprivativeja, joilla on nopea polku asettamattomille skenaarioille.
Niiden välillä valitaan samanaikaisuuden luonne:
- Käytä mutexeja jaetun muistin kriittisten osien vartioimiseksi, jotka vaativat nopeaa, usein pääsyä.
- Mieluummin kanavia, kun joudut koordinoimaan asynkronisia työnkulkuja tai siirrettävä omistajuus turvallisesti goroutinien välillä.
Tietosuojakanavien liiallinen käyttö voi johtaa monimutkaisisiin ja tehottomiin malleihin, kun taas mutexit voivat joskus lisätä monimutkaisuutta lukitussääntöjen muuttuessa liian monimutkaisiksi, jolloin kanavat voivat yksinkertaistaa päättelyä.
Yhteenvetona voidaan todeta, että ensisijainen suorituskyky on se, että mutexit tarjoavat tyypillisesti ylivoimaisen raakatehokkuuden jaetun tilan suojaamiseksi kiistanalaisina, kun taas kanavat tarjoavat turvallisempia ja ilmaisullisempia, mutta mahdollisesti hitaampia keinoja samanaikaisuuden orkesterointiin viestinnän kautta. Tämä kompromissi vaikuttaa GO -sovellusten läpäisy-, latenssiin ja skaalautuvuuteen.
Yksityiskohtaisemmat kohdat:
-Hieman mutex-lukitus/lukitus on lähes nolla yleiskustannus, joka suoritetaan usein käyttäjä-avaruudessa ilman ytimen osallistumista, tarjoamalla erinomaisen suorituskyvyn alhaisten kiistojen työmäärään.
- Suuren väitteen alla mutexit saattavat kärsiä lukitusnauhoista, mutta silti usein ylittää kanavat, koska kanavat indusoivat goroutiinien estämistä ja herättämistä useammin.
- Kanavat lisäävät yleiskustannuksia semantiikan ja aikataulutuskustannusten estämisen vuoksi, ja puskurikoot voivat vaikuttaa läpäisyyn ja viiveeseen.
- Mutexit suojaavat kriittisten osien lukitsemisella; Kanavat, jotka ovat pakko sarjoita viestintä, joka voi vaikuttaa samanaikaiseen läpimenoon työmäärän kuvioista riippuen.
- Kanavat toteuttavat synkronoinnin kaksoislaskenta -semaforeina puskuroitujen jonojen kanssa sisäisesti, mikä tekee niistä raskaita kuin mutexes.
- Kanavat ovat idiomaattisesti suositeltavia Go-koordinaatiossa, jossa goroutiinit kommunikoivat luonnollisesti, mutta mutexit ovat edullisia, kun tarvitaan yksinkertaisempia, korkean suorituskyvyn lukon suojausta.
Käytännöllisissä sovelluksissa kanavien käyttöpäätös verrattuna mutexeihin riippuu paitsi raa'asta suorituskyvystä myös koodin selkeydestä, oikeellisuudesta ja samanaikaisuuden mallin soveltuvuudesta ongelma -alueelle. Vertailuanalyysi realistisilla työmäärillä on ratkaisevan tärkeää tietoisen valinnan tekemiseksi.
Lopuksi, RWMUTEX-variantit voivat tarjota parannettua suorituskykyä raskaissa työmäärissä kanaviin verrattuna, koska samanaikaiset lukemat sallii kirjoittamisen aikana, skenaariokanavat eivät voi natiivisesti optimoida ilman monimutkaisia kuvioita.