string.h的strcmp的性能比较

2023-10-31

string.h基于汇编实现strcmp ,和普通strcmp,针对循环调用次数和字符串查找长度2个纬度做了一次性能对比效测试。


#include <sys/socket.h>
#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <iostream>
#include <strings.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>

using namespace std;


static inline int strcmp_asm(const char * cs,const char * ct)
{
    int d0, d1;
    register int __res;
    __asm__ __volatile__(
            "1:\tlodsb\n\t"
            "scasb\n\t"
            "jne 2f\n\t"
            "testb %%al,%%al\n\t"
            "jne 1b\n\t"
            "xorl %%eax,%%eax\n\t"
            "jmp 3f\n"
            "2:\tsbbl %%eax,%%eax\n\t"
            "orb $1,%%al\n"
            "3:"
            :"=a" (__res), "=&S" (d0), "=&D" (d1)
            :"1" (cs),"2" (ct));
    return __res;
}


static inline int strcmp_normal(const char * cs,const char * ct)
{
    while(*cs!='\0' && *ct!='\0')
    {
        if(*cs != *ct)
            return *cs<*ct?-1:1;
        cs++;
        ct++;
    }
    if(*cs != *ct)
        return *cs<*ct?-1:1;
    return 0;
}

static inline int generator_data(string &s,int iSamelen=1,const char *sepc=NULL)
{
    s.clear();
    for(int i=0;i<iSamelen;++i)
        s+="1";
    s+=sepc;
    return 0;
}

static inline void strcmp_perfom(int loop=1,int iSamelen=1)
{
    //loop asm
    string s1,s2;
    generator_data(s1,iSamelen,"s1");
    generator_data(s2,iSamelen,"s2");


    struct timeval start_tv,loop1_tv;
    gettimeofday(&start_tv, NULL);

    for(int i=0;i<loop;++i)
    {
        strcmp_asm(s1.c_str(),s2.c_str());
    }
    gettimeofday(&loop1_tv, NULL);
    int iMs = (loop1_tv.tv_sec - start_tv.tv_sec)*1000 + (loop1_tv.tv_usec - start_tv.tv_usec)/1000;

    //loop normal
    string ss1,ss2;
    generator_data(ss1,iSamelen,"s1");
    generator_data(ss2,iSamelen,"s2");

    gettimeofday(&start_tv, NULL);
    for(int i=0;i<loop;++i)
    {
        strcmp_normal(ss1.c_str(),ss2.c_str());
    }
    gettimeofday(&loop1_tv, NULL);
    int iMs2 = (loop1_tv.tv_sec - start_tv.tv_sec)*1000 + (loop1_tv.tv_usec - start_tv.tv_usec)/1000;

    printf("loop:%d,strcmp_asm,time:%d ms,strcmp_normal,time:%d ms\n",loop,iMs,iMs2);
}

int main(int argc,char** argv)
{
    int loop=10000;
    int iSamelen=1000;
    if(argc>1)
    {
        loop = atoll(argv[1]);
    }
    if(argc>2)
    {
        iSamelen = atoll(argv[2]);
    }
    printf("input loop:%d,iSamelen:%d\n",loop,iSamelen);

    strcmp_perfom(loop,iSamelen);

    return 0;
}


测试结果如下,在匹配串长度足够的情况下,性能差了3~4倍。
input loop:5000,iSamelen:100000
loop:5000,strcmp_asm,time:468 ms,strcmp_normal,time:1747 ms


input loop:50000,iSamelen:10000
loop:50000,strcmp_asm,time:501 ms,strcmp_normal,time:1749 ms


input loop:500000,iSamelen:1000
loop:500000,strcmp_asm,time:494 ms,strcmp_normal,time:1787 ms


input loop:5000000,iSamelen:100
loop:5000000,strcmp_asm,time:693 ms,strcmp_normal,time:1922 ms


input loop:50000000,iSamelen:10
loop:50000000,strcmp_asm,time:1337 ms,strcmp_normal,time:2424 ms


在匹配串极短的场景,1,2,4字节的情况,性能也有1.5~2倍左右的差距
input loop:50000000,iSamelen:4
loop:50000000,strcmp_asm,time:849 ms,strcmp_normal,time:1425 ms


input loop:50000000,iSamelen:2
loop:50000000,strcmp_asm,time:753 ms,strcmp_normal,time:1130 ms


input loop:50000000,iSamelen:1
loop:50000000,strcmp_asm,time:670 ms,strcmp_normal,time:1040 ms


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

string.h的strcmp的性能比较 的相关文章

  • SpringBoot之bean解析(四)

    IOC思想解析 IOC 控制反转 全称为 Inverse of Control 从字面上理解就是控制反转了 将对在自身对象中的一个内置对象的控制反转 反转后不再由自己本身的对象进行控制这个内置对象的创建 而是由第三方系统去控制这个内置对象的
  • linux 配置服务开机自启动之chkconfig(Linux 运行级别)

    文章目录 linux 配置服务开机自启动 systemd 和 chkconfig add 设置开机自启动有什么区别 一 如何让一个服务或脚本开机自启动 1 三种解决方案 2 systemd 和 chkconfig 二 chkconfig 1

随机推荐

  • [OpenGL]射线拾取RayPicking---(2)拾取三角面

    Vries的教程是我看过的最好的可编程管线OpenGL教程 没有之一 但没有讲关于拾取 Picking 的章节 而这个功能的确很重要 就自己试着写写看了 核心代码 参考 网址如下 别问 问就是抄 https www cnblogs com
  • MATLAB自相关分析xcorr

    目录 自相关定义 xcorr的应用 举个栗子 自相关定义 信号 x t x t x t 的自相关函数定义为 其中 T为信号 x
  • 2016.5.23

    2016 5 23 news from BBC China s Science Revolution 这篇文章非常棒 推荐阅读 今天只完成4个部分 明天继续mark introduction From building the bigges
  • 将 InputStream 流转成 MultipartFile

    MultipartFile是一个接口 有一个MockMultipartFile实现类 里面有构造方法可以直接将输入流转为MutipartFile对象 MultipartFile File new MockMultipartFile file
  • @angular前端项目代码优化:构建Api Tree

    前颜 yan 在前端项目的开发过程中 往往后端会给到一份数据接口 本文简称api 为了减少后期的维护以及出错成本 我的考虑是希望能够找到这么一种方法 可以将所有的api以某种方式统一的管理起来 并且很方便的进行维护 比如当后端修改了api名
  • 三维重建(单目、双目、多目、点云、SFM、SLAM)

    1 相机几何与标定 1 1 相机模型中的坐标系 1 2 四种坐标系之间的转换 1 3 相机内参 1 4 相机标定 2 传统三维重建 2 1 RGBD三维重建 2 1 1 KinectFusion 2 1 2 BundleFusion 2 1
  • CentOS7 Failed to start LSB: Bring up/down解决方法

    刚刚装好的虚拟机突然不能上网了 报错很诡异 具体报错如下 etc init d network restart Restarting network via systemctl Job for network service failed
  • three.js加载fbx并解析骨骼动画

    three js加载fbx并解析骨骼动画 话不多说 上代码
  • SpringBoot如何打包项目?

    我们打包SpringBoot项目一般是打包成jar包或者war包 jar包和war包最大的区别在于jar包打出来的可直接运行 我们可以直接进行访问 因为他内前置了tomcat服务器 但是war包在打包的时候会提前移除tomcat相关组件 我
  • Verilog入门——Quartus2基础使用

    一 新建工程 1 打开Quartus2 2 点击菜单栏中的 file 选择 New Project Wizard 3 点击Next 4 选择工程存储路径 5 输入工程名字 6 点击Next 7 选择fpga类型和型号 根据自己的板子型号选择
  • 最简单的DRM应用程序 (single-buffer)

    在上一篇DRM Direct Rendering Manager 学习简介 中 我们学习了DRM的基本概念以及基本组成元素 从本篇开始 我将以示例代码的形式 给大家分享学习DRM驱动开发的整个学习过程 在学习DRM驱动之前 应该首先了解如何
  • 【java】ssh the connection is not authenticated

    文章目录 1 概述 1 概述 首先参考 java java ssh 远程执行命令 并且获取执行的结果 然后讲述一下 这个问题 这是一段很久的代码 以前是能正常工作的 环境如下 Docker flink node 这里ssh kafka no
  • QT笔记-窗体设置

    1 窗体设置 个窗体初始运行最大化 setWindowState Qt WindowMaximized 获取屏幕分别率 并设置窗体固定大小 QScreen screen QGuiApplication primaryScreen QRect
  • MySQL 日期相减得到秒、分、天

    文章目录 一 MySQL中两个DateTime字段相减 二 MySQL中两个Time字段相减 一 MySQL中两个DateTime字段相减 这种方式两字段跨天 月 年都无问题 得到两个日期字段之间的秒数 selec t UNIX TIMES
  • 医学影像组学之病理切片分割(免费训练数据,标注数据,免费代码,免费教程)三天走完影像组学全部流程

    谁规定说影像组学只能从写代码 学语言耗费半年时间才能开始实验 三天让你走完影像组学完整流程 训练数据已经集成好 标注数据也已备好 代码也备好了 训练过程是这样的 另外笔者整理了其他影像组学的教学小视频 有兴趣的可以在下面评论
  • 华为HCIE云计算之部署Fusion Access及云桌面发放实战

    华为HCIE云计算之部署Fusion Access及云桌面发放实战 一 在FC上安装FA01虚拟机 1 选择创建类型 2 创建虚拟机基本配置 3 创建数据存储 4 选择虚拟机配置 5 虚拟机创建完成 二 安装FA01系统 1 进入系统安装界
  • 以太坊入门学习资料

    区块链分类 区块链按照访问和管理权限分为公有链 联盟链和私有链 公有链 完全开放 所有节点均可加入 代表链 比特币Bitcoin 以太坊Ethereum 联盟链 有多个组织和机构共同管理 获得组织和机构许可的节点可以加入 代表链 超级账本H
  • uniapp弹窗实现

  • java comparable与_详解Java中Comparable和Comparator接口的区别

    详解Java中Comparable和Comparator接口的区别 本文要来详细分析一下Java中Comparable和Comparator接口的区别 两者都有比较的功能 那么究竟有什么区别呢 感兴趣的Java开发者继续看下去吧 Compa
  • string.h的strcmp的性能比较

    string h基于汇编实现strcmp 和普通strcmp 针对循环调用次数和字符串查找长度2个纬度做了一次性能对比效测试 include