Niech ten konkurs wpędzi Was w „ostrą jazdę bez trzymanki”. Kto będzie pierwszy? Na kogo spadnie szacunek .Net’owej społeczności?
Nagroda
Do zwycięzcy wyślę ładnie zapakowane 0.7 Jack’a Daniels’a i dziesięć setek Wiśniówki Lubelskiej.
Temat
Tematem konkursu jest zoptymalizowanie procesu zamiany ciągu bajtów na obiekty.
Zasady wygranej
Wersja uznana jest za najszybszą jeśli od poprzedniej najszybszej wersji będzie szybsza o 5% w każdym z 10 powtórzeń testu. Do mierzenia wydajności wykorzystany jest BenchmarkDotNet.
Nagroda zwycięscy zostaje przyznana wówczas gdy po pull request
z najszybszą wersją przez kolejne 30 dni nikt nie nadeśle szybszej wersji.
GitHub
Odsyłam do strony GitHub tego projektu. Znajdziecie tam wszystkie, niezbędne, szczegółowe informacje wraz z krótkim tutorialem w pliku README.md.
- Jak taki ciąg bajtów wygląda, jakie ma cechy? Jakie obiekty chcemy uzyskać w wyniku parsowania?
- Opis projektu w Visual Studio
- Jak w łatwy i szybki sposób dodać własną wersję parsera?
- Interfejs parsera
- Dotychczasowe wyniki
- Opis kolejnych wersji parsera
Motywacja
Niedawno natrafiłem na projekt BenchmarkDotNet
, który mnie zachwycił. Chcąc się nim pobawić wymyślałem sobie pretekst do tych zabaw – tym pretekstem jest właśnie temat tego konkursu.
Napisałem kilka wersji parsera eksperymentując z kodem. Robiłem niewielkie zmiany i odpalałem testy po czym sprawdzałem czy wydajność się poprawiła czy spadła. Nadal jednak jestem przekonany, że można osiągnąć większą wydajność, ale mi się już pomysły skończyły.
Śledząc kolejne wersje tych parserów będziecie mogli zobaczyć na żywo, na konkretnym przypadku:
- jak bardzo nie wydajny jest regex
- czy i o ile jest szybszy
switch
odif
- jakie metody
linq
są wolne i jak bardzo potrafią być wolne - czy
StringBuilder
naprawdę jest szybszy od zwykłego string - zarządzanie pamięcią na własną rękę tak aby
GC
miał jak najmniej pracy czy try {} catch {}
ma wpływ na wydajność
Będziecie mogli również zobaczyć jak się konfiguruje i odpala BenchmarkDotNet
oraz podejście do testów jednostkowych, które testują wszystkie wersje bibliotek parsera w jednym teście.
Na każdego, któremu uda się poprawić wydajność, oprócz nagród rzeczowych, spadnie szacunek ludzi naszej społeczności, a ja z pewnością nauczę się czegoś nowego.
Obecny poziom wydajności dla projektu produkcyjnego już dawno jest zadowalający. Tutaj dalsze optymalizacji mają charakter rozrywki.
To wogole aktualne? Bo widze ze podbite na dotnetomaniaku,.. masz tam ciagle zero pull requestow… pola do popisu duzo… tylko ta data wpisu i ostatnich zmian na repo taka nie adekwatna 😉
PolubieniePolubienie
Tak, jak najbardziej konkurs jest aktualny. Zrobiłem ten projekt dawno temu, ale na początku rozesłałem linki do tego konkursu w wąskim gronie moich znajomych. Nie dawno postanowiłem wypromować jeszcze raz ten konkurs na Dotnetmaniaku — stąd takie dziwne daty w porównaniu do daty, kiedy dotarł do Ciebie ten konkurs. Teraz po opublikowaniu na Dotnetmaniaku zainteresowanie wzrosło. Bardzo bym, chciał, aby ktoś zgłosił wygrywającego pull request (PR).
Konkurs jest realny i jest nadal w trakcie. Będzie aktualny, dopóki ktoś nie wyśle PR, którym będzie szybciej. Jeśli przez następne 30 dni nikt nie wyśle kontrującego PR, w którym byłoby jeszcze szybciej, to konkurs zamykamy i ogłaszam zwycięzcę na wszystkich możliwych kanałach oraz wysyłam upominek na wskazany adres.
P.S. Dostałem info, że ktoś tam w Polsce odpalił na .NET Core i bez zmiany kodu, najszybsza wersja przyspieszyła o 17%. Jednak to nie jest wygranie tego konkursu, ponieważ nie było zmian kodu, która by na tej samej platformie przyspieszyła rozwiązanie.
PolubieniePolubienie
Czy parser musi weryfikować poprawność/zgodność ze standardem? Bo jak widzę, do tej pory w większości tego nie robi.(o braku tego standardu nie wspominając).
Innymi słowy: jakie minimum informacji możemy być pewni, że może się trafić na wejściu…
np. Czy mogą być spacje po nazwie przed dwukropkiem? Czy może być więcej niż jedna spacja po dwukropku?
PolubieniePolubienie
Dobra, przyjrzałem się twojemu opisowi standardu.. powiedzmy, ze wystarczy.
Mam jeszcze pytanie co do zakresu możliwych zmian. Czy te zwracane klasy i ich strukturę możemy zmieniać?
PolubieniePolubienie
Możesz dokonywać dowolnych zmian w kodzie w taki sposób, aby wszystkie testy jednostkowe paliły się na zielono, przy czym nie możesz zmieniać kodu testów jednostkowych. Te same przypadki, które są w testach jednostkowych, są potem użyte w testach wydajnościowych. Jak widzisz w testach jednostkowych i testach wydajnościowych jest użyty tylko jeden typ `eventu` – `TryingEvent`. Pozostałe rodzaje `eventów` są pominięte celem zminimalizowania kodu związanego z obsługą kolejnych, analogicznych `eventów` na korzyść skupienia się na sednie tematu, czyli na wydajności. W konkursie należy się skupić tylko na `TryingEvent`. Jeśli zmiana tego obiektu spowoduje niekompilowanie się unit testów lub zapalenie ich na czerwono to odpowiedź jest na nie.
PolubieniePolubienie