TEO KONKURS

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.

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 od if
  • 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.

5 Comments

  1. 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 😉

    Polubienie

    Odpowiedz

    1. 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.

      Polubienie

      Odpowiedz

  2. 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?

    Polubienie

    Odpowiedz

  3. 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ć?

    Polubienie

    Odpowiedz

    1. 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.

      Polubienie

      Odpowiedz

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Connecting to %s