C++ 超短字符串比较

最近这几天的工作中用到了C++字符串比较。在一次运行中需要做海量的字符串相等的比较。而且字符串都是3-5字节长度的字符串,在这里在占用了太多的CPU资源。

如何快速比较短字符串,这里也是有方法的。(学习了nginx字符串比较)

首先思路转化,字符串比较在CPU指令中是逐字节比较,比如有”abc”和“abd”这两个字符串做是否相同的比较。需要执行三次一字节的比较指令。而4(8)字节整数类型的比较则只需要一次CPU指令就可以完成。

我们需要把3字节的字符串转换成4字节的整型做比较就会提高比较速率。

如何做转换呢?可以利用C语言的强制类型转换命令让计算机帮我们完成转换任务。好了废话不多说了,对于程序员还是直接上代码看的清晰。

main.cpp

#include <iostream>
#include <string>
using namespace std;
int main(int argc, char **argv)
{
    char code[] = "200";
    string strcode("200");
    cout<<(int)*(int*)"200" <<"\n" << (int)*(int*)code << endl;
    if( (int)*(int*)"200" == (int)*(int*)code )
        cout<<"相等\n";
    string ret =  ( (int)*(int*)"200" == (int)*(int*)code  ? "相等" : "不相等" );
    ret =  ( (int)*(int*)"200" == (int)*(int*)strcode.c_str()  ? "相等" : "不相等" );
    cout << ret << endl;

    return 0;
}

编译

g++ -o main main.cpp

执行

./main

3158066

3158066

相等

相等

测试

#include <iostream>

#include <string>

using namespace std;

int main(int argc, char **argv) 

{

string strcode("200");

         string strcode2("200");

         int i = 1000*1000*1000;

         while(i--)

        {

         //((int)*(int*)"200" == (int)*(int*)strcode.c_str()  ? "相等" : "不相等" );

         (strcode == strcode2 ? "相等" : "不相等" );

        }

  return 0;

}

系统环境

Ubuntu 14.04

Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz

Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz

Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz

Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz

Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz

Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz

Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz

Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz

time ./main

real 0m3.328s

user0m3.328s

sys  0m0.000s

time ./main

real 0m22.513s

user0m22.536s

sys  0m0.000s

时间: 2024-10-14 13:04:56

C++ 超短字符串比较的相关文章

条件、循环、函数定义、字符串操作练习

注意标准库的两种导入与使用方式,建议大家采用<库名>.<函数名>的方式. 对前面的代码进行优化,用for,while,if,def实现: 用循环画五角星 1 import turtle 2 3 turtle.fillcolor("red") 4 turtle.begin_fill() 5 for i in range(5): 6 turtle.forward(100) 7 turtle.right(144) 8 turtle.end_fill() 用循环画同心圆

sql常用格式化函数及字符串函数

一.常用格式化函数 1.日期转字符串 select to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') //2017-09-18 22:41:50 YYYY:年(4和更多位) MM:月份号(01-12) DD:一个月里的日(01-31) HH24:一天的小时数(00-23) MI:分钟(00-59) SS:秒(00-59) 2.字符串转日期 select to_date('2017-09-18','YYYY-MM-DD') //2017-09-

PHP 格式化字符串sprintf()

字符串函数 sprintf() 函数把格式化的字符串写入一个变量中 函数说明:sprintf(格式, 要转换的字符串)  参考PHP手册 返回: 格式化后的字符串 举例: 如:保留2位小数, $str = '99.9';echo sprintf('%01.2f', $str);结果为:99.90 echo round($str, 2); 结果为:99.9

js中字符串的替换

定义和用法 replace() 方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串. 语法 stringObject.replace(regexp/substr,replacement)参数 描述 regexp/substr 必需.规定子字符串或要替换的模式的 RegExp 对象. 请注意,如果该值是一个字符串,则将它作为要检索的直接量文本模式,而不是首先被转换为 RegExp 对象. replacement 必需.一个字符串值.规定了替换文本或生成替换文本的函数. 返

数组、字符串、集合

数组与集合的转换.数组与字符串的转换 ========数组变集合 String[] arr = {"abc","cc","kkkk"}; //把数组变成list集合有什么好处? /* 可以使用集合的思想和方法来操作数组中的元素. 注意:将数组变成集合,不可以使用集合的增删方法. 因为数组的长度是固定. contains. get indexOf() subList(); 如果你增删.那么会产生UnsupportedOperationExcepti

《Java编程思想》第十三章 字符串

<Java编程思想>读书笔记 1.String作为方法的参数时,会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置,从未动过. 2.显式地创建StringBuilder允许预先为他指定大小.如果知道字符串多长,可以预先指定StringBuilder的大小避免多次重新分配的冲突. 1 /** 2 * @author zlz099: 3 * @version 创建时间:2017年9月1日 下午4:03:59 4 */ 5 public class UsingStringBuilder {

SpringMVC后台使用对象接受参数字符串转日期

在springMVC配置文件中加入: <bean id="dateConvert" class="com.iomp.util.DateConvert"/> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property

python判断字符串,str函数isdigit、isdecimal、isnumeric的区别

s为字符串s.isalnum() 所有字符都是数字或者字母s.isalpha() 所有字符都是字母s.isdigit() 所有字符都是数字s.islower() 所有字符都是小写s.isupper() 所有字符都是大写s.istitle() 所有单词都是首字母大写,像标题s.isspace() 所有字符都是空白字符.\t.\n.\r 判断是整数还是浮点数a=123b=123.123 >>>isinstance(a,int)True>>>isinstance(b,floa

【自动化__持续集成】___java___字符串转数组

一.代码如下 package www.wujianbotwo; public class Demo08 { public static void main(String[] args) { // TODO Auto-generated method stub String content= "wujianbo,wujianob,33333"; String[] ud= content.split(",");//将字符串分段成一个数组 for(int i=0; i&l