DxC*_*xCK 7 .net c# unsafe unmanaged marshalling
假设我有一个char*类型的指针到unicode字符串,我知道长度:
char* _unmanagedStr;
int _unmanagedStrLength;
Run Code Online (Sandbox Code Playgroud)
我有2种方法将其转换为.NET字符串:
Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength);
Run Code Online (Sandbox Code Playgroud)
和
new string(_unmanagedStr, 0, _unmanagedStrLength);
Run Code Online (Sandbox Code Playgroud)
在我的测试中,两个调用都给出了完全相同的结果,但它new string()比1.8倍快Marshal.PtrToStringUni().
为什么这种性能差异?两者之间还有其他功能差异吗?
从可用的源代码(Rotor)判断,System.String(Char*)构造函数使用通过CtorCharPtr()的高度优化的代码路径,它使用FastAllocateString()分配字符串.Marshal.PtrToStringUni()遵循完全不同的代码路径,它是用C++编写的,并且看起来要复制字符串两次,没有"快速分配器"的好处.
显然,不是同一个程序员在这方面工作.由于代码适合不同的编程模型,因此几乎肯定不是同一个团队.最亲密的经理可能是四级.
不确定这有什么用,请使用快速的.Mishaps会在Windows上产生类似的异常.
第二个不符合CLS,需要不安全的代码,可能有不确定的行为,这就是为什么它可能更快.还有一个需要针的指针非托管地址或垃圾收集器可能会重新分配这其中leades一个更加混乱的代码.除非您确定这是您的应用程序的瓶颈,否则您可能希望使用PtrToStringUni函数.
| 归档时间: |
|
| 查看次数: |
2925 次 |
| 最近记录: |