performance - 我正在寻找有关加快 Boyer-Moore-Horspool 代码的建议
问题描述
我用 Fortran(我选择的语言)编写了以下代码,认为它会非常快。事实证明,它相当快,但比 FORTRAN 内在(索引)查找子字符串要慢得多。举个例子,如果我在一个完全随机的 5,000,000 个字符的字符串中搜索距离字符串末尾 1,000 个字符的字符串“月亮是气球”,我得到以下时间(平均超过 10 次运行在库存英特尔 HM370(Cannon Lake-H))。我正在运行 Windows 10,仅使用带有 -O3 和 -fno-checking 优化标志的 GCC Fortan);我的代码(如下)~ 0.09 秒内在~ 0.03 秒我正在寻找有关重构代码以进一步加快速度的任何建议。
INTEGER FUNCTION BOYERMOORE(Text,Pat,Siztext,Sizpat) RESULT(SEARCH)
IMPLICIT NONE
!
! Dummy arguments
!
CHARACTER(*) :: Pat
INTEGER :: Sizpat
INTEGER :: Siztext
CHARACTER(*) :: Text
INTENT (IN) Pat, Sizpat, Siztext, Text
!
! Local variables
!
LOGICAL :: found
INTEGER :: i
INTEGER :: j
INTEGER :: k
INTEGER :: maxchar
INTEGER, DIMENSION(0:Siztext) :: skip
!Code starts here
maxchar = Siztext
found = .FALSE.
SEARCH = 0
IF(Sizpat==0)THEN ! Nothing to search for
SEARCH = 1
found = .TRUE.
ENDIF
skip(0:maxchar) = Sizpat
DO k = 1, Sizpat - 1 ! Setup the shift sizes
skip(IACHAR(Pat(k:k))) = Sizpat - k
ENDDO
k = Sizpat
DO WHILE ((.NOT.found) .AND. (k<=Siztext)) ! Scan
i = k
j = Sizpat
DO WHILE (j>=1) ! Match the characters in substring
IF(Text(i:i)/=Pat(j:j))THEN
j = -1
ELSE
j = j - 1
i = i - 1
ENDIF
IF(j==0)THEN ! Found
SEARCH = i + 1
found = .TRUE.
ENDIF
k = k + skip(IACHAR(Text(k:k))) ! Slide window right
ENDDO
ENDDO
RETURN
END FUNCTION BOYERMOORE
解决方案
推荐阅读
- http - Http加载标志真假的区别
- python - Django-tables 分页 per_page 未按预期工作
- php - 如何像在 python 中一样在 PHP 中执行校验和?
- python - 如何解决 Fenics 示例 ft06_elasticity.py 中未定义名称“nabla_div”错误?
- cluster-computing - pcs 在同时启动两台机器时在主节点中启动它们之前不会停止伙伴节点中的故障转移资源
- excel - 我能否以编程方式启用和禁用存储在 SharePoint 中并链接到 ms-access 的 xlsx 文件的 ms-excel 文件共享/共同创作?
- java - 我们可以使用包装类将 int 转换为 Byte 而不进行类型转换吗?
- javascript - React-DOM 自动触发 onClick 处理程序
- typescript - 试图让 fromEntries 类型正确
- mysql - 经典 ASP 遗留系统为 MySQL 8.0 中的所有整数返回 0