首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

盘点.NET JIT在Release下由循环体优化所产生的不确定性Bug

目录 循环变量优化 性能差异 潜在的Bug 循环变量不变 stackalloc不清零 IL代码无论在哪种环境都会始终表现C#代码的原意,因此,下文的示例将不在描述IL的部分,只描述在debug和release...L001d: lea edx, [ebp-0xc] L002b: jge short L001d 这种情况源自JIT内部对stackalloc内联的判断逻辑不够具体,这个bug目前已经被修复,将添加在未来...我给出了几个参考: 如果逻辑允许的话,尽可能的将stackalloc提出循环外 使用同等宽度字节进行初始化而不是stackalloc,如 long 使用Span去创建Stackalloc,且通过Span.Clear...为方法标记[MethodImpl(MethodImplOptions.NoInlining)] 当然,如果通过stackalloc分配的内存超出32字节,则不必担心会出现本例中的情况,因为目前来说,JIT...不会内联stackalloc分配超出32字节的方法。

60220

C# 7.3新特性一览

栈分配数组 C#中有一个很少使用单相当重要的特性,就是能够通过stackalloc关键字在栈上分配数组。与分配在堆上、会导致GC压力的普通数组相比,这可能会提供更好的性能。...int* block = stackalloc int[3] { 1, 2, 3 }; 使用栈分配数组有点危险。因为它需要持有一个指向栈的指针,而且只能用于不安全的上下文中。...Span block = stackalloc int[3] { 1, 2, 3 }; 注意,Span依赖于NuGet包System.Memory。...栈分配数组 C#中有一个很少使用单相当重要的特性,就是能够通过stackalloc关键字在栈上分配数组。与分配在堆上、会导致GC压力的普通数组相比,这可能会提供更好的性能。...Span block = stackalloc int[3] { 1, 2, 3 }; 注意,Span依赖于NuGet包System.Memory。

1.1K30

在 C# 中使用 Span 和 Memory 编写高性能代码

.NET 中支持的内存类型 .NET 中,开发者能够使用的三种内存类型,分别是: Stack memory 堆栈内存: 驻留在堆栈中,并使用stackalloc 关键词分配; Managed memory...与下列任一项一起使用 Arrays Strings Native buffers 本地缓冲区 可以转换为 Span 的类型列表如下: Arrays Pointers 指针 IntPtr 指针 stackalloc...开发者可以将以下所有内容转换为 ReadOnlySpan : Arrays Pointers 指针 IntPtr 指针 stackalloc string Span 是一个仅堆栈类型, 准确地说它是一个...关键字在堆栈内存中分配 Span,如下所示: byte data = 0; Span span = stackalloc byte[100]; for (int index = 0; index...开发者可以通过使用 stackalloc 关键字来分配堆栈上的内存,该关键字分配一个未初始化的块,该块是 T[size]类型的实例。

2.8K10
领券