Wpis musiałem podzielić na części, gdyż okazał sie za długi w porównaniu z możliwościami silnika tego bloga.
Przy pracach nad jednym z systemów bankowych powstała potrzeba optymalizacji czasu analizy logów z aplikacji. Przeprowadzone przy tej okazji testy pozwoliły bliżej przyjrzeć się problemowi doboru narzędzi do konkretnych zastosowań. W poniższym opracowaniu porównałem kilka programów mogących wyszukać w pliku sześć kolejnych znaków. Takie założenie odpowiada przeszukiwaniu plików logów wg. godziny i minuty, np. w poszukiwaniu zdarzeń, które zaszły w dwunastej minucie godziny dwunastej: "12:12:".
Przy pracach nad jednym z systemów bankowych powstała potrzeba optymalizacji czasu analizy logów z aplikacji. Przeprowadzone przy tej okazji testy pozwoliły bliżej przyjrzeć się problemowi doboru narzędzi do konkretnych zastosowań. W poniższym opracowaniu porównałem kilka programów mogących wyszukać w pliku sześć kolejnych znaków. Takie założenie odpowiada przeszukiwaniu plików logów wg. godziny i minuty, np. w poszukiwaniu zdarzeń, które zaszły w dwunastej minucie godziny dwunastej: "12:12:".
Testy rozpocząłem od przygotowania plików symulujących prawdziwe logi. Wygenerowałem plik mający 1 000 000 000 bajtów, składający się z 20 000 000 linii (w każdej linii znajduje sie 50 znaków):
Do stworzenia pliku testowego użyłem dwóch skryptów. Choć podobne, jeden z nich miał działać szybciej, przez tworzenie danych w pamięci RAM i zapisanie jednej porcji danych na dysku. Poniższy skrypt "variable" teoretycznie powinien być szybszy:
Ten skrypt "direct" wykonujący wiele operacji zapisu do pliku powinien być wolniejszy:
Taki był rezultat uruchomienia powyższych skryptów:
Zaskakujące? Warto we własnym zakresie przetestować różnicę, gdy w poniższej linii zamienimy "bigstring+=" na "bigstring = "$bigstring +":
Skąd wynika ta nieoczekiwana różnica w czasach wykonania skryptów? Zakładam, że połączenie wolno działającego języka skryptowego z szybkim podsystemem dyskowym pozwoliło szybciej działać temu skryptowi, który wykonywał mniej operacji (pomimo dużej liczby dyskowych operacji IO).
W tym miejscu zamieszczę kilka słów wyjaśnienia.
1) Skrypty i programy zamieszczone na tej stronie są wersjami testowymi, a nie produkcyjnymi. Nie obsługują wszystkich wyjątków i możliwych błędów, nawet w miejscach, o których wiem. Nie było to potrzebne do zaprezentowania wyników testów i porównania ich.
2) Kod nie jest optymalny w wielu miejscach - i taki ma być. W programach użyłem wielu funkcji jako demonstracje technologii. Np. w skryptach tworzących plik testowy użyłem dwóch różnych funkcji tworzących losowe dane, a w programach, które będą zamieszczone poniżej, zaprezentowane są różne funkcje wspierające programowanie wieloprocesorowe:
- Pamieć współdzielona zgodna z System V API i POSIX API, odwzorowanie plików w pamięci.
- Semafory {wait4()}; pomiar czasu w trybie użytkownika i systemu (rusage), oraz high_resolution_clock.
- Tworzenie procesów: fork, exit, execl.
3) Mimo tego, że testy wykażą różnice w czasach działania programów, co automatycznie skłania do ich wartościowania, to ja nie dyskredytuję żadnego z tych programów, czy języków. Każdy z nich ma pewne właściwości czyniące go użytecznym. Jedne mają działać szybko, przy ograniczonej funkcjonalności. Inne mają wiele możliwości, dużą ilość opcji i przełączników. Jeszcze inne mają służyć do szybkiej implementacji. Jak wyglądała by dzisiejsza informatyka bez awk, czy Javy?
Wykorzystany serwer:
Do testów w wirtualnym środowisku dostępne jest 16 rdzeni, co przy technologii Hyper-Threading udostępnia systemowi operacyjnemu możliwość uruchomienia 32 współbieżnych procesów. Macierz dysków i 120 GB RAM i zapewnia, że system pamięci masowej nie będzie wpływał na testy.
Testy:
Grep
Pierwszy test z tytułowym programem. Do niego będziemy odnosić wszystkie inne wyniki. Każdy z programów będę uruchamiać dwukrotnie, by mieć pewność powtarzalności uzyskanych wyników.
AWK
Python
Ruby
Trzy wersje i porównanie czasów ich wykonania.
Perl
Java
W bonusie obsługa wyrażeń regularnych.
***
Inne wpisy:
Oświetlenie miejsca pracy
Oświetlenie LED łazienki (małej)
Zużycie prądu przez suszarkę do ubrań i pralkę
Zużycie prądu przez urządzenia domowe i ich współczynnik mocy cos phi (cosφ)
Modernizacja oświetlenia głównego w dużym pokoju i przedpokoju
Oświetlenie LED łazienki (małej)
Zużycie prądu przez suszarkę do ubrań i pralkę
Zużycie prądu przez urządzenia domowe i ich współczynnik mocy cos phi (cosφ)
Modernizacja oświetlenia głównego w dużym pokoju i przedpokoju
Update: 2018.07.17
Create: 2018.07.17
Brak komentarzy:
Prześlij komentarz