Dlaczego zespół LMAX zaprojektował LMAX Disruptor w Javie, ale wszystkie ich punkty konstrukcyjne minimalizują użycie GC? Jeśli nie chce się uruchamiać GC, to po co używać języka bezużytecznego?
Ich optymalizacje, poziom wiedzy o sprzęcie i myśl, którą włożyli, są po prostu niesamowite, ale dlaczego Java?
Nie jestem przeciwny Jawie ani nic, ale dlaczego język GC? Dlaczego nie użyć czegoś takiego jak D lub inny język bez GC, ale pozwala na wydajny kod? Czy zespół najlepiej zna Javę, czy też Java ma jakąś wyjątkową zaletę, której nie widzę?
Powiedzmy, że rozwijają go za pomocą D z ręcznym zarządzaniem pamięcią, jaka byłaby różnica? Musieliby myśleć o niskim poziomie (którym już są), ale potrafią wycisnąć najlepszą wydajność z systemu, ponieważ jest on natywny.
Odpowiedzi:
Ponieważ istnieje ogromna różnica między optymalizacją wydajności a wyłączeniem całkowicie bezpieczeństwa
Zmniejszając liczbę GC, ich struktura jest bardziej responsywna i może działać (przypuszczalnie) szybciej. Teraz optymalizacja dla śmieciarza nie oznacza, że nigdy nie robią śmieci. Oznacza to po prostu, że robią to rzadziej, a kiedy to robią, działa to naprawdę szybko. Tego rodzaju optymalizacja obejmuje:
Kiedy wyłączysz wydajność, zazwyczaj dostroisz bardzo specyficzny „gorący punkt”, ignorując kod, który nie jest często uruchamiany. Jeśli zrobisz to w Javie, możesz pozwolić, aby śmieciarz nadal zajmował się tym ciemnym rogiem (ponieważ nie zrobi to dużej różnicy), jednocześnie optymalizując bardzo ostrożnie dla obszaru, który działa w ciasnej pętli. Możesz więc wybrać, gdzie chcesz zoptymalizować, a gdzie nie, a tym samym skoncentrować swój wysiłek tam, gdzie to ważne.
Teraz, jeśli całkowicie wyłączysz śmieci, nie będziesz mógł wybrać. Musisz ręcznie pozbyć się każdego obiektu, zawsze. Ta metoda jest wywoływana co najwyżej raz dziennie? W Javie możesz na to pozwolić, ponieważ jego wpływ na wydajność jest znikomy (może pozwolić na to, aby pełny GC pojawiał się co miesiąc). W C ++ nadal wyciekają zasoby, więc musisz zająć się nawet tą niejasną metodą. Musisz więc płacić cenę za zarządzanie zasobami w każdej pojedynczej części aplikacji, podczas gdy w Javie możesz się skupić.
Ale jest coraz gorzej.
Co się stanie, jeśli masz błąd, powiedzmy w ciemnym rogu aplikacji, do której dostęp jest dostępny tylko w poniedziałek w pełni księżyca? Java ma silną gwarancję bezpieczeństwa. Niewiele jest „niezdefiniowanych zachowań”. Jeśli użyjesz czegoś niewłaściwego, zgłoszony zostanie wyjątek, program się zatrzyma i nie nastąpi uszkodzenie danych. Jesteś więc pewien, że nic złego się nie stanie bez Twojej uwagi.
Ale w czymś takim jak D, możesz mieć zły dostęp do wskaźnika lub przepełnienie bufora i możesz uszkodzić swoją pamięć, ale twój program nie będzie wiedział (wyłączyłeś bezpieczeństwo, pamiętasz?) I będzie działał z niepoprawnym danych i róbcie dość paskudne rzeczy i niszczcie swoje dane, a wy nie wiecie, a gdy więcej korupcji się zdarza, wasze dane stają się coraz bardziej błędne, a potem nagle się psują, i to było w krytycznej dla życia aplikacji, i jakiś błąd wydarzyło się w obliczeniach rakiety, i tak to nie działa i rakiety wybuch, a ktoś umrzeć, a firma jest na pierwszej stronie każdej gazety i punkt szef jej palec do ciebie mówiąc: „Ty jesteś inżynier, który zasugerował, że użyliśmy D do optymalizacji wydajności, dlaczego nie pomyślałeś o bezpieczeństwie?". To twoja wina. Zabiłeś tych ludzi głupią próbą działania.
OK, ok, przez większość czasu jest to znacznie mniej dramatyczne. Ale nawet aplikacja o znaczeniu krytycznym dla biznesu lub po prostu aplikacja GPS lub, powiedzmy, rządowa witryna opieki zdrowotnej może mieć dość negatywne konsekwencje w przypadku błędów. Bardzo dobrym pomysłem jest używanie języka, który albo całkowicie im zapobiegnie, albo szybko się nie powiedzie.
Wyłączenie bezpieczeństwa kosztuje. Być rodzimym nie zawsze ma sens. Czasami jest o wiele prostsze i bezpieczniejsze po prostu zoptymalizować nieco bezpieczny język, który pasuje do języka, w którym możesz strzelać sobie w stopę przez długi czas. Poprawność i bezpieczeństwo w wielu przypadkach przebija kilka nanosekund, które zostałyby złomowane przez całkowite wyeliminowanie GC. W takich sytuacjach można zastosować Disruptor , więc myślę, że LMAX-Exchange wykonał właściwe połączenie.
Ale co w szczególności z D? Masz GC, jeśli chcesz dla ciemnych rogów, a podzbiór SafeD (o którym nie wiedziałem przed edycją) usuwa niezdefiniowane zachowanie (jeśli pamiętasz, aby go użyć!).
W takim razie jest to proste pytanie o dojrzałość. Ekosystem Java jest pełen dobrze napisanych narzędzi i dojrzałych bibliotek (lepszych do programowania). Znacznie więcej programistów zna Javę niż D (lepiej w utrzymaniu). Wybór nowego i mało popularnego języka dla czegoś tak krytycznego jak aplikacja finansowa nie byłby dobrym pomysłem. W przypadku mniej znanego języka, jeśli masz problem, niewielu może ci pomóc, a biblioteki, które znajdziesz, mają zwykle więcej błędów, ponieważ były narażone na mniej ludzi.
Tak więc moja ostatnia uwaga pozostaje ważna: jeśli chcesz uniknąć problemów z tragicznymi konsekwencjami, trzymaj się bezpiecznych wyborów. Na tym etapie życia D jego klientami są małe start-upy gotowe na szalone ryzyko. Jeśli problem może kosztować miliony, lepiej pozostać dalej na krzywej innowacji .
źródło
Wydaje się, że powodem, dla którego napisano w Javie, jest to, że mają oni wewnętrzną wiedzę na temat języka Java i prawdopodobnie został napisany (chociaż wciąż jest w fazie rozwoju), zanim C ++ zaczął działać razem z C ++ 0x / 11.
Ich kod to tak naprawdę tylko Java z nazwy, używają sun.misc.Unsafe całkiem sporo, co w pewnym sensie pokonuje sens Java i rzekomo zapewnia bezpieczeństwo. Napisałem port C ++ Disruptor, który przewyższa kod Java, który wysyłają (nie spędziłem dużo czasu na dostrajaniu JVM).
To powiedziawszy, zasady, którymi kieruje się moduł zakłócający, nie są specyficzne dla języka, np. Nie oczekuj kodu C ++ o niskim opóźnieniu, który przydziela lub uwalnia ze stosu.
źródło
To pytanie określa nieprawidłową przesłankę jako fakt, a następnie wysuwa argument na temat tej nieprawidłowej przesłanki.
Pozwala zagłębić się w to… „wszystkie ich punkty konstrukcyjne w celu zminimalizowania wykorzystania GC” - po prostu nie jest prawdą. Innowacja w urządzeniu zakłócającym ma niewiele wspólnego z GC. Disruptor działa, ponieważ jego konstrukcja sprytnie uwzględnia sposób działania nowoczesnych komputerów - coś, co jest znacznie mniej powszechne, niż można by się spodziewać. Zobacz dyskusję Cliff Click http://www.azulsystems.com/events/javaone_2009/session/2009_J1_HardwareCrashCourse.pdf w celu omówienia.
Powszechnie wiadomo, że LMax to klienci Azul. Wiem z pierwszej ręki, że z GC firmy Azul są po prostu sprawą nierozerwalną - nawet przy stosach 175 GB.
źródło
Powyżej stanowi połowę odpowiedzi, której szukasz. Możesz znaleźć kolejną połowę, aby uzupełnić rozumowanie nie dalej niż na blogu LMAX :
Jak przyznają programiści LMAX, taki kod może być dość trudny do opracowania, zrozumienia i debugowania - nawet w Javie. Zejście niżej niżej niż obecnie, tylko pogorszy ten problem, jak wskazano w artykule Wikipedii na temat języków programowania niskiego poziomu :
źródło
Jeśli używasz języka Java jako języka składniowego i unikasz jego bibliotek JDK, może on być tak szybki, jak skompilowany język inny niż GC. GC nie jest odpowiedni dla systemów czasu rzeczywistego, ale możliwe jest tworzenie systemów w Javie, które nie pozostawiają żadnych śmieci. W rezultacie GC nigdy się nie uruchamia.
Wierzymy, że język Java i platforma mają wiele zalet w stosunku do C / C ++ i opracowaliśmy i przetestowaliśmy niektóre komponenty Java o bardzo niskim opóźnieniu, aby to udowodnić. W tym artykule rozmawiamy o technikach, jak to zrobić: Programowanie Java bez GC .
źródło
malloc/free
nie nadaje się również w czasie rzeczywistym, ponieważ czas alokacji jest nieograniczony z powodu fragmentacji.LMAX to wysokowydajna biblioteka przesyłania wiadomości między wątkami.
Aby być użytecznym, ktoś inny musi napisać kod, aby każdy wątek wykonał użyteczną pracę. Biorąc pod uwagę, że kod najprawdopodobniej znajduje się w Javie lub C #, a zatem istnieje bardzo niewiele wyborów języka, który dobrze z nimi współpracuje.
Używanie C lub C ++ nie jest dobrą opcją, chyba że chcesz ograniczyć użytkowników do jednego systemu operacyjnego, ponieważ nie ma w nich zdefiniowanego modelu wątków.
Java jest obecnie standardem w wielu programach, więc jeśli nie masz uzasadnionego powodu, jest to najlepszy wybór. (Gdy w Rzymie postępujcie jak Rzymianie…)
Pisanie oprogramowania o wysokiej wydajności w Javie (lub C #) jest często wykonywane w celu udowodnienia, że…
źródło