 |
|
14
secondwtq Mar 27, 2020 1
拿 11 楼的例子粗略看了一下
36 ms 的汇编: 0x00007f6130116540: mov r9d,r13d ;*goto ; - Benchmark::doTest@30 (line 8) 0x00007f6130116543: or ebx,0x7b ;*ior ; - Benchmark::doTest@25 (line 10) 0x00007f6130116546: mov r13d,r9d 0x00007f6130116549: add r13d,0x10 ;*iinc ; - Benchmark::doTest@27 (line 8) 0x00007f613011654d: cmp r13d,0x773593f1 0x00007f6130116554: jl 0x00007f6130116540 ;*if_icmpge ; - Benchmark::doTest@17 (line 8) 531 ms 的汇编: 0x00007f5b8d070650: mov r9d,r13d ;*goto ; - Benchmark::doTest@27 (line 8)
0x00007f5b8d070653: or r14d,ebx 0x00007f5b8d070656: or r14d,ebx 0x00007f5b8d070659: or r14d,ebx 0x00007f5b8d07065c: or r14d,ebx 0x00007f5b8d07065f: or r14d,ebx 0x00007f5b8d070662: or r14d,ebx 0x00007f5b8d070665: or r14d,ebx 0x00007f5b8d070668: or r14d,ebx 0x00007f5b8d07066b: or r14d,ebx 0x00007f5b8d07066e: or r14d,ebx 0x00007f5b8d070671: or r14d,ebx 0x00007f5b8d070674: or r14d,ebx 0x00007f5b8d070677: or r14d,ebx 0x00007f5b8d07067a: or r14d,ebx 0x00007f5b8d07067d: or r14d,ebx 0x00007f5b8d070680: or r14d,ebx ;*ior ; - Benchmark::doTest@22 (line 10)
0x00007f5b8d070683: mov r13d,r9d 0x00007f5b8d070686: add r13d,0x10 ;*iinc ; - Benchmark::doTest@24 (line 8)
0x00007f5b8d07068a: cmp r13d,0x773593f1 0x00007f5b8d070691: jl 0x00007f5b8d070650 ;*if_icmpge
可见两边都做了 16 次的 unroll,两边的时间基本也是差 16 倍左右 但是大概这里编译器并不知道 outer scope 的变量具体是什么值,所以如果不在循环内赋值,就会强行做 16 次 or 感觉这个优化还没开全 ... 这 16 次 or 换成一次是一样的 当然全都优化之后是个常数,就量不出时间了
|