我正在寻找一种可以快速将非托管字符串转换为托管字符串的函数。我在寻找Marshal.PtrToStringAnsi
,但它真的很慢。PtrToStrAnsi更快的替代?
我在.NET框架源代码请参见以下定义:
public static String PtrToStringAnsi(IntPtr ptr)
{
if (Win32Native.NULL == ptr) {
return null;
}
else if (IsWin32Atom(ptr)) {
return null;
}
else {
int nb = Win32Native.lstrlenA(ptr);
if(nb == 0) {
return string.Empty;
}
else {
StringBuilder sb = new StringBuilder(nb);
Win32Native.CopyMemoryAnsi(sb, ptr, new IntPtr(1+nb));
return sb.ToString();
}
}
}
为了提高我的应用程序的性能我创建的使用Marshal.PtrToStringAnsi(IntPtr的,int)方法下面的方法速度要快得多。
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, ExactSpelling = true, EntryPoint = "lstrlenA")]
[ResourceExposure(ResourceScope.None)]
internal static extern int lstrlenA(IntPtr ptr);
static public string PtrToString(IntPtr p)
{
if (p == IntPtr.Zero)
return null;
int len = lstrlenA(p);
if (len == 0)
return string.Empty;
return Marshal.PtrToStringAnsi(p, len);
}
这种方法似乎要快得多。微软是不是首先编写PtrToStringAnsi函数的原因是什么?我可能错过了一些重要的...
这是不一样的功能。第二种方法调用版本PtrToStringAnsi(IntPtr,int)而不是PtrToStringAnsi(IntPtr) – 2013-03-14 13:32:14
你可以显示基准程序 – 2013-03-14 13:32:45
@DavidHeffernan:https://gist.github.com/anonymous/5161459 – 2013-03-14 13:51:06