对于做路径过滤或者文件过滤驱动的朋友来说,fast wcsnicmp函数可以获得更佳的性能,在负载重的情况下比较明显。
对比微软的wcsnicmp函数速度快一倍左右,对于学习算法优化的朋友,这也是个比较好的例子。
size_t
FastWcsnicmp (
wchar_t *First,
wchar_t *Second,
size_t Len
)
{
// Author: RickyWong
wchar_t f, s;
// L'a' - L'A' = 32 = 0x 100000, 这难道是巧合??
unsigned short mask = ~(L'a' - L'A');
// wide char专用mask,ascii版可以去掉
unsigned short wcmask = 0xFF80;
if (Len == 0)
return 0;
f = *First;
s = *Second;
do
{
// 你要知道,英文和其他字符编码的区别
if ( ((f | s) & wcmask) == 0 )
{
// ok, 如果是英文字符并且忽略大小写后不一样,那就是字符串不相等
// 那么大小写英文字符不同之处在哪里?
if ( ((f ^ s) & mask) != 0 )
break;
}
// 非英文字符直接对比
else if (f != s)
break;
// 一些小技巧...
First++;
Second++;
f = *First;
s = *Second;
}
while ( (--Len) && f );
// 返回差值,如果相等,结果为0
return (f - s);
}
相信各位也会写strnicmp了。我再厚道点吧,这里也放出测试代码:
#include "stdafx.h"
#include <Windows.h>
#include <conio.h>
#pragma pack(8,push)
LARGE_INTEGER t1;
LARGE_INTEGER t2;
LARGE_INTEGER fr;
#pragma pack(pop)
WCHAR a0[] = L"gauibsNilubgwawJiubgw.wiuGa";
WCHAR b0[] = L"gauibsNiluBgwewJiubgw.wiuGa";
WCHAR a[] = L"ability越大,duty越重.exe";
WCHAR b[] = L"ability越大,duTy越重.exe";
WCHAR a1[] = L"能力越大,责任越重啊";
WCHAR b1[] = L"能力越大,责任越重啊";
int _tmain(int argc, _TCHAR* argv[])
{
int res = -1;
double time;
QueryPerformanceFrequency(&fr);
QueryPerformanceCounter(&t1);
for (int i=0;i<10000000;i++)
{
res = FastWcsnicmp(a,b,sizeof(a)/sizeof(a[0]));
//res = _wcsnicmp(a,b,sizeof(a)/sizeof(a[0]));
}
QueryPerformanceCounter(&t2);
t2.QuadPart = (t2.QuadPart - t1.QuadPart);
time = (double)t2.QuadPart / (double)fr.QuadPart;
printf("result:%d\t clock:%I64d \ttime:%fs\n",res,t2,time);
system("pause");
return 0;
}