比较 'A'、'C'、'G'、'T' 字符的最快方法
Fastest way to compare chars of 'A', 'C', 'G', 'T'
我希望提高我的生物信息学算法的速度,该算法需要比较 'A'、'C'、'G'、'T' 之一的字符(例如计算 'A' == 'C')
由于char的大小是8位,最坏情况下需要8次二进制数比较。我的猜测是,通过将 'A'、'C'、'G'、'T' 表示为一对二进制数(例如 'A' 为 make_pair( false,false)), 我认为我可以将速度提高 3~4 倍,因为它现在最多只需要 2 次二进制比较。
我尝试使用一对布尔值,但速度实际上下降了大约 30%。
表示四个字符和计算相等性的最快方法是什么?内存使用对我来说不是什么大问题。
供您参考,我使用的是 C++11 编译器。先感谢您。
可以使用一条指令比较的位数取决于您的 CPU 体系结构。 64 位架构意味着您可以 运行 在一条指令中对 64 位字进行计算,而不是 64 条指令。因此比较两个 8 位字 ('A'=='G'
) 正好需要 1 CPU 周期来计算。
如果你想提高速度,你可以用2bit的词表示你的字符,但是把32个词打包在一个64bit的变量里,运行一次比较32个词,这样就减少了CPU 循环 32 倍。
现在,如果您想要比较多个顺序存储在数组中的 64 位变量,您可以使用 memcmp
来适当优化顺序扫描。
也许从不同的初始概念重新开始...
大约十年前,我从帮助某人学习这些东西中挖出了一张旧笔记。也许它可以给你一个有益的不同视角。
https://gist.github.com/TomConlin/6cd976151d36dd3e2a9fb34842b9c66e
我希望提高我的生物信息学算法的速度,该算法需要比较 'A'、'C'、'G'、'T' 之一的字符(例如计算 'A' == 'C')
由于char的大小是8位,最坏情况下需要8次二进制数比较。我的猜测是,通过将 'A'、'C'、'G'、'T' 表示为一对二进制数(例如 'A' 为 make_pair( false,false)), 我认为我可以将速度提高 3~4 倍,因为它现在最多只需要 2 次二进制比较。
我尝试使用一对布尔值,但速度实际上下降了大约 30%。
表示四个字符和计算相等性的最快方法是什么?内存使用对我来说不是什么大问题。
供您参考,我使用的是 C++11 编译器。先感谢您。
可以使用一条指令比较的位数取决于您的 CPU 体系结构。 64 位架构意味着您可以 运行 在一条指令中对 64 位字进行计算,而不是 64 条指令。因此比较两个 8 位字 ('A'=='G'
) 正好需要 1 CPU 周期来计算。
如果你想提高速度,你可以用2bit的词表示你的字符,但是把32个词打包在一个64bit的变量里,运行一次比较32个词,这样就减少了CPU 循环 32 倍。
现在,如果您想要比较多个顺序存储在数组中的 64 位变量,您可以使用 memcmp
来适当优化顺序扫描。
也许从不同的初始概念重新开始... 大约十年前,我从帮助某人学习这些东西中挖出了一张旧笔记。也许它可以给你一个有益的不同视角。
https://gist.github.com/TomConlin/6cd976151d36dd3e2a9fb34842b9c66e