2012-05-11 12 views
11

Patrząc do kodu źródłowego klasy java.nio.DirectByteBuffer, znalazłem to:Jaki jest cel zamiany bitowej wartości int na zero?

if ((length << 0) > Bits.JNI_COPY_TO_ARRAY_THRESHOLD) .... 

Jaki jest cel przesunięcie długości przez zero bitów? Czy może to być optymalizacja wydajności lub coś innego?

+7

Nigdy nie widziałem tego słowa w tytule publikacji używanym w tym kontekście. – Marc

+0

Dobre pytanie. Spojrzałem na kod źródłowy i zauważyłem, że ten idiom jest używany kilka razy. Tajemniczy. –

+1

Niektórzy faceci chcieli sprawdzić, czy javac poprawnie je usuwa. –

Odpowiedz

3

Wykonanie i << 0 jest bez op. Wynik jest taki sam jak i.

+3

To wyjaśnia wyjście operacji, ale tak naprawdę nie wyjaśnia prawdziwego pytania - po co pisać kod, aby to zrobić? –

+1

Pytanie brzmiało: * Jaki jest cel *, a moja odpowiedź wskazuje, że nie może mieć sensownego celu. – aioobe

+1

@mattb - Jeśli zamierzasz odkurzyć odpowiedź, opłaca się zrozumieć, co właściwie mówią słowa pytania, dosłownie. –

16

Myślę, że go rozwiązałem.

W Javadocs klasy:

// -- This file was mechanically generated: Do not edit! -- // 

Więc to nie jest ręcznie kodowane. Został wygenerowany przez skrypt, a autor skryptu nie dodał optymalizacji dla przypadku, gdy wartość przesunięcia bitowego o zero.

+0

W przypadku ShortBuffer, IntBuffer, LongBuffer przesunięcia są mnożone przez 2, 4, 8 itd. Przez przesunięcie w lewo. Zoptymalizowanie przypadku << 0 skomplikuje kod generowania bez żadnych praktycznych korzyści. – AutomatedMike

2

Urządzenie i << 0 jest wyraźnie zbędne. Nie ma żadnego powodu, dla którego programista Javy mógłby celowo pisać ten kod.

Powiedziałbym, że ten kod jest:

  • napisany przez kogoś, kto nie myślał,
  • napisany przez kogoś, kto nie rozumie, co robi operator <<,
  • wynikiem częściowo mechanicznego refaktoryzacji lub
  • pierwotnie wyprodukowanego przez generator kodu lub tłumacz.

Istnieje jednak duża szansa, że ​​kod bajtowy lub kompilator JIT zoptymalizuje to, lub nie wpłynie znacząco na wydajność.