int index;
for (int i = 0; i < 10000000; i++)
{
index = FireDatasource.Public.FindChar(content, '#');
}
TimeSpan ts2 = Process.GetCurrentProcess().TotalProcessorTime;
Console.WriteLine((ts2 - ts1).TotalMilliseconds);
//int tint = -1;
ts1 = Process.GetCurrentProcess().TotalProcessorTime;
for (int i = 0; i < 10000000; i++)
{
index = Array.IndexOf(content, '#');
}
ts2 = Process.GetCurrentProcess().TotalProcessorTime;
Console.WriteLine((ts2 - ts1).TotalMilliseconds);
ts1 = Process.GetCurrentProcess().TotalProcessorTime;
for (int i = 0; i < 10000000; i++)
{
string Str = System.Text.Encoding.ASCII.GetString(content);
index = Str.IndexOf('#');
}
ts2 = Process.GetCurrentProcess().TotalProcessorTime;
Console.WriteLine((ts2 - ts1).TotalMilliseconds);
Console.ReadLine();
其中FindChar使用系统函数
//extern void *memchr(void *buf, char ch, unsigned int count);
[DllImport("msvcrt.dll", EntryPoint = "memchr", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
static extern IntPtr MemChr(byte[] dest, char src, UIntPtr count);
public static int FindChar(byte[] arary, char ch)
{
GCHandle hObject = GCHandle.Alloc(arary, GCHandleType.Pinned);
IntPtr pObject = hObject.AddrOfPinnedObject();
IntPtr aIP = MemChr(arary, ch, new UIntPtr((uint)arary.Length));
if (hObject.IsAllocated)
hObject.Free();
if( IntPtr.Zero == aIP )
return -1;
return (aIP.ToInt32() - pObject.ToInt32());
}
测试结果:
6250
16781.25
953.125
C#对字节数组的操作效率实在不敢恭维啊!!
看来条件允许的情况下,还是要用String来操作,即使复制一次,效率居然高很多。