Czy rotacje bitowe są wolniejsze niż zmiany w obecnym procesorze Intel?
Byłem ciekawy, czyjava.lang.Integer.rotateLeft
zostaje zoptymalizowany za pomocą instrukcji rotacji i napisał dla niego test porównawczy. Wyniki były niejednoznaczne: było znacznie szybsze niż dwie zmiany, ale nieco wolniejsze niż pojedyncza. Przepisałem to w C ++ i uzyskałem te same wyniki. Podczas kompilacji przezg++ -S -Wall -O3
Widzę instrukcję wwygenerowany asembler. Mój procesor to Intel Core i5.
Thereper jest dość długi i na pewno nie najładniejszy kawałek kodu, ale nie sądzę, żeby był zepsuty. Albo to jest? Zgodnie z dokumentacją rotacje mają jeden cykl, podobnie jak zmiany. Czy ktoś może wyjaśnić wyniki?
rotations: 6860
shift: 5100
Pierwsze dwie odpowiedzi są błędne. Zarówno gcc, jak i java JIT znają instrukcje rotacji i używają ich. Jeśli chodzi o gcc, zobacz link powyżej, dotyczący java zobacz mójjava benchmark i jego wyniki
benchmark ns linear runtime
Rotate 3.48 ====================
NonRotate 5.05 ==============================
Shift 2.16 ============