- 论坛徽章:
- 0
|
汇编那个应该最快, 一个指令周期就可以搞定, 只要一个存储单元, 计算都在内部寄存器里搞定. 如果需要在更长的位串里面进行测试, 还可以考虑MMX, 或者SSE, 现在amd和intel的cpu都支持这些指令.
第二快得就是查表, 如果不是重复复计算byte中的这个有效位, 优势也不大, 因为建立表也要花费时间, 否则就很快. 不过比单指令的汇编多了计算地址的操作. 这两个是O(1)的时间复杂度, 时间单位是指令周期哦.
插值多项式很有创意, 但是执行起来由于乘法运算不见得比for循环快, 而且占了O(n)的指令空间, O(n)的时间复杂度,不实用.
switch就更不实用了, 平均起来, 每个test做4次的比较和跳转, 而且生成大量的指令, 跳转可是性能的杀手, 能不用就不用. switch 就象把车从高速开到石子路上一样, 痛苦.
对数表达起来很简单, 但是运算起来却很慢, 查表或者逼近, 而且还是浮点运算, 效率很差.
看来你对CPU的了解还不够。
汇编使用ffs应该是最快了,这点应该没错,但不是一个指令周期就能完成。ffs是长指令,执行时会分解为多步微码,至少需要近十个指令周期才能完成。只有一系列ffs完全流水线化,指令完成时间才会会接近一个周期。
查表如果不算构造表的时间,的确是很快。这一点上我与你完全相同。
插值多项式绝对比switch慢。
我的观点是,除了不算构造表开销的查表法和ffs汇编指令外,任何方法都没有switch快。
你所谓的大量比较和跳转是性能杀手的理解有误。
跳转为何性能低下?因为CPU不知道分支(分支才是正确的说法)往哪里进行。
现代CPU都有分支预测机制,只要分支的两边稍稍不平衡(49%-51%),就会有很高的正确预测率。
在switch的例子中,比较只需一个指令;而分支的两边很不平衡,选择分支和选择不分支的比率大约是1:7(8位中只有1位为1),分支预测机制会选择不分支,这样就有87.5%的成功预测率。这样的成功预测率足以保证多数指令的连续进行而不会“开到石子路上”。 |
|