C++實現(xiàn)高性能轉換大小寫算法示例
簡述
最近工作中遇到一個需求,是需要將URL中的 query 參數(shù)的key全部轉換為小寫或者大寫,鍵值對的數(shù)量有點多,但全部都是英文字母,無需考慮非字母的情況。
實現(xiàn)比較快的做法是使用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碼的碼值,發(fā)現(xiàn)大小寫字母的ascii碼之間是有規(guī)律的。
原理
英文字母的ASCII碼值表示如下

對比一下其二進制形式

從對比的結果可以看出, 大寫字母與小寫字母的差別 僅是 一個比特位的不同 。
因為它們的這個規(guī)律,可以寫出下面的轉換函數(shù)(如果輸入不是字母,轉出的結果會有錯誤)
可以查看數(shù)字 0-9 的ascii碼值,可以看出它們的第6位都是0,所以轉為小寫的算法不會影響數(shù)字的值。
轉小寫算法中受到影響的,只有ascii碼二進制表示中第六位為0的部分。其中非字母部分如下表

#include <iostream>
#include <string>
#include <stdint.h>
// 更優(yōu)化
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;
}
// 未做進一步優(yōu)化
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;
}
-- 編譯時候請勿優(yōu)化,否則可能被優(yōu)化掉! --
測試結果如下:
使用STL算法
STL算法部分主要由頭文件<algorithm>,<numeric>,<functional>組成。要使用 STL中的算法函數(shù)必須包含頭文件<algorithm>,對于數(shù)值算法須包含<numeric>,<functional>中則定義了一些模板類,用來聲明函數(shù)對象。
STL中算法大致分為四類:
1、非可變序列算法:指不直接修改其所操作的容器內容的算法。
2、可變序列算法:指可以修改它們所操作的容器內容的算法。
3、排序算法:包括對序列進行排序和合并的算法、搜索算法以及有序序列上的集合操作。
4、數(shù)值算法:對容器內容進行數(shù)值計算。
結果如下
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
可以看到,其性能有差異。(應用場景有限)
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
C++實現(xiàn)學生選課系統(tǒng)的思路與詳細過程
C語言是在國內外廣泛使用的一種計算機語言,下面這篇文章主要給大家介紹了關于C++實現(xiàn)學生選課系統(tǒng)的思路與詳細過程,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-01-01
C語言之把數(shù)組名作函數(shù)參數(shù)的四種情況說明
這篇文章主要介紹了C語言之把數(shù)組名作函數(shù)參數(shù)的四種情況說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

