【原创】fast wcsnicmp 算法实现

来源:互联网 发布:睿拓香港知乎 编辑:程序博客网 时间:2024/04/19 19:55

对于做路径过滤或者文件过滤驱动的朋友来说,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;
}

原创粉丝点击