Marshal.PtrToStringUni()与新的String()?
-
19-09-2019 - |
题
假设我有类型char *为Unicode字符串的指针,然后我知道长度:
char* _unmanagedStr;
int _unmanagedStrLength;
和我有2种方式把它转换到.NET字符串:
Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength);
和
new string(_unmanagedStr, 0, _unmanagedStrLength);
在我的测试中,无论是来电给我完全相同的结果,但new string()
就像是1.8倍倍Marshal.PtrToStringUni()
快。
,这是为什么性能差异? 是否有任何之间的另一种功能差异的两个?
解决方案
从可用的源代码(转子)来看,System.String(CHAR *)构造使用通过CtorCharPtr()的重优化的代码路径,它分配同FastAllocateString()的字符串。 Marshal.PtrToStringUni()如下一种完全不同的代码路径,它是用C ++和看起来是复制串两次,没有一个“快分配器”的益处。
显然,不一样的程序员制作此。几乎可以肯定,即使不因为代码在同一支球队适应不同的编程模型。在常见的最接近的经理很可能是四个层次了。
不知道如何将是有益的,使用快速之一。硬伤会产生类似的一种在Windows上的异常。
其他提示
二是不符合CLS,需要不安全的代码,并可能有不确定的行为,这就是为什么可能它的速度更快。还有一个需要销指针非托管的地址或垃圾收集器可能会重新分配这其中leades一个更加混乱的代码。除非你确定这是你的应用程序的瓶颈,你可能会想使用的 PtrToStringUni 功能。
不隶属于 StackOverflow