C++如何實現高性能轉換大小寫算法

這篇文章給大家分享的是有關C++如何實現高性能轉換大小寫算法的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

我們提供的服務有:網站設計、成都網站建設、微信公眾號開發(fā)、網站優(yōu)化、網站認證、洛隆ssl等。為成百上千企事業(yè)單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的洛隆網站制作公司

簡述

最近工作中遇到一個需求,是需要將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碼的碼值,發(fā)現大小寫字母的ascii碼之間是有規(guī)律的。

原理

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

C++如何實現高性能轉換大小寫算法

對比一下其二進制形式

C++如何實現高性能轉換大小寫算法

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

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

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

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

C++如何實現高性能轉換大小寫算法

#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中的算法函數必須包含頭文件<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

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

感謝各位的閱讀!關于“C++如何實現高性能轉換大小寫算法”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網頁名稱:C++如何實現高性能轉換大小寫算法
網站鏈接:http://muchs.cn/article4/jojgie.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、Google、響應式網站、移動網站建設、網站制作ChatGPT

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網站網頁設計