Dopiero pół roku temu najbardziej krytyczne części powoli zaczęły być przepisywane na ten język i jak można było przewidzieć, problemy wydajnościowe przy naszym używaniu programu prawie nie występują.
Obecnie projekt ma ~50k linii w pythonie i ~10k linii w rust i szefostwo uznało, że najwyższy czas przepisać to na rusta, skoro tak dobrze się sprawdza i naprawi kilka pomniejszych błędów i oczywiście jako jeden z tych co zna ten język, znaczna część pracy przypada mnie.
Minusem jest to że jest od groma przy tym roboty na kilka miesięcy i być może to w 100% nie będzie to działało identycznie jak wcześniej(a powinno).
Plusem jest to że w końcu zaczynam się naprawdę uczyć tego języka - przy robieniu projektów dla zabawy nie musiałem zbytnio się przejmować stylem, a tutaj nie dość że trzeba pisać programy tak, by się samemu je rozumiało, to trzeba zrobić je tak by inni je zrozumieli - a rust czasami bywa trudnawy do zrozumienia.
#programowanie
#rustlang
@666 Tworzymy oprogramowanie na bardzo starych urządzeniach (2 albo 4 rdzenie po ~800MHz) - ale np. mają dyski ssd.
Mamy 5 programów komunikujących się ze sobą przez resty, ale są one trochę zbyt duże by móc je nazwać mikroserwisami.
Na początku problemów z wydajnością nie mieliśmy prawie żadnych, ale wraz ze zwiększoną ilością danych do przetworzenia, problemy się pojawiły:
długie uruchamianie programu - 15s to minimum, obecny moduł w rust uruchamia się w 1s albo i mniej(i dodatkowe zależności nie zwiększają tego czasu, w przeciwieństwie do pythona, gdzie nowa zależnośc może dodać kilka sekund do czasu uruchomienia)
pobieranie dużej ilości danych z bazy i konwersja do modeli pydantica(wersja 1) - na początku korzystaliśmy z ormów, ale ostatecznie by przyspieszyć to, zaczęliśmy używać czystego sql i ręcznie konwertować to do obiektów pydantica. Ostatecznie pewnie i tak zrezygnowalibyśmy z pydantica by przyspieszyć działanie, ale odbiło by się to na wykrywaniu błędów w trakcie tworzenia programu.
Przesyłanie dużej ilości danych przez resty(fastapi) - serializacja jsona/deserializacja + wrzucanie to do modeli pydantica i walidacja trwały zbyt długo
Wolne działanie zewnętrznych bibliotek - np. numpy/scipy są często wolniejsze niż najzwyklejsze operacje po stronie Rust, bez użycia osobnych bibliotek. Jeden z wykresów przy użyciu matplotlib generował się ~3s, a jego odpowiednik rustowy przy użyciu plotters-rs, robił to w ~100ms i to z dużo wyższą rozdzielczością
Reszta rzeczy jakoś nie sprawiała problemów, bo oprócz powyższych, bardzo wymagających tasków, cały kod jest asynchroniczny i nie miał żadnych zadyszek przy wykonywaniu swoich zwykłych zadań.