对pos搜索函数的研究以及优化思路···

简介: 代码摘自delphi的Pos函数。。。总的来说,若我理解无误的话,该函数才用的搜索机制并不是非常高明。

代码摘自delphi的Pos函数。。。总的来说,若我理解无误的话,该函数才用的搜索机制并不是非常高明。。。只是简单的使用了一个倒序搜索,仅此而已。。。但其速度优于BM,应该是由于其对CPU的优化。。。

 

   首先先介绍一下register 调用约定: 从左到右,优先使用寄存器(EAX,EDX,ECX),然后使用堆栈!这个调用约定和C++里面的__fastcall有些类似,不同的是__fastcall优先使用的只有ECX和EDX。这两种调用约定应该说是最快速的调用约定。。

 

    再贴一部分比较重要的源码,,源码都注释过,,也没什么解释的。。

开始为准备做工作:

       push  ebx   ;保护ebx esp-4
       push  esi   ;保护esi esp-4
       add   esp, -16   ;esp-16  char* i,j,b,p;
       test  edx, edx   ;测试被搜索字符串
       jz    @NotFound
       test  eax, eax   ;测试要搜索的子串
       jz    @NotFound
       mov   esi, [ebp+8]  ;esi = strLen
       mov   ebx, ecx    ;ebx = substrLen
       cmp   esi, ebx   ;strLen < substrLen 则跳出
       jl    @NotFound
       test  ebx, ebx   ;substrLen == 0 则跳出
       jle   @NotFound
       dec   ebx   ;substrLen--
       add   esi, edx   ;
       add   edx, ebx   ;指向开始比较的位置。str偏移为strlen(substr)的位置,比较关键,后期字符串搜索和这个指针有密切的关系
       mov   [esp+8], esi  ;j指向被搜索字符串的尾部
       add   eax, ebx
       mov   [esp+4], edx  ;i指向要搜索子串的尾部位置
       neg   ebx   ;ebx,substrLen长度减一的补码
       movzx ecx, byte ptr [eax] ;ecx = substrLen[0]
       mov   [esp], ebx   ;[esp] = ecxc
       jnz   @FindString

开始具体的搜索:
    @FindString:
           sub   esi, 2  ;
           mov   [esp+12], esi ;p = strLen-2,指向被搜索字符串后输2的位置
    @FindString2:
           cmp   cl, [edx]  ;
           jz    @Test0  ;
    @AfterTest0:
           cmp   cl, [edx+1]
           jz    @Test1
    @AfterTest1:
           add   edx, 2  ;str = str + 2;
           cmp   edx, [esp+12] ;
           jb    @FindString4 ;从后向前比较如果在从后数两位以上则执行每四位比较一次的操作
           cmp   edx, [esp+8] ;
           jb    @FindString2 ;如果后面只剩了两位,则只能进行最后两位的操作。
           xor   eax, eax
           jmp   @Exit1

 (Test0 , Test1 , Test2 , Test3操作相同,只是调整了一下指针的位置,只是调整了一下指针的位置)

 

其它的感觉也没什么好注释的,在上面可以看到,这个算法其实思路非常简单,个人感觉,如果用这种优化方式来实现sunday算法的话,还可以让速度再次增加。。。

目录
相关文章
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch 深度学习实用指南:1~5
PyTorch 深度学习实用指南:1~5
348 0
确定问卷调查样本量
确定问卷调查样本量
375 1
|
7月前
|
Docker Python 容器
Docker——阿里云服务器使用Docker部署python项目全程小记
本文记录了我在阿里云服务器上使用Docker部署python项目(flask为例)的全过程,在这里记录和分享一下,希望可以给大家提供一些参考。
709 1
|
12月前
|
存储 监控 算法
确保大文件上传数据完整性和准确性的方法
【10月更文挑战第17天】通过以上多种方法的综合运用,可以有效地确保大文件上传数据的完整性和准确性,为用户提供可靠的上传体验。同时,随着技术的不断发展,还需要不断地探索和创新,以适应不断变化的需求和挑战。
|
8月前
|
人工智能 安全 机器人
LangBot:无缝集成到QQ、微信等消息平台的AI聊天机器人平台
LangBot 是一个开源的多模态即时聊天机器人平台,支持多种即时通信平台和大语言模型,具备多模态交互、插件扩展和Web管理面板等功能。
1488 14
LangBot:无缝集成到QQ、微信等消息平台的AI聊天机器人平台
|
12月前
|
人工智能 并行计算 算法
LLM-04 大模型 15分钟 FineTuning 微调 ChatGLM3-6B(准备环境) 3090 24GB实战 需22GB显存 LoRA微调 P-TuningV2微调
LLM-04 大模型 15分钟 FineTuning 微调 ChatGLM3-6B(准备环境) 3090 24GB实战 需22GB显存 LoRA微调 P-TuningV2微调
329 0
|
测试技术 Apache
JMeter - 压力测试工具安装及使用教程(一)
JMeter - 压力测试工具安装及使用教程(一)
283 0
JMeter - 压力测试工具安装及使用教程(一)
|
人工智能 自然语言处理 自动驾驶
破壁人AI百度:科技公司反内卷的典型样本
互联网整个行业都在陷入被动且尴尬的局面。去年开始流行的“内卷”一词,恰如其分的描述了互联网的现状,比如抖音开始做外卖,微信强推视频号,一直硝烟弥漫的电商市场,更是激战在社区团购上。内卷背后也有人感慨,互联网到了尽头。支撑这一论述的是,移动互联网的人口红利已经消失,几款国民型APP用户增长都固定在了10亿这个级别,只能依靠自然人口的增长和迁移。这一幕如同刘慈欣小说《三体》里所描述的,智子封锁的地球科技一样,被信息干扰,或引导至错误方向发展,困在原地,做困兽之斗,无法自拔。“内卷论”与“尽头论”的流行,让我们看到,中国科技产业尤其是互联网,需要自己的“破壁人”计划,突破封锁。
破壁人AI百度:科技公司反内卷的典型样本
生活工作必备之SMART原则
  所谓SMART原则,即: 1. 目标必须是具体的(Specific) 2. 目标必须是可以衡量的(Measurable) 3. 目标必须是可以达到的(Attainable) 4. 目标必须和主要目标具有相关性(Relevant) 5. 目标必须具有明确的截止期限(T=Time-bound) 举例:因为口渴,我要在1分钟之内步行向南200米到超市,买一瓶水来喝。
2058 0