我有以下代码:
while(flag)
{
Thread.SpinWait(1);
}
以下是 SpinWait
的实现在Rotor(sscli20\clr\src\vm\comsynchronizable.cpp)
FCIMPL1(void, ThreadNative::SpinWait, int iterations)
{
WRAPPER_CONTRACT;
STATIC_CONTRACT_SO_TOLERANT;
for(int i = 0; i < iterations; i++)
YieldProcessor();
}
FCIMPLEND
威尔Thread.SpinWait
调用时内联?
如果不是,在每个loop周期中,它会花更多的时间在stack operations(push and pop)
上并消耗更多的CPU执行资源。
如果是,如何clr
在 ThreadNative::SpinWait
的同时完成这项工作是作为标准功能指令序列实现的,包括堆栈操作(push 和 pop)?
通过Eren的测试,debug模式下没有inline发生。 是否可以clr优化生成内联代码?
总结:感谢您的回答。我希望有一天 clr 可以通过一种机制(例如 MethodImplOptions.InternalCall)内联预编译代码。然后它可以消除堆栈操作并将大部分时间花在检查标志和旋转等待上(消耗比 nop 更少的 cpu 资源)。
最佳答案
最好试试看。示例代码:
static void Main(string[] args)
{
while (true)
Thread.SpinWait(1);
}
优化反汇编显示:
x86:
00000000 push ebp
00000001 mov ebp,esp
00000003 mov ecx,1
00000008 call 6F11D3FE
0000000d jmp 00000003
x64:
00000000 sub rsp,28h
00000004 mov ecx,1
00000009 call 000000005F815434
0000000e jmp 0000000000000004
00000010 add rsp,28h
00000014 ret
所以在这两种情况下都没有内联。
也许我遗漏了什么,但我不太明白为什么您关心堆栈操作,因为无论如何旋转 CPU 都会消耗周期(整个目的是不让步)。
关于c# - 调用 Thread.SpinWait 时会内联吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19701664/