Atom

2010
23
mar

Dlaczego NIE powinieneś testować wydajności różnych języków programowania?

Kategoria: Programowanie, TechblogMatthew @ 00:02

Co jakiś na różnych forach, grupach dyskusyjnych, blogach, zebraniach czy przy okazji jakiś wykładów przewija się temat wyższości jednego języka programowania nad drugim. Częstym argumentem w tej „konstruktywnej” debacie jest wydajność tych języków w przypadku kawałków kodów, które powinny robić mniej więcej to samo. Jednak czy robią to samo, w ten sam sposób?

Jakiś czas temu natrafiłem na Hacker News (kto jeszcze nie ma feeda tego serwisu w swoim czytniku, niech szybko naprawi ten błąd) na dość stary wpis (bo z 2008) z bloga Dhananjay’a Nene’a, którego celem było porównanie wydajności C++, Java, Python, Ruby, Jython, JRuby oraz Groovy. I co ciekawe, w pierwszej wersji wpisu (przed komentarzami, sugestiami oraz własnymi wersjami kodu, czytelników) Java jest dwa razy szybsza od C++. Jak to możliwe?

Szczegółem, różniącym te dwa języki, a mającym wpływ na wydajność był sposób zarządzania pamięcią. Java, w przeciwieństwie do C++, alokowała na samym początku, pewien obszar pamięci, który wykorzystywała ponownie przy następnym iteracjach. C++ natomiast, za każdym razem prosił system o przydzielenie pewnego obszaru pamięci. Gdy jeden z czytelników zaproponował rozwiązanie bardziej odpowiadające charakterystyce zarządzania pamięcią przez Javę, C++ bez trudu wysunął się na prowadzenie.

W czym tak w zasadzie leży problem wydajności? Od dość dawna wiadomo, że kolejność języków od najszybszego do najwolniejszego wygląda mniej więcej tak: assembler, C, C++, Java, itd. (dalszej wyliczanki nie będę się podejmował, bo to nie mój obszar zainteresowania i nie chcę rozpoczynać głupich wojen). Jakiekolwiek odchyły od ten reguły są spowodowane złym napisaniem kodu testującego (brak znajomości języków przez osoby testujące?) lub „za dobrym” napisaniem kompilatorów, interpreterów, maszyn wirtualnych czy bibliotek dla „wolniejszych” języków. Dawno temu ktoś się chwalił, że kawałek kodu w Ruby jest szybszy od kodu w C++ (a może chodziło o różnice wydajności między Ruby a JRuby?). Oczywiście sam kod szybszy nie był, tylko biblioteka (interpreter?) z której korzystał była napisana w bardziej optymalny sposób.
Innym przykładem pokazującym znaczenie algorytmów i optymalizacji była moja przygoda ze spojem na pierwszym roku studiów, gdzie pisząc programy w C++ zdarzało mi się (oczywiście nie zawsze, aż takim genialnym programistą nie jestem, chociaż bym chciał ;)) bić na głowę rozwiązania zadań napisane w C, uzyskując przy tym najlepsze czasy. A to tylko dlatego, że potrafiłem znaleźć szybszą drogę do osiągnięcia celu.

Wpis pozwolę sobie zakończyć dwoma cytatami:

Przedwczesna optymalizacja jest podstawą wszelkiego zła.D. Knuth

Z drugiej strony, nie możemy ignorować efektywnościJon Bentley

Dla wydajności, oprócz tego w czym piszemy, jest ważne jak to piszemy

Zostaw komentarz

Subscribe without commenting