簡體   English   中英

調用時將內聯Thread.SpinWait嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM