C# Marshal.PtrToStringUni()与新字符串()?

C# Marshal.PtrToStringUni()与新字符串()?,c#,.net,marshalling,unmanaged,unsafe,C#,.net,Marshalling,Unmanaged,Unsafe,假设我有一个指向unicode字符串的char*类型指针,我知道长度: char* _unmanagedStr; int _unmanagedStrLength; 我有两种方法将其转换为.NET字符串: Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength); 及 在我的测试中,两个调用都给出了完全相同的结果,但是newstring()比Marshal.PtrToStringUni()快1.8倍 为什么会出现这种性

假设我有一个指向unicode字符串的char*类型指针,我知道长度:

char* _unmanagedStr;
int _unmanagedStrLength;
我有两种方法将其转换为.NET字符串:

Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength);

在我的测试中,两个调用都给出了完全相同的结果,但是
newstring()
Marshal.PtrToStringUni()
快1.8倍

为什么会出现这种性能差异?
两者之间还有其他功能上的区别吗?

第二个是不符合CLS的,需要不安全的代码,并且可能有不确定的行为,这就是为什么它可能更快的原因。还需要指向非托管地址的指针,否则垃圾收集器可能会重新分配它,从而导致代码更加混乱。除非您已经确定这是应用程序的瓶颈,否则您可能希望使用该函数。

从可用的源代码(Rotor)判断,System.String(Char*)构造函数通过CtorCharPtr()使用高度优化的代码路径,它使用FastAllocateString()分配字符串。McSal.ptrtoString()遵循完全不同的代码路径,它是用C++编写的,并且看起来是复制两次字符串,而没有“快速分配器”的好处。 显然,不是同一个程序员在做这个。几乎可以肯定,甚至不是同一个团队,因为代码适合不同的编程模型。最接近的共同管理者可能是四级以上

不确定这会有什么帮助,请使用快速的。意外事件会在Windows上产生类似的异常

new string(_unmanagedStr, 0, _unmanagedStrLength);