﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Rickit's Rocket Cockpit-文章分类-算法</title><link>http://www.cppblog.com/rickit/category/15931.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 27 Jan 2011 09:04:52 GMT</lastBuildDate><pubDate>Thu, 27 Jan 2011 09:04:52 GMT</pubDate><ttl>60</ttl><item><title>【原创】fast wcsnicmp 算法实现</title><link>http://www.cppblog.com/rickit/articles/139368.html</link><dc:creator>rickit</dc:creator><author>rickit</author><pubDate>Wed, 26 Jan 2011 10:39:00 GMT</pubDate><guid>http://www.cppblog.com/rickit/articles/139368.html</guid><wfw:comment>http://www.cppblog.com/rickit/comments/139368.html</wfw:comment><comments>http://www.cppblog.com/rickit/articles/139368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/rickit/comments/commentRss/139368.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/rickit/services/trackbacks/139368.html</trackback:ping><description><![CDATA[<p>对于做路径过滤或者文件过滤驱动的朋友来说，fast wcsnicmp函数可以获得更佳的性能，在负载重的情况下比较明显。<br>对比微软的wcsnicmp函数速度快一倍左右，对于学习算法优化的朋友，这也是个比较好的例子。</p>
<p>size_t<br>FastWcsnicmp (<br>&nbsp;&nbsp; wchar_t *First,<br>&nbsp;&nbsp; wchar_t *Second,<br>&nbsp;&nbsp; size_t Len<br>&nbsp;&nbsp;&nbsp; )<br>{</p>
<p>// Author: RickyWong</p>
<p>&nbsp;&nbsp;&nbsp; wchar_t f, s;</p>
<p>// L'a' - L'A' = 32 = 0x 100000, 这难道是巧合??</p>
<p>&nbsp;&nbsp;&nbsp; unsigned short mask = ~(L'a' - L'A');</p>
<p>// wide char专用mask，ascii版可以去掉</p>
<p>&nbsp;&nbsp;&nbsp; unsigned short wcmask = 0xFF80;</p>
<p>&nbsp;&nbsp;&nbsp; if (Len == 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;</p>
<p>&nbsp;&nbsp;&nbsp; f = *First;<br>&nbsp;&nbsp;&nbsp; s = *Second;</p>
<p>&nbsp;&nbsp;&nbsp; do<br>&nbsp;&nbsp;&nbsp; {</p>
<p>// 你要知道，英文和其他字符编码的区别</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( ((f | s) &amp; wcmask) == 0 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>// ok, 如果是英文字符并且忽略大小写后不一样，那就是字符串不相等</p>
<p>// 那么大小写英文字符不同之处在哪里?</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( ((f ^ s) &amp; mask) != 0 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>// 非英文字符直接对比</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else if (f != s)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br>// 一些小技巧...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; First++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Second++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f = *First;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; s = *Second;</p>
<p>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; while ( (--Len) &amp;&amp; f );</p>
<p>// 返回差值，如果相等，结果为0<br>&nbsp;&nbsp;&nbsp; return (f - s);<br>}</p>
<p>相信各位也会写strnicmp了。我再厚道点吧，这里也放出测试代码：</p>
<p>#include "stdafx.h"<br>#include &lt;Windows.h&gt;<br>#include &lt;conio.h&gt;</p>
<p>#pragma pack(8,push)</p>
<p>LARGE_INTEGER t1;<br>LARGE_INTEGER t2;<br>LARGE_INTEGER fr;</p>
<p>#pragma pack(pop)</p>
<p>WCHAR a0[] = L"gauibsNilubgwawJiubgw.wiuGa";<br>WCHAR b0[] = L"gauibsNiluBgwewJiubgw.wiuGa";<br>WCHAR a[] = L"ability越大,duty越重.exe";<br>WCHAR b[] = L"ability越大,duTy越重.exe";<br>WCHAR a1[] = L"能力越大,责任越重啊";<br>WCHAR b1[] = L"能力越大，责任越重啊";</p>
<p>int _tmain(int argc, _TCHAR* argv[])<br>{<br>&nbsp;&nbsp;&nbsp; int res = -1;<br>&nbsp;&nbsp;&nbsp; double time;<br>&nbsp;&nbsp;&nbsp; QueryPerformanceFrequency(&amp;fr);<br>&nbsp;&nbsp;&nbsp; QueryPerformanceCounter(&amp;t1);</p>
<p>&nbsp;&nbsp;&nbsp; for (int i=0;i&lt;10000000;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; res = FastWcsnicmp(a,b,sizeof(a)/sizeof(a[0]));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //res = _wcsnicmp(a,b,sizeof(a)/sizeof(a[0]));<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; QueryPerformanceCounter(&amp;t2);<br>&nbsp;&nbsp;&nbsp; t2.QuadPart = (t2.QuadPart - t1.QuadPart);<br>&nbsp;&nbsp;&nbsp; time = (double)t2.QuadPart / (double)fr.QuadPart;</p>
<p>&nbsp;&nbsp;&nbsp; printf("result:%d\t clock:%I64d \ttime:%fs\n",res,t2,time);<br>&nbsp;&nbsp;&nbsp; system("pause");</p>
<p>&nbsp;&nbsp;&nbsp; return 0;<br>}</p>
<img src ="http://www.cppblog.com/rickit/aggbug/139368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/rickit/" target="_blank">rickit</a> 2011-01-26 18:39 <a href="http://www.cppblog.com/rickit/articles/139368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>