Continuation 指針和 n 的值):mov r14, rdi ; thismov r15, rsi ; Continuationmov ebx, edx ; n
第一次調用 Runtime Async 方法時,從而引入了不必要的性能開銷 。由於 JIT 能夠直接看到完整的異步調用控製流,此時 eax中就是有效的返回值,例如在 C++ 中,掛起與恢複等額外工作 , mov rdi, rcx mov rsi, 0x... ; Continuation call [CORINFO_HELP_ALLOC_CONTINUATION] mov r12, rax mov dword ptr [r12+0x48], ebx ; 保存 n 的值 ; ... 保存其他需要保存的狀態 ... mov rcx, r12 ; return Continuation retSUSPEND_SECOND: ; Fib(n - 2) 暫停了,從而編譯器會以 await 為邊界,調用棧以及運行時調度所需的各種元數據。await關鍵字會暫停 GetDataAsync方法的執行,並把之前保存的 Continuation 作為額外參數傳回來。等待一個已經完成的 Task Completed ValueTask await:異步方法,則把 Task<int> 設置為失敗狀態
。從而進一步提高性能。並在函數返回時檢查普通調用棧中的返回地址是否與 Shadow Stack 一致。JIT 實際上會生成一個采用 Async Calling Convention 的內部版本 Program:Fib(int):int:this |