Sortowanie – Bash vs Perl benchmark

Dziś na kanale IRC znajomy szukał błędu w skrypcie bashowym. Danych dużo, skrypt wykonuje się długo (kilkadziesiąt minut). Błąd pojawiał mu się w sort, skrypt złożony. Jakoś tak stwierdził, że przepisze na Perla, będzie szybciej. Tyle tytułem wstępu, bo potem rozpoczęliśmy akademickie rozważania pt. czy sortowanie w Perlu będzie szybsze.

Postanowiłem się pobawić w praktykę. Nie ukrywam, że sporą rolę maiła tu niedawna dyskusja nt. algorytmów (i czemu zabawy z nimi są fajne) z M.[0]

Najpierw wygenerowanie sporego zestawu danych testowych [1]. 10 mln liczb z zakresu 0-99, 28999760 bajtów.

Następnie prosty sort [2]. Wyniki oscylują w granicach 16-18 sekund.

Pierwszy skrypt w Perlu[3] Jest minimalnie szybciej, bo 15 sekund.

Widać parę niepotrzebnych przepisań i da się to skrócić [4]. Po skróceniu wyniki oscylują w granicach 14,4 sekundy.

Pora na mały cheat, bo wiemy, że większość danych się powtarza. Czyli wersja z hashem – zliczamy ilości wystąpień, a na koniec sortujemy tyko klucze hasha (których jest 100) i wyświetlamy tyle razy, ile razy wystąpiły [5].

Jest dużo szybciej. Okolice 4,7 sekundy. Szczerze mówiąc nie sądziłem, że aż tyle da się urwać.

Na koniec postanowiłem sprawdzić, czy różnica wynika z powtarzających się danych. Wygenerowałem mały plik z praktycznie niepowtarzającymi się danymi [6]

Tutaj sort wykonywał się ok. 70 ms, natomiast – ku mojemu zdziwieniu – Perl nadal był szybszy i wykonywał się ok. 50 ms.

Daleki jestem od wyciągania z tego benchmarku daleko idących wniosków, nikogo też na przechodzenie wszędzie na Perla nie namawiam. Bardziej chodziło mi o pokazanie ciekawostki. Zwykle 10 sekund różnicy nie ma znaczenia, narzut na pisanie nie zwróci się nigdy, a wersja z sort jest po prostu czytelniejsza. I pewnie nadal będę używał sort. Niemniej warto wiedzieć, że w prosty sposób da się szybciej. Taki mały hack.

Inna sprawa, że IMVHO pisanie skryptów w bashu zwykle nie ma sensu i lepiej użyć Perla, Pythona itp. Szybciej, więcej można w prosty sposób zrobić, a skrypty bashowe mają tendencję do puchnięcia z elementami dziwnych rzeźb.

Uwagi: Wynik sortowania jest identyczny, choć nie to było priorytetem. Sortowanie nie jest numeryczne (jak ktoś chce, może się bawić, stawiam, że wyniki będą podobne). Skrypty są pisane mało optymalnie, mało czytelnie itd. ale tak na szybko piszę onelinery z głowy, a nie bawiłem się w upiększanie, bardziej chciałem szybko notkę zrobić. Tak, wiem nie ma close (F), w skryptach, ale nie jest tu potrzebne. Nie ma potrzeby korzystania z open, spokojnie można było robić „tradycyjne” while (<>) i czytać ze STDIN; jak sprawdziłem później nie powoduje to zauważalnej różnicy w czasie wykonania.

Ponieważ Blox wyczynia cuda z tekstami w pre podczas edycji notki, efektem czego jest znikanie większej części skryptów i tekstu, poniżej wklejka z wszystkimi poleceniami (odnośniki powyżej).

 

[0] Jest szansa, że pojawi się parę zadań z algorytmami. Ale niczego nie obiecuję. Zresztą, chyba lepiej, żeby takie rzeczy działy się na blogu jakiegoś programisty… A jak zobaczyłem, co robi Blox z groźnymi nawiasami trójkątnymi, to zupełnie odeszła mnie ochota na pisanie czegoś wymagającego fragmentów kodu tutaj.

UPDATE: Jak trafnie zauważyli czytelnicy w komentarzach, sort można przyspieszyć (analogicznie, jak przyspieszyć można grep) poprzez ustawienie LC_ALL=C lub LANG=C. Po tym zabiegu sort, dla podanych danych, działa szybciej od dotychczasowego najszybszego Perla, w okolicach 4,2 sekundy.

Blogday 2014

Znowu niemal przegapiłem, ale rzutem na taśmę pięć polecanych blogów. Tym razem bez opisów, po prostu polecam przeczytać parę ostatnich wpisów. Uważam, że warto.

I w miarę dokładnie pokrywa się to z polskimi blogami, które przybyły w moim czytniku RSS w ciągu ostatniego roku. No, niecałego, bo ostatnio zombie blogerzy byli. Jeśli tak dalej pójdzie, to w przyszłym roku po prostu nie będę miał kogo polecać. Chociaż pewnie coś ze starszych jeszcze wygrzebię. Albo wrzucę coś anglojęzycznego.

Rowery miejskie w Szczecinie

Niedawno Szczecin uruchomił SRM, czyli Szczeciński Rower Miejski i dołączył do grupy polskich miast umożliwiających wypożyczanie rowerów miejskich ze stacji na ulicach. W przeciwieństwie do miast takich jak Poznań, Wrocław, Kraków czy Warszawa, nie jest to system obsługiwany przez firmę Nextbike, o którym na przykładzie Poznania pisałem (nawet dwa razy[1]), tylko przez zupełnie inną firmę.

Rozwiązanie takie ma zalety, ma też wady. Pierwsza, najważniejsza i najbardziej oczywista wada to brak wspólnego systemu. Mając konto w SRM nie skorzystamy z możliwości wypożyczenia roweru w innych miastach. Jako użytkownik PRM mam – przynajmniej teoretycznie, bo w praktyce nie zdarzyło mi się korzystać – możliwość wypożyczenia roweru w innych miastach kraju. Tak przynajmniej sugeruje strona Nextbike, bo informacji wprost nie znalazłem.

Kolejna wada – tym razem z mojego punktu widzenia – to format udostępnianych danych nt. dostępności rowerów miejskich na poszczególnych stacjach. SRM, podobnie jak Nextbike, udostępnia dane publicznie, ale robi to w tej chwili w sposób mocno kulawy. Zamiast ładnego XML z danymi o stacji (nazwa, położenie, ilość rowerów) mamy… HTML do samodzielnego parsowania. Mam nadzieję, że zmienią to do początku następnego sezonu, bo chciałem dodać Szczecin do strony z dostępnością rowerów miejskimi w Polsce[2].

Pora na zalety. Niewątpliwie zaletą SRM jest cena przy krótkich wypożyczeniach. Podobnie jak w Poznaniu, pierwsze 20 minut jest za darmo, ale za godzinę (łącznie) wypożyczenia w Szczecinie zapłacimy 1 zł (Poznań 2 zł), za 2h (łącznie) zapłacimy 4 zł (Poznań 6 zł). 3h w Szczecinie to 9 zł, w Poznaniu 10 zł. Potem już niestety Szczecin wypada gorzej, bo każda następna godzina w Sz-nie to aż 7 zł, w Poznaniu 4 zł. Chociaż traktując wypożyczane rowery miejskie jako alternatywę dla komunikacji zbiorowej liczą się IMO głównie krótkie okresy wypożyczenia (20 min, 1h, góra 2h), a tu Szczecin wypada lepiej[3].

Za zaletę uważam również powstanie konkurencji[4] – co prawda raczej w istniejących miastach niewiele to zmieni, przynajmniej w najbliższym czasie, ale wygląda, że kolejne miasta mają jakiś wybór operatora.

UPDATE W zasadzie wpis przestał być aktualny, bo od niedawna SRM jest częścią Nextbike. Z tego co mówią znajomi, jest wspólne konto, czyli pełna integracja z innymi miastami. A dane dotyczące ilości rowerów na stacjach w Szczecinie dostępne są już na stronie.

[1] Dość stare, trochę się pozmieniało, w szczególności wzrosła liczba stacji w Poznaniu, a ja nie bardzo korzystam – dorobiłem się własnego roweru, więcej chodzę pieszo i mam (miałem) sieciówkę.

[2] No i pewnie nazwę strony musiałbym zmienić, a koniec sezonu (słabo sobie IMHO wybrali termin startu w Sz-nie, chociaż może takie opóźnienie w przyswojeniu przez ludność faktycznie jest…) i używalność będzie nikła, więc trochę nie chce mi się.

[3] Ogólnie Poznań ma w tej chwili beznadziejne ceny transportu miejskiego. Najtańszy bilet to 3 zł (10 minut). W Szczecinie jest 2 zł za minut 15. A pamiętam, że gdy się przeprowadzałem do Poznania parę lat temu, było dokładnie odwrotnie – bilety w Poznaniu kosztowały 1 zł (też chyba 10 minut) przy IIRC 1,8 zł za 15 minut w Szczecinie.

[4] Trochę na wyrost wniosek, bo powiązań osobowych i finansowych nie sprawdzałem jeszcze.