Wydajność czyli niespodziewany problem

Kto by się spodziewał, że tworząc projekt będę miał takie zmartwienia jak wydajność rysowania wykresów. Niby to nic trudnego. Stwórz listę punktów, narysuj linię między sąsiadami i gotowe. Dla stu punktów? Bez większego problemu. Dwieście? Proszę bardzo. Dwieście tysięcy? Ups.

Dwóch kandydatów na placu boju

W rozmowie z moim dużo bardziej doświadczonym kolegą dowiedziałem się, że sam borykał się kiedyś z tym samym problemem. Wtedy jedyną rozsądną i darmową alternatywą okazała się biblioteka ZedGraph, której ostatnia wersja wyszła we wrześniu 2012 roku (w momencie pisania tego postu biblioteka miała już 5 lat). Pisałem o niej w poście „Demo, kolejny etap projektu”. Od czasu naszej rozmowy przeprowadziłem mały research i oto co znalazłem.

LiveCHarts .NET

Darmowa, piękna biblioteka do rysowania wykresów. Autor chwali się, że jest wydajna ale można wycisnąć z niej więcej kupując od niego tzw. „geared Package”. Zależy mi jednak na tym aby biblioteka była darmowa więc za płatne rozszerzenie podziękuję.

Zatem szykuje się nam starcie pięknego, prężącego swoje muskuły młodzieńca ze starcem sprzed informatycznej epoki.

LiveCharts demoLiveCharts

ZedGraph demo. Wydajność nad wygląd.ZedGraph

Kto wyszedł zwycięsko z tego pojedynku?

Fight!

Test który przeprowadziłem polegał na wygenerowaniu i dodaniu do wykresu dużej ilości danych. Żadnej większej filozofii. Zwykła pętla for, 100 000 iteracji.

Na pierwszy ogień poszła biblioteka LiveCharts. Stworzyłem wykres liniowy zgodnie z przykładem z dokumentacji i dodałem do niego próbki w następujący sposób:

Efekt? Totalna klapa. Nie było nawet sensu mierzyć czasu wykonywania się powyższego kodu. Działało to wszystko tak wolno, że program przestawał być w jakimkolwiek stopniu użyteczny. Ale chwila! Autor w dokumentacji zamieścił zakładkę „Performance Tips”. Jest nadzieja.

I wiecie co? Nic. Przy tak dużej liczbie próbek biblioteka sobie po prostu nie radzi. Jak to wygląda w przypadku ZedGrapha? Zdecydowanie lepiej.

Przede wszystkim ZedGraph oferuje nam trochę inne podejście niż LiveCharts. Możemy wybrać moment, w którym kontrolka narysuje nam wykres z dodanych danych. Ku mojemu zdziwieniu wykresy działają płynnie i są w pełni interaktywne.

And the winner is…

Zed Graph

Bez dwóch zdań potyczkę wygrywa sędziwy i archaicznie wyglądający ZedGraph, który radzi sobie z na prawdę dużą ilością danych. Nie wiem jak sprawuje się płatna wersja LiveCharts ale jej darmowa wersja kuleje jeśli chodzi o wydajność.

Obie biblioteki mają jednak zasadniczą wadę. Nie potrafią rysować trójwymiarowych wykresów. Będę musiał jednak zadowolić się tym co mam. Jeśli znasz jakieś darmowe rozwiązanie, które pozwala rysować wydajnie trójwymiarowe wykresy to proszę o kontakt. Na pewno bardzo mi pomożesz!