2012-06-09 15 views
6

W Javie, jak drogie jest zrobić Obsada:Jak kosztowne jest wykonywanie operacji rzutowania Vs i ++?

(MyObject) IObject; 

versus:

i++; 

zakładając "int i = n" poprzedzający go.

EDIT:

Lekceważenie mój bezpośrednie porównanie z (i ++) na sekundę, jeśli będzie proszę. Pozwolę sobie na zmianę tego sformułowania w bardziej ogólny sposób: w jaki sposób generalnie jest ono kosztowne? Wybierz operację odniesienia lepiej niż mój naiwny przykład "i ++", weź prostą deklarację zmiennej i przypisz na przykład, w jaki sposób wykonanie rzutowania porównuje się z tym pod względem kodu bajtowego/operacji VM?

Użyłem i ++ jako miarki. To był bardzo zły pomysł. Kiedy wybrali "metr" jako punkt odniesienia, zrobili znacznie lepiej. Czy istnieje podstawowa jednostka miary kosztów operacyjnych w Javie? JVM op? Przypuszczam, że będzie to zależało od kodu natywnego, na którym oprawa Java op się komplikuje ... anwyay, jak droga jest rzucanie? (Wybrać drążek pomiarowy dla mnie, jestem zły na to)

+6

Jaki jest związek między tymi dwoma operacjami? Sprawiasz, że brzmi to tak, jakby można je było wymieniać, w przeciwnym razie dlaczego porównałbyś ich "koszt"? – Tudor

+0

Co? ... co próbujesz zrobić? – Brendan

+0

Wow .. -3 w kilka minut .. nie nasza najlepsza godzina. Próbuję ustalić, jak kosztowne jest rzucanie w ogóle Vs trywialną operacją. – Robottinosino

Odpowiedz

1

zrobię krótką odpowiedź na 2 części (jak drogie jest odlewanie):

odlewania jest bardzo tanie i mocno zoptymalizowany gdzie liczy . if (o instanceof Clazz) ((Clazz)o) jest całkowicie bezpłatny (obsada, a nie samo sprawdzenie).

Ogólnie, jeśli obsada może być sprawdzona przez kompilator i stała złożona, nie będzie to nic kosztować. W przeciwnym razie potrzebne jest obciążenie w nagłówku obiektu w celu określenia klasy. Niektóre maszyny JVM mogą wykorzystywać trochę wskaźnika do przechowywania klasy, tak ważne jest to. W każdym razie, nawet ładunek może być tani i trafić do pamięci podręcznej L1. Praktycznie wszystkie gałęzie odlewów są poprawnie przewidywane przez sprzęt - wyobraź sobie, jak mało prawdopodobne jest uzyskanie klasy ClassCastException (powolna ścieżka - i nie ma znaczenia optymalizacja pod tym względem).

Tablice są generalnie znacznie szybsze niż kolekcje i ich generics z wielu powodów, ale samo rzucanie odgrywa bardzo małą rolę.

Ostatnia: rażąca "miara", tj. Mikrobieczka jest często przerażającym pomysłem, pomiar wydajności aplikacji jako całości jest właściwą drogą. Microbenchmarks wymagają głębokiego zrozumienia, w jaki sposób JVM optymalizuje (lub nie) i musisz mieć pewność, że porównujesz to, czego naprawdę potrzebujesz. Overall it's an art on its own.

Powiązane problemy