Why is if (variable1 % variable2 == 0) inefficient?

前端 未结 4 1117
我寻月下人不归
我寻月下人不归 2021-01-29 18:51

I am new to java, and was running some code last night, and this really bothered me. I was building a simple program to display every X outputs in a for loop, and I noticed a MA

4条回答
  •  时光说笑
    2021-01-29 19:29

    In follow-up to @phuclv comment, I checked the code generated by JIT1, the results are as follows:

    for variable % 5000 (division by constant):

    mov     rax,29f16b11c6d1e109h
    imul    rbx
    mov     r10,rbx
    sar     r10,3fh
    sar     rdx,0dh
    sub     rdx,r10
    imul    r10,rdx,0c350h    ; <-- imul
    mov     r11,rbx
    sub     r11,r10
    test    r11,r11
    jne     1d707ad14a0h
    

    for variable % variable:

    mov     rax,r14
    mov     rdx,8000000000000000h
    cmp     rax,rdx
    jne     22ccce218edh
    xor     edx,edx
    cmp     rbx,0ffffffffffffffffh
    je      22ccce218f2h
    cqo
    idiv    rax,rbx           ; <-- idiv
    test    rdx,rdx
    jne     22ccce218c0h
    

    Because division always takes longer than multiplication, the last code snippet is less performant.

    Java version:

    java version "11" 2018-09-25
    Java(TM) SE Runtime Environment 18.9 (build 11+28)
    Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11+28, mixed mode)
    

    1 - VM options used: -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,src/java/Main.main

提交回复
热议问题