oez*_*ezi 23 php math performance
我正在寻找在php中进行整数除法的最快方法.例如,5/2应该是2和6/2应该是3,依此类推.如果我只是这样做,PHP将在第一种情况下返回2.5,我能找到的唯一解决方案是使用intval($my_number/2)
- 这不是我想要的那么快(但给出了预期的结果).
任何人都可以帮我解决这个问题吗?
编辑:
感谢大家的想法,我使用rubber_boots的脚本postet测试其中一些10000000迭代,在这里你可以看到结果(3或4岁的macbook与2Ghz intel core 2 duo上的MAMP) :
start (10000000)
(int)...: 2.26 sec
floor(): 4.36 sec
int_divide(): 2.86 sec
bit-shift: 1.45 sec //note: only works for divisions through powers of 2
intval(): 4.51 sec
round() with PHP_ROUND_HALF_DOWN: 5.48 sec
Run Code Online (Sandbox Code Playgroud)
直到现在,位移是最快的方式,但是我会把这个问题留一天,看看是否有其他可能性...
EDIT2:
更新了结果,用PHP_ROUND_HALF_DOWN添加了round()(感谢Col._Shrapnel)
cle*_*tus 33
只需将其转换为int:
$result = (int)(6 / 2);
Run Code Online (Sandbox Code Playgroud)
无论出于何种原因,它都要快得多intval()
.
编辑:我假设您正在寻找一般的整数除法解决方案.比特移位是除以(或乘以)2的幂的特殊情况.如果您感兴趣那么:
a / b^n = a >> n where a, b, n are integers
Run Code Online (Sandbox Code Playgroud)
所以:
a / 2 = a / 2^1 = a >> 1
Run Code Online (Sandbox Code Playgroud)
但有两点需要注意:
许多编译器/解释器会自动为您执行此操作,因此没有必要再次猜测它;
除非你在单个脚本中执行此任务至少100,000次,否则不要打扰.这是一个毫无意义的微优化.
为了进一步阐述(2),是(int)
的比parseInt()
它更快但重要吗?几乎肯定不是.专注于可读代码和良好的算法.这种事情是无关紧要的分心.
Ale*_*rMP 28
如果它除以2,最快的方法就是位移.
5>>1 = 2
6>>1 = 3
Run Code Online (Sandbox Code Playgroud)
等等等等.它的作用是将位向右移1位,从而将数字除以2而丢失其余位
1110 >> 1 = 111
1011 >> 1 = 101
1011 >> 2 = 10 //division by 4
1011 << 1 =10110
Run Code Online (Sandbox Code Playgroud)
嘿,我不知道我是怎么进入这个问题的,因为它似乎是从2010年开始,这不是一个真正的答案,但是由于作者似乎收集了所有方法来快速划分inegers,它可能会帮助这里的人.
我通常使用0 | 当我为自己编写快速代码时,而不是(int),因为"|" 运算符比大多数其他运算符具有情人优先级,因此您不需要额外的括号.甚至
$x=0| 0.3+0.7;
Run Code Online (Sandbox Code Playgroud)
将按预期工作,当你看到代码(至少对我来说)很容易找到,因为我只想到"= 0 |" 作为特殊运算符"set and cast to int".
因此,要添加到您的集合(这些只是转换为int的其他方式):
$c=0| $x/$y;
Run Code Online (Sandbox Code Playgroud)
和
$c=$x/$y % PHP_INT_MAX;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
22926 次 |
最近记录: |