c代码本身很简单 for (i = 0; i< SIZE; i+=j){ arr[i] *=3; } 就是以一个步进值j遍历整个数组,对成员做*3操作。 O0的代码,步进的值在-24(%rbp)中: movq $0, -32(%rbp) jmp .L5 .L6: movq -32(%rbp), %rax movl arr(,%rax,4), %edx movl %edx, %eax addl %eax, %eax addl %eax, %edx movq -32(%rbp), %rax movl %edx, arr(,%rax,4) movq -24(%rbp), %rax addq %rax, -32(%rbp) .L5: cmpq $67108863, -32(%rbp) O1的代码,步进的值在 %rbx中: movl $0, %eax .L3: movl arr(,%rax,4), %ecx leal (%rcx,%rcx,2), %edx movl %edx, arr(,%rax,4) addq %rbx, %rax cmpq $67108863, %rax jle .L3 想问的问题是,在O0情况下,j = 1的时间是j=2时间的两倍,O1下,两者就基本接近了,甚至步进为1的还快点,为什么? 问题来源是:http://stackoverflow.com/questions/17914782/why-cache-doesnt-work-as-it-supposed-to-be/17915086#17915086 我自己改改O0的代码,变成如下: movq $0, -32(%rbp) movl $0, %eax movq -24(%rbp), %rbx jmp .L5 .L6: movl arr(,%rax,4), %edx movl %edx, %ecx addl %ecx, %ecx addl %ecx, %edx movl %edx, arr(,%rax,4) addq %rbx, %rax .L5: cmpq $67108863, %rax jle .L6 就和O1差不多了。 但是不明白,循环里改掉了几个movq,怎么j = 1的速度就和j = 2的差不多了?原因是什么? 谢谢了。