c# - 调用 Thread.SpinWait 时会内联吗?

标签 c# clr

我有以下代码:

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执行资源。

如果是,如何clrThreadNative::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/

相关文章:

c# - 创建文件夹并将文件集复制到本地磁盘

c# - Ajax 调用 .Net 并发送回 cookie

c# - 为什么改DataSource后DataGridView只显示排序后的行?

.net - 托管堆和GC堆有什么区别

c# - WPF 网格不显示滚动条

c# - 我可以查明是否没有线程在等待信号量吗?

c# - 可以将 DLL 合并到 .NET EXE 中吗?

c# - C# 和 Java 之间的主要区别是什么?

c# - 使用 SQL 过程替换文件中的字符串

c# - C# 7.0 中通过引用返回的值是存储在堆栈中还是堆中?