Które z koroutines (koroutines i koroutines Kotlina) są szybsze? [zamknięte]

Kotlin corutines jest cukrem dla skończonej maszyny stanowej i jakiegoś biegacza zadań (na przykład domyślnego ForkJoinPool). https://github.com/Kotlin/kotlin-coroutines/blob/master/kotlin-coroutines-informal.md#implementation-details{[2]

Innymi słowy, w Java/kotlin runtime runtime nie ma jeszcze żadnych rdzeni wykonawczych (ale może się to zmienić za pomocą http://cr.openjdk.java.net / ~rpressler/loom/Loom-Proposal.html ). Kotlina koroutine to po prostu sekwencja zadań, które są wykonywane przez jeden. Każde zadanie może być wykonane w dowolnym wątku z puli wątków.

Go runtime obsługuje "coroutines". Ale goroutines nie są prawdziwymi coroutines. Goroutines nie pozwala na ustawianie punktów uzysku w programie. Ponadto Go nie pozwala na ustawienie niestandardowej puli wątków. Możesz ustawić tylko rozmiar wątków w domyślnej puli.

Pierwsza różnica między koroutinami Kotlin i goroutines To Go runtime manages, który coroutine jest uruchomiony w tej chwili. Gdy goroutine są blokowane w niektórych operacjach IO (lub synchronizacji), przejdź do następnego zadania, aby go wykonać. W JVM nie ma przełączania zadań intelektualnych w takich kategoriach.

Z tego powodu Go może tanio zmienić aktualnie uruchomione zadanie. Go ma tylko zmienić kilka rejestrów https://groups.google.com/forum/#! msg / golang-nuts/j51G7ieoKh4 / wxnakkfefvcj . ale niektórzy mówią, że JVM może używać stosu wątków zamiast rejestrów. Nie ma więc zapisywania i wczytywania rejestrów.

Drugi różnica między koroutinami Kotlina i goroutines jest rodzajem koroutines. Koroutines Kotlina to koroutines bez stosu. Goroutines to stackful coroutines. Cały stan koroutinów Kotlina jest przechowywany w kontekście Kotlina, który jest przechowywany w stercie. Stan Goroutines jest przechowywany w rejestrach i stosie wątków.

Chcę wiedzieć, które koroutiny (koroutiny i koroutiny Kotlina) są szybsze w zadaniach związanych z IO? Zadania związane z procesorem? A co z zużyciem pamięci?

Author: Roman Elizarov, 2017-10-21

1 answers

Koroutiny w Kotlinie są zaimplementowane w inny sposób niż koroutiny W Go, więc który z nich jest" szybszy " zależy od problemu, który rozwiązujesz i rodzaju kodu, który piszesz.

Ogólnie rzecz biorąc, bardzo trudno jest powiedzieć z góry, który z nich będzie działał lepiej na problem, który masz pod ręką. Aby to zrozumieć, musisz uruchomić benchmarki dla konkretnych obciążeń. Oto jednak ogólne podsumowanie kluczowych różnic, które powinny dać ci trochę wskazówki.

  • Kotlin coroutines wymaga mniej pamięci na prostą instancję niż Go goroutines. Prosty koroutine w Kotlinie zajmuje tylko kilkadziesiąt bajtów pamięci sterty, podczas gdy go goroutine zaczyna się od 4KiB przestrzeni stosu. Oznacza to, że jeśli planujesz mieć dosłownie miliony coroutines, to coroutines w Kotlin może dać ci przewagę w porównaniu do Go. Dzięki temu Kotlin corutines lepiej nadają się do bardzo krótkotrwałych i małych zadań, takich jak generatory i leniwe sekwencje.

  • Koroutiny Kotlina mogą przejść do dowolnej głębokości stosu, jednak każde wywołanie funkcji suspending przydziela obiekt w stercie dla jego stosu. Stos wywołań w koroutinach Kotlin jest obecnie zaimplementowany jako powiązana lista obiektów heap. Natomiast goroutines W Go używają liniowej przestrzeni stosu. To sprawia, że zawieszenie na głębokich stosach jest bardziej wydajne w Go. Tak więc, jeśli kod, który piszesz, zawiesza się bardzo głęboko w stosie, może się okazać, że goroutines są bardziej wydajne dla ty.

  • Wydajne asynchroniczne IO to bardzo wielowymiarowy problem projektowy. Podejście, które jest skuteczne dla jednego rodzaju aplikacji może nie dać najlepszą wydajność do innego. Wszystkie operacje IO w koroutinach Kotlin są implementowane przez biblioteki napisane w Kotlin lub Javie. Istnieje ogromna różnorodność bibliotek IO dostępnych dla kodu Kotlin. W Go asynchroniczne IO jest zaimplementowane przez GO runtime przy użyciu prymitywów, które nie są dostępne dla ogólnego kodu Go. If Go approach to wdrażanie operacji IO jest dobrze dostosowane do Twojej aplikacji, więc może się okazać, że ścisła integracja z GO runtime daje Ci przewagę. Z drugiej strony, w Kotlinie możesz znaleźć bibliotekę lub napisać taką, która implementuje asynchroniczne IO w sposób najlepiej dopasowany do Twojej aplikacji.

  • Go runtime przejmuje pełną kontrolę nad wykonywaniem harmonogramów goroutines w fizycznych wątkach systemu operacyjnego. Zaletą tego podejścia jest to, że nie musisz o tym myśleć wszystkie. Dzięki koroutines Kotlin masz drobnoziarnistą kontrolę nad środowiskiem wykonawczym swoich koroutines. Jest to podatne na błędy (np. możesz po prostu utworzyć zbyt wiele różnych puli wątków i marnować czas procesora na przełączanie kontekstu między nimi). Daje to jednak możliwość dostrojenia alokacji wątków i przełączników kontekstowych dla aplikacji. Na przykład w Kotlinie łatwo jest wykonać całą aplikację lub podzbiór jej kodu w jednym wątku OS (lub puli wątków), aby całkowicie unikaj przełączania kontekstów między wątkami systemu operacyjnego, pisząc odpowiedni do tego Kod.

 34
Author: Roman Elizarov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-25 07:57:34