|
PHP对GB编码动态转UTF-8几种方法评测(3) } for ($i = 0; $i < 100; $i++) { // 随机产生100个ip地址 $strIp = mt_rand(0, 255).\".\".mt_rand(0, 255).\".\".mt_rand(0, 255).\".\".mt_rand(0, 255); $arrAddr[$i] = ip2addr(EncodeIp($strIp)); } $resConn = mysql_connect(\"localhost\", \"netnest\", \"netnest\"); mysql_select_db(\"test\"); // 测评MySQL查询的编码转换 $dblTimeStart = GetMicroTime(); for ($i = 0; $i < 100; $i++) { $strUTF8Region = GB2UTF8_SQL($arrAddr[$i][\"region\"]); $strUTF8Address = GB2UTF8_SQL($arrAddr[$i][\"address\"]); } $dblTimeDuration = GetMicroTime() - $dblTimeStart; // 测评结束并输出结果 echo $dblTimeDuration; echo \"\r\n\"; // 测评文本文件查询的编码转换 $dblTimeStart = GetMicroTime(); for ($i = 0; $i < 100; $i++) { $strUTF8Region = GB2UTF8_FILE($arrAddr[$i][\"region\"]); $strUTF8Address = GB2UTF8_FILE($arrAddr[$i][\"address\"]); } $dblTimeDuration = GetMicroTime() - $dblTimeStart; // 测评结束并输出结果 echo $dblTimeDuration; echo \"\r\n\"; ?>
测评两次结果(精确到3位小数,单位是秒):
MySQL查询转换:0.112 文本查询转换:10.590
MySQL查询转换:0.099 文本查询转换:10.623
可见这次是MySQL方法遥遥领先于文件查询法。但是现在还不急于使用MySQL方法,因为文本文件方法之所以如此耗时,主要因为它每次转换都要把整个gb_unicode.txt读入内存,而gb_unicode.txt又是文本文件,格式如下:
0x2121 0x3000 # IDEOGRAPHIC SPACE 0x2122 0x3001 # IDEOGRAPHIC COMMA 0x2123 0x3002 # IDEOGRAPHIC FULL STOP 0x2124 0x30FB # KATAKANA MIDDLE DOT 0x2125 0x02C9 # MODIFIER LETTER MACRON (Mandarin Chinese first tone) …… 0x552A 0x6458 # <CJK> 0x552B 0x658B # <CJK> 0x552C 0x5B85 # <CJK> 0x552D 0x7A84 # <CJK> …… 0x777B 0x9F37 # <CJK> 0x777C 0x9F3D # <CJK> 0x777D 0x9F3E # <CJK> 0x777E 0x9F44 # <CJK>
文本文件效率较低,于是考虑把文本文件转换为二进制文件,然后用折半法查找这个文件,而不需要把整个文件读入内存。文件格式为:文件头2字节,存储记录数;接着一条接一条记录存入文件,每条记录4字节,前2字节对应GB代码,后2字节对应Unicode代码。转换程序如下:
|