【发布时间】:2016-01-18 10:54:23
【问题描述】:
这是一个与Fastest way to determine if an integer is between two integers (inclusive) with known sets of values 类似的问题,但由于 php 没有被严格输入并且没有可控的整数溢出,因此接受的答案在 php 中不起作用(据我所知)。
这里的用例是确定一个整数是否介于 65 和 90 之间('A' 和 'Z' 的 ASCII 值)。这些边界可能有助于优化解决方案,因为 64 是 2 的幂并充当此问题的边界条件。
到目前为止,我提出的唯一伪优化是:
//$intVal will be between 0 and 255 (inclusive)
function isCapital($intVal)
{
//255-64=191 (bit mask of 1011 1111)
return (($intVal & 191) <= 26) && (($intVal & 191) > 0);
}
与$intVal >= 65 && $intVal <= 90 的正常双重比较相比,此功能并没有太大的改进(可能更慢),但这正是我在尝试优化时开始前进的地方。
【问题讨论】:
-
嗯,我认为如果你到了需要进行这些优化的地步,那么你选择了错误的语言
-
为什么不使用
if (preg_match("/[A-Z]/",$char,$foo)) {}? -
如上,除非这是一个纯粹的学术练习,那么你可能想用c写一个php扩展
-
@Wobbles,有趣的是你提出了 preg_match,这是我一直在对我的解决方案进行基准测试的函数。完整的用例一直在尝试将
camelCase字符串优化为snake_case 字符串。到目前为止,我的速度比 preg_replace 快 20%。 -
@steve,这主要是一种学术练习,类似于 php 中的代码高尔夫挑战。
标签: php optimization