Jestem w trakcie przenoszenia na pewien algorytm przetwarzania danych z Java do C++. Powodem ponownego napisania kodu jest przenośność, musi działać w środowiskach, w których Java nie jest dostępna. Jednak jako korzyść uboczna oczekiwano poprawy wydajności.Jak droga jest .getClass() w Javie?
Zasadniczo algorytm odczytuje dane z wykresu złożonego z obiektów ze wskaźnikami, a następnie oblicza wynik. Podczas obliczeń dokonywane są liczne alokacje obiektów, więc być może jest to odpowiedzialne za spowolnienie. Chodzi o to, że kod C++ działa obecnie około 10 razy szybciej niż stary kod Java. To było naprawdę nieoczekiwane. Pomyślałem tylko, że widzę poprawę na poziomie 50-60%.
Niestety, nie mam prawa publikować tutaj kodu do analizy. To kilka tysięcy linii, więc nie jestem pewien, jak by to było wygodnie.
Chodzi o to, że algorytm jest prawie taki sam. Jedyną istotną różnicą, o której mogę myśleć jest to, że w Javie istnieje wiele klas potomnych pojedynczej super klasy i jeśli (object.getClass() == daughterx.class) jest wywoływana wiele razy podczas obliczeń, podczas gdy w kodzie C++ tylko jeden ogólny używana jest klasa (ponieważ istnieje niewiele różnic w kodzie między klasami potomnymi) i używane jest proste porównanie liczb całkowitych, np. if (object-> type == 15)
Jak droga jest metoda Object.getClass() w Javie? Co dokładnie dzieje się na niskim poziomie, gdy ta metoda jest przywoływana?
@ xlc0212 Ani są którykolwiek z pozostałych osób, które nie rozumieją języka Java ! ;) – cheeken
@cheeken to zależy od JVM, bez JIT, pamiętam, czytałem skądś, że Java jest nawet wolniejsza niż python –
Szczerze mówiąc brzmi to jak nie problem. Czy warto poświęcić swój czas na testowanie i profilowanie wycofanego kodu? Dopóki tego nie zrobisz, nie ma sposobu by wiedzieć, że '.getClass()' jest wąskim gardłem. Odgadywanie nie jest dobrym sposobem na rozwiązanie problemów z wydajnością, chyba że można znacznie zmniejszyć ogólną złożoność algorytmu (tj. Przejście z operacji N-kwadratowej do operacji log-N), a zestaw danych jest bardzo duży. –