国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++實現高性能轉換大小寫算法示例

2020-01-26 13:49:44
字體:
來源:轉載
供稿:網友

簡述

最近工作中遇到一個需求,是需要將URL中的 query 參數的key全部轉換為小寫或者大寫,鍵值對的數量有點多,但全部都是英文字母,無需考慮非字母的情況。

實現比較快的做法是使用STL或C標準庫中的轉換接口,如下:

#include <string> #include <cctype> #include <algorithm>// 字符串中的大寫字符轉小寫std::string strtolower(std::string s){ transform(s.begin(), s.end(), s.begin(), ::tolower); return s;}// 字符串中的小寫字符轉大寫std::string strtoupper(std::string s){ transform(s.begin(), s.end(), s.begin(), ::toupper); return s;}

這個方法雖然很好,但是效率不是很高。

分析了一下ascii碼的碼值,發現大小寫字母的ascii碼之間是有規律的。

原理

英文字母的ASCII碼值表示如下


對比一下其二進制形式


從對比的結果可以看出, 大寫字母與小寫字母的差別 僅是 一個比特位的不同 。

因為它們的這個規律,可以寫出下面的轉換函數(如果輸入不是字母,轉出的結果會有錯誤)

可以查看數字 0-9 的ascii碼值,可以看出它們的第6位都是0,所以轉為小寫的算法不會影響數字的值。

轉小寫算法中受到影響的,只有ascii碼二進制表示中第六位為0的部分。其中非字母部分如下表


#include <iostream>#include <string>#include <stdint.h>// 更優化std::string strtoupper(std::string s){ if(s.empty()){return s;} size_t len = s.size() + 1; size_t alignlen = len + 8 - (len % 8); s.resize(alignlen); size_t ec = alignlen / 8; uint64_t* p8 = (uint64_t*)s.data(); for(size_t i=0;i<ec;++i){ p8[i] &= 0xDFDFDFDFDFDFDFDF; } s.resize(len-1); return s;}// 未做進一步優化std::string strtolower(std::string s){ size_t len = s.size(); size_t ec = len /8; uint64_t* p8 = (uint64_t*)s.data(); for(size_t i=0;i<ec;++i){ p8[i] |= 0x2020202020202020; } uint8_t* p1 = (uint8_t*)(p8 + ec); len %= 8; for(size_t i=0;i<len;++i){ p1[i] |= 0x20; } return s;}

性能測試

測試代碼如下:

int main(){ //std::cout << "Hello, world!/n"; for(size_t i=0;i<1000000;++i){ std::string s = strtoupper("qwertyuiopasdfghjklzxcvbnm````````QWERTYUIOPASDFGHJKLZXCVBNM"); //std::cout<<s<<std::endl; s = strtolower("qwertyuiopasdfghjklzxcvbnm/t/t/t/t/t/t/t/tQWERTYUIOPASDFGHJKLZXCVBNM"); //std::cout<<s<<std::endl; } return 0;}

-- 編譯時候請勿優化,否則可能被優化掉! --

測試結果如下:

使用STL算法

STL算法部分主要由頭文件<algorithm>,<numeric>,<functional>組成。要使用 STL中的算法函數必須包含頭文件<algorithm>,對于數值算法須包含<numeric>,<functional>中則定義了一些模板類,用來聲明函數對象。

STL中算法大致分為四類:

       1、非可變序列算法:指不直接修改其所操作的容器內容的算法。

       2、可變序列算法:指可以修改它們所操作的容器內容的算法。

       3、排序算法:包括對序列進行排序和合并的算法、搜索算法以及有序序列上的集合操作。

       4、數值算法:對容器內容進行數值計算。

結果如下

time ./teststl./teststl 7.88s user 0.03s system 100% cpu 7.904 total

自寫代碼測試結果如下

time ./test./test 0.93s user 0.00s system 99% cpu 0.928 total

可以看到,其性能有差異。(應用場景有限)

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 横山县| 宜章县| 凤冈县| 烟台市| 宜君县| 如皋市| 青阳县| 东乡族自治县| 张家港市| 贵溪市| 桦南县| 乐陵市| 佛山市| 清水河县| 天津市| 体育| 通江县| 简阳市| 南皮县| 锡林郭勒盟| 五原县| 蕲春县| 兴宁市| 兴安盟| 鄂托克旗| 平远县| 南部县| 安福县| 长葛市| 昌吉市| 杨浦区| 朔州市| 陵水| 德昌县| 台东县| 大竹县| 南和县| 诸暨市| 沂源县| 砀山县| 许昌县|