A csatornák és a mutexek és a GO egyidejűleg történő használata a párhuzamosság -ellenőrzés során számos olyan teljesítmény -következményt hordoznak, amelyek a tervezési és használati minták alapvető különbségeiben gyökerezik.
A Go csatornái az üzenet átadási stílusát testesítik meg, ahol az adattulajdonot kifejezetten továbbítják a gorutinok közötti üzenetek küldésével és fogadásával. A csatornák szinkronizálást biztosítanak a küldők blokkolásával, amíg a vevők készen állnak, vagy pufferolási üzeneteket pufferolnak, ha puffer létezik. Ez a kialakítás érvényesíti az adatcserékkel szembeni sorosítási formát, így a csatornák nagyon kifejezőek az egyidejű munkafolyamatok modellezésére, amelyek koordinációt, elosztott munkát vagy esemény értesítést tartalmaznak.
A mutexek (a Sync csomagból) viszont alacsonyabb szintű primitívek, hogy megvédjék a több gorutin által hozzáférhető megosztott memóriát. A Mutex a kritikus szakaszok reteszelésével és feloldásával koordinálja a hozzáférést, lehetővé téve több olvasót vagy egyetlen írót egyszerre, ha a Read-Write mutexeket használják. A belső állapotot hatékonyan őrzik, minimális fejjel, de gondos figyelmet igényelnek a holtpontok vagy a versenyfeltételek elkerülése érdekében.
Teljesítmény szempontjából a mutexek általában felülmúlják a csatornákat a megosztott változható állapot védelmekor, mert:
- A mutexek könnyűek és optimalizáltak a minimális, zárolt kritikus szakaszokhoz.
- A mutexek nem folytatott zár/feloldási útja rendkívül hatékony a Go futásidejében.
- A mutexek elkerülik a csatorna -kommunikációban rejlő extra másolást vagy adatátvitelt.
A csatornák ezzel szemben a gorutin szinkronizálásának és az adatok átadásának futásidejének ütemezését foglalják magukban. Amikor az adatokat csatornákon továbbítják, akkor másolási költségeket okozhat, és a kontextusváltások akkor fordulnak elő, amikor a gorutinok blokkolják a küldéseket vagy fogadásokat. A csatornák szignifikánsan lassabbak lehetnek, mint a mutexek az egyszerű megosztott állapotvédelem érdekében, gyakran többször lassabbak az állítás és a munkaterhelés függvényében.
A csatornák azonban teljesítmény-szempontból ragyognak a következő forgatókönyvekben:
- Több gorutin koordinálása aszinkron módon.
- Munkaegységek terjesztése a természetes tulajdonosi átadási szemantikával.
- Eseményvezérelt vagy csővezeték-architektúrák, ahol a sorosított kommunikáció javítja a biztonságot és a kód egyértelműségét.
Az egyszerű megosztott változók szinkronizálásának nyers átviteli sebességének mérésekor a referenciaértékek következetesen azt mutatják, hogy a mutexek többször is gyorsabbak, mint a csatornák, mivel az együttműködő reteszelési megközelítésük nem áll rendelkezésre érvényes adat -átadási szemantikát.
A belső megvalósítás szintén különbözik: a Go csatornái a Futex egyik formáját használják, és összetettebb szinkronizálási logikát foglalnak magukban a várakozási sorokkal és a gorutinok közötti jelzéssel, míg a mutexek egyszerűbb lezárási primitívek, gyors utakkal a nem igényelt forgatókönyvekhez.
A köztük történő kiválasztásnak figyelembe kell vennie a párhuzamosság természetét:
- A MutEx -ek segítségével őrizze meg a megosztott memória kritikus részeit, amelyek gyors, gyakori hozzáférést igényelnek.
- inkább a csatornákat részesítse előnyben, ha az aszinkron munkafolyamatokat koordinálnia kell, vagy biztonságosan át kell adnia a tulajdonjogot a gorutinok között.
Az adatvédelemhez szükséges csatornák túlzott felhasználása bonyolult és nem hatékony tervezést eredményezhet, míg a mutexek néha növelik a bonyolultságot, ha a zárolási szabályok túl bonyolultak lesznek, ebben az esetben a csatornák egyszerűsíthetik az érvelést.
Összefoglalva: az elsődleges teljesítmény -következtetés az, hogy a MutEx -ek általában kiváló nyers hatékonyságot kínálnak a megosztott állapot megvitatása alatt, míg a csatornák biztonságosabb és kifejezőbb, de potenciálisan lassabb eszközöket biztosítanak a párhuzamosság kommunikáció révén történő összehangolására. Ez a kompromisszum befolyásolja az átviteli teljesítményt, a késleltetést és a méretezhetőséget a GO alkalmazásokban.
Részletesebb pontok:
-A nem folytatott Mutex zár/feloldás nulla fölött van, gyakran felhasználói térben, kernel bevonása nélkül, kiváló teljesítményt nyújtva az alacsony vitatott munkaterhelésekhez.
- Nagy vitatás közben a mutexek szenvedhetnek a reteszelő konvojoktól, de még mindig gyakran felülmúlják a csatornákat, mivel a csatornák gyakrabban indukálják a gorutinok blokkolását és felébresztését.
.
- A mutexek a kritikus szakaszok reteszelésével védik; A csatornák erőszakkal sorolják be a kommunikációt, amely a munkaterhelési mintáktól függően befolyásolhatja az egyidejű átviteli sebességet.
.
- A csatornákat idiomatikusan előnyben részesítik a Go koordinációban, ahol a gorutinok természetesen kommunikálnak, de a mutexek előnyösek, ha egyszerűbb, nagy teljesítményű zárvédelemre van szükség.
Gyakorlati alkalmazásokban a csatornák használatának döntése a Mutex -rel nemcsak a nyers teljesítményen, hanem a kód tisztaságától, a helyességtől és a párhuzamos modellnek a problématartományra való alkalmasságától függ. A realisztikus munkaterhelések alapján történő összehasonlítás elengedhetetlen a megalapozott választáshoz.
Végül, az RWMutex variánsok jobb teljesítményt nyújthatnak az olvasási nehéz munkaterhelésekben, összehasonlítva a csatornákkal, mivel az egyidejű leolvasások lehetővé teszik az írások sorosítását. A forgatókönyv-csatornák nem tudnak natív módon optimalizálni komplex minták nélkül.