[英]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.