What makes this function run much slower?

后端 未结 3 1439
有刺的猬
有刺的猬 2021-01-30 04:58

I\'ve been trying to make an experiment to see if the local variables in functions are stored on a stack.

So I wrote a little performance test

function t         


        
3条回答
  •  日久生厌
    2021-01-30 05:48

    You're misunderstanding the stack.

    While the "real" stack indeed only has the Push and Pop operations, this doesn't really apply for the kind of stack used for execution. Apart from Push and Pop, you can also access any variable at random, as long as you have its address. This means that the order of locals doesn't matter, even if the compiler doesn't reorder it for you. In pseudo-assembly, you seem to think that

    var x = 1;
    var y = 2;
    
    x = x + 1;
    y = y + 1;
    

    translates to something like

    push 1 ; x
    push 2 ; y
    
    ; get y and save it
    pop tmp
    ; get x and put it in the accumulator
    pop a
    ; add 1 to the accumulator
    add a, 1
    ; store the accumulator back in x
    push a
    ; restore y
    push tmp
    ; ... and add 1 to y
    

    In truth, the real code is more like this:

    push 1 ; x
    push 2 ; y
    
    add [bp], 1
    add [bp+4], 1
    

    If the thread stack really was a real, strict stack, this would be impossible, true. In that case, the order of operations and locals would matter much more than it does now. Instead, by allowing random access to values on the stack, you save a lot of work for both the compilers, and the CPU.

    To answer your actual question, I'm suspecting neither of the functions actually does anything. You're only ever modifying locals, and your functions aren't returning anything - it's perfectly legal for the compiler to completely drop the function bodies, and possibly even the function calls. If that's indeed so, whatever performance difference you're observing is probably just a measurement artifact, or something related to the inherent costs of calling a function / iterating.

提交回复
热议问题