真正的不安全代码性能

问题描述 投票:22回答:6

我知道不安全的代码比编写更多性能更好的代码更适合访问Windows API和进行不安全的类型强制转换,但是我想问问您,您是否注意到通过以下方式在实际应用程序中有显着的性能改进?与安全的C#代码相比,可以使用它。

c# performance unsafe
6个回答
25
投票

某些性能指标

性能好处没有您想像的那么大。

我用C#中的正常托管数组访问与不安全指针进行了一些性能测量。


来自在Visual Studio 2010,.NET 4外部使用任何CPU发布基于以下PC规范的版本:

基于x64的PC,1个四核处理器。 Intel64 Family 6 Model 23 Steping 10 GenuineIntel〜2833 Mhz。

Linear array access 00:00:07.1053664 for Normal 00:00:07.1197401 for Unsafe *(p + i) Linear array access - with pointer increment 00:00:07.1174493 for Normal 00:00:10.0015947 for Unsafe (*p++) Random array access 00:00:42.5559436 for Normal 00:00:40.5632554 for Unsafe Random array access using Parallel.For(), with 4 processors 00:00:10.6896303 for Normal 00:00:10.1858376 for Unsafe
请注意,不安全的*(p++)习惯用法实际上运行得较慢。我猜想这破坏了编译器的优化,该优化在安全版本中组合了循环变量和(由编译器生成的)指针访问。

github上的源代码。


15
投票
如其他文章所述,您

可以在非常专业的环境中使用不安全的代码,以显着提高性能。这些方案之一是遍历值类型数组。使用不安全的指针算术比使用for-loop / indexer的常规模式要快得多。struct Foo { int a = 1; int b = 2; int c = 0; } Foo[] fooArray = new Foo[100000]; fixed (Foo* foo = fooArray) // foo now points to the first element in the array... { var remaining = fooArray.length; while (remaining-- > 0) { foo->c = foo->a + foo->b; foo++; // foo now points to the next element in the array... } }

这里的主要好处是我们已经完全取消了数组索引检查。。

尽管性能非常好,但是这种代码很难处理,非常危险(不安全),并且破坏了一些基本准则(可变结构)。但是肯定有适合这种情况的场景...


14
投票
一个很好的例子是图像处理。通过使用指向其字节的指针(需要不安全的代码)来修改像素要快得多。

1
投票
嗯,我建议您阅读此博客文章:MSDN blogs: Array Bounds Check Elimination in the CLR

1
投票
我正在将不安全的代码用于视频处理代码。在这样的代码中,您希望它在没有内部检查值等的情况下尽可能快地运行。没有不安全的属性,我将无法跟上30fps或60fps的视频流。 (取决于使用的相机)。

0
投票
对于所有正在查看这些答案的人,我想指出的是,即使答案非常好,但很多罪恶已经改变,答案已经发布。
© www.soinside.com 2019 - 2024. All rights reserved.