gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:27:00 29 4
gpt4 key购买 nike

我有以下代码:

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com