我知道不安全的代码比编写更多性能更好的代码更适合访问Windows API和进行不安全的类型强制转换,但是我想问问您,您是否注意到通过以下方式在实际应用程序中有显着的性能改进?与安全的C#代码相比,可以使用它。
某些性能指标
性能好处没有您想像的那么大。我用C#中的正常托管数组访问与不安全指针进行了一些性能测量。
基于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上的源代码。
可以在非常专业的环境中使用不安全的代码,以显着提高性能。这些方案之一是遍历值类型数组。使用不安全的指针算术比使用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...
}
}
这里的主要好处是我们已经完全取消了数组索引检查。。
尽管性能非常好,但是这种代码很难处理,非常危险(不安全),并且破坏了一些基本准则(可变结构)。但是肯定有适合这种情况的场景...