Najszybszy dekoder PNG dla .NET

Nasz serwer internetowy musi przetworzyć wiele kompozycji dużych obrazów przed wysłaniem wyników do klientów internetowych. Proces ten ma krytyczne znaczenie dla wydajności, ponieważ serwer może otrzymywać kilka tysięcy żądań na godzinę.

W tej chwili nasze rozwiązanie ładuje pliki PNG (około 1 MB każdy) z HD i wysyła je na kartę graficzną, dzięki czemu skład jest wykonywany na GPU. Najpierw próbowaliśmy załadować nasze obrazy za pomocą dekodera PNG udostępnionego przez API XNA. Widzieliśmy, że występ nie był zbyt dobry.

Aby zrozumieć, czy problem polegał na ładowaniu z HD lub dekodowaniu PNG, zmodyfikowaliśmy to, ładując plik do strumienia pamięci, a następnie wysyłając ten strumień do dekodera .NET PNG. Różnica wydajności przy użyciu XNA lub przy użyciu klasy System.Windows.Media.Imaging.PngBitmapDecoder nie jest znacząca. Z grubsza uzyskujemy ten sam poziom wydajności.

Nasze testy porównawcze pokazują następujące wyniki wydajności:

Załaduj obrazy z dysku: 37,76 ms 1%Dekoduj PNG: 2816,97ms 77%Załaduj obrazy na sprzęt wideo: 196,67ms 5%Skład: 87,80ms 2%Uzyskaj wynik kompozycji ze sprzętu wideo: 166,21 ms 5%Kodowanie do PNG: 318,13 ms 9%Zapisz na dysku: 3,96 ms 0%Sprzątanie: 53,00ms 1%

Razem: 3680,50ms 100%

Z tych wyników wynika, że ​​najwolniejsze części są podczas dekodowania PNG.

Zastanawiamy się, czy nie byłoby dekodera PNG, którego moglibyśmy użyć, aby zmniejszyć czas dekodowania PNG. Rozważaliśmy również zachowanie obrazów nieskompresowanych na dysku twardym, ale wtedy każdy obraz miałby rozmiar 10 MB zamiast 1 MB, a ponieważ na dysku twardym przechowywanych jest kilkadziesiąt tysięcy tych obrazów, nie można przechowywać ich wszystkich bez kompresja.

EDYCJA: Więcej przydatnych informacji:

Benchmark symuluje ładowanie 20 obrazów PNG i ich łączenie. Odpowiada to w przybliżeniu rodzajowi żądań, które otrzymamy w środowisku produkcyjnym.Każdy obraz użyty w kompozycji ma rozmiar 1600x1600.Rozwiązanie obejmie aż 10 serwerów równoważenia obciążenia, takich jak ten, który tutaj omawiamy. Tak więc dodatkowe wysiłki związane z rozwojem oprogramowania mogą być warte oszczędności na kosztach sprzętu.Buforowanie zdekodowanych obrazów źródłowych jest czymś, co rozważamy, ale każda kompozycja będzie najprawdopodobniej wykonywana z całkowicie różnych obrazów źródłowych, więc chybienie pamięci podręcznej będzie wysokie, a przyrost wydajności - niski.Testy porównawcze zostały przeprowadzone przy użyciu brzydkiej karty graficznej, więc możemy spodziewać się, że dekodowanie PNG będzie jeszcze bardziej wąskim gardłem przy użyciu przyzwoitej karty graficznej.