Projekt to narzędzie benchmarkingowe (test wydajnościowy) napisane w języku C#, służące do analizy porównawczej algorytmów przetwarzania obrazu. Głównym celem aplikacji jest zademonstrowanie różnic w szybkości działania oraz zarządzaniu pamięcią pomiędzy dwoma skrajnymi podejściami do manipulacji pikselami w środowisku .NET:
- Nienadzorowanym (Unsafe) – niskopoziomowym, wykorzystującym wskaźniki.
- Nadzorowanym (Managed) – bezpiecznym, operującym na strukturach zarządzanych.
Program aplikuje filtry konwolucyjne (splotu) o wielkości macierzy 5x5 na wczytany plik graficzny (w formatach 24bpp i 32bpp), precyzyjnie mierzy czas wykonania operacji oraz pozwala zbadać, jak mechanizm oczyszczania pamięci (Garbage Collector) wpływa na ogólną wydajność CPU.
- Porównanie dwóch paradygmatów pamięci:
- Direct Access (Unsafe Mode): Wykorzystuje blokowanie pamięci bitmapy w pamięci RAM za pomocą
LockBitsoraz bezpośredni dostęp do bajtów przez wskaźniki (byte*). Ta metoda omija narzut sprawdzania granic tablic i jest dodatkowo zoptymalizowana wielowątkowo przy użyciuSystem.Threading.Tasks.Parallel.For. - Managed 2D Array Mode: Kopiuje całą zawartość obrazu do dwuwymiarowej tablicy zarządzanej
byte[,]za pomocąMarshal.CopyiBuffer.BlockCopy. Wykonuje operacje w sposób bezpieczny dla środowiska uruchomieniowego, lecz wiąże się to z większą alokacją pamięci i niższa wydajnością.
- Direct Access (Unsafe Mode): Wykorzystuje blokowanie pamięci bitmapy w pamięci RAM za pomocą
- Wbudowana biblioteka filtrów 5x5 (Convolution Kernels):
GaussianBlur5x5– Rozmycie Gaussa (filtr domyślny)BoxBlur5x5– Proste rozmycie pudełkoweSharpen5x5– Wyostrzanie krawędzi i detaliLaplacian5x5– Detekcja krawędzi (operator Laplace'a)Identity5x5– Filtr neutralny (kopia 1:1)
- Automatyczna normalizacja filtrów: Algorytm samoczynnie sprawdza i przelicza wagi macierzy, zapewniając, że ich suma wynosi 1. Zapobiega to niezamierzonemu rozjaśnieniu lub ściemnieniu obrazu wynikowego.
- Testowanie wpływu Garbage Collectora: Aplikacja oferuje opcję wymuszenia pełnej kolekcji GC (
GC.Collect()orazGC.WaitForPendingFinalizers) bezpośrednio przed pomiarem, co pozwala sprawdzić realny wpływ zarządzania pamięcią na wydajność. - Zapis wyników: Przetworzone obrazy są automatycznie zapisywane w dedykowanym folderze
obrazy_wynikowena Pulpicie użytkownika z unikalną nazwą określającą metodę, filtr i status GC.
Przed uruchomieniem projektu należy upewnić się, że spełnione są poniższe warunki:
Ponieważ metoda bezpośrednia używa wskaźników, w pliku projektu (.csproj) lub we właściwościach projektu w Visual Studio należy zaznaczyć opcję Allow unsafe code:
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>