[英]Will Thread.SpinWait be inlined when called?
我有以下代码:
while(flag)
{
Thread.SpinWait(1);
}
以下是在Rotor(sscli20\\clr\\src\\vm\\comsynchronizable.cpp)
实现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
吗?
如果不是这样,则在每个循环周期中,它将在stack operations(push and pop)
上花费更多的时间,并消耗更多的CPU执行资源。
如果是,那么当ThreadNative::SpinWait
被实现为标准函数指令序列(包括堆栈操作(push和pop))时, clr
如何实现?
通过测试Eren,在调试模式下不会发生任何内联。 是否有可能进行clr优化并生成内联代码?
摘要 :谢谢您的回答。 我希望有一天clr可以通过诸如MethodImplOptions.InternalCall之类的一种机制内联预编译的代码。 然后,它可以消除堆栈操作,并花费大量时间检查标志和旋转等待(比nop消耗更少的cpu资源)。
最好尝试看看。 样例代码:
static void Main(string[] args)
{
while (true)
Thread.SpinWait(1);
}
优化的拆卸显示:
86:
00000000 push ebp
00000001 mov ebp,esp
00000003 mov ecx,1
00000008 call 6F11D3FE
0000000d jmp 00000003
64位:
00000000 sub rsp,28h
00000004 mov ecx,1
00000009 call 000000005F815434
0000000e jmp 0000000000000004
00000010 add rsp,28h
00000014 ret
因此,在任何情况下都没有内联 。
也许我缺少了一些东西,但是我不太明白为什么您关心堆栈操作,因为旋转CPU总是消耗周期(整个目的是不屈服)。
不,抖动不能内联预编译的C ++代码,只能内嵌以IL开头的托管代码。
这与SpinWait()调用完全无关。 等待旋转的目的是让处理器执行代码,而不是支付线程上下文切换的成本。 期望该标志将在10,000 cpu或更短的时间内变为false 。 什么样的代码都没有关系。 CALL是执行代码的一种好方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.