2010-03-26 10 views
5

Czy istnieje powód, aby sądzić, że operatory przesunięcia bitowego w języku Java (podpisane) i >>> (bez podpisu) działają inaczej? Nie mogę wykryć żadnej różnicy na mojej maszynie.Czy kiedykolwiek występowała jakakolwiek inna wydajność pomiędzy Java >> i >>> operatory przesunięcia w prawo?

To jest czysto akademickie pytanie; nigdy nie będę wąskim gardłem, na pewno. Wiem: najlepiej napisać, co masz na myśli; użyj >> dla dzielenia przez 2, na przykład.

Zakładam, że sprowadza się do tego, które architektury mają, które operacje zostały wykonane jako instrukcja.

+0

Myślę, że oba zostaną przekonwertowane na natywne instrukcje procesora (logiczne/arytmetyczne, przesunięcie w prawo), które ostatecznie mają podobne cykle. – kennytm

+4

Nie, używaj '/ 2' do dzielenia przez 2. –

+1

+1, aby umożliwić mi sprawdzenie operatora >>>. I nie lekceważ optymalizacji, którą robi kompilator. Często optymalizacja na tym poziomie może nawet pogorszyć sytuację. – Thirler

Odpowiedz

3

Nie. Twój kompilator przetłumaczy je na kod bajtowy, a JVM zinterpretuje kod bajtowy dla twojej architektury. Myślę, że można bezpiecznie założyć, że twoja architektura ma zestaw instrukcji, który obejmuje obie operacje wykonywane w kilku cyklach zegara.

W każdym razie jest różnica w zachowaniu tych operatorów, więc nie jest tak, że można je wymieniać.

+0

@Tim Bender: +1 ... W świecie x86, * ">> 1" *, ponieważ P4 był tylko jednym cyklem, a ponieważ architektura P6 * ">> any" * to tylko jeden cykl AFAIK. – SyntaxT3rr0r

+0

Myślę, że to było moje pytanie: czy wspólne architektury implementują się zarówno jako instrukcje? I tak jak powiedziałem, dotyczy to tylko przypadków, w których zachowanie jest identyczne (nieujemne liczby całkowite). –