我正在尋找一種可以快速將非託管字符串轉換爲託管字符串的函數。我在尋找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