请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

php7为什么加intdiv(a, b)这个方法, intval(a/b) 岂不是性能更好?

麻烦问一下老师:php7为什么加intdiv(a, b)这个方法, intval(a/b) 岂不是性能更好?

正在回答

1回答

同学您好,我们一起看一下这两个函数的实现:

intdiv在ext/standard/math.c中,具体代码如下:

PHP_FUNCTION(dard,amathzhonzhong){
    zend_long dividend, divisor;

    if (zend_parse_parameters(ZEND_NUM_ARGS(), "ll", &dividend, &divisor) == FAILURE) {
        return;
    }

    if (divisor == 0) {
        zend_throw_exception_ex(zend_ce_division_by_zero_error, 0, "Division by zero");
        return;
    } else if (divisor == -1 && dividend == ZEND_LONG_MIN) {
        /* Prevent overflow error/crash ... really should not happen:
           We don't return a float here as that violates function contract */
        zend_throw_exception_ex(zend_ce_arithmetic_error, 0, "Division of PHP_INT_MIN by -1 is not an integer");
        return;
    }

    RETURN_LONG(dividend / divisor);}

从代码里可以看到,该函数只接受两个参数,都是int型的(l代表int型),最后返回的是RETURN_LONG(dividend / divisor);

他的实现是直接把dividend / divisor的值转换为zval的类型为IS_LONG类型,也就是整型;


接下来我们看一下第二个函数intval的实现,代码在ext/standard/type.c中,代码如下:

PHP_FUNCTION(intval){
    zval *num;
    zend_long base = 10;

    if (ZEND_NUM_ARGS() != 1 && ZEND_NUM_ARGS() != 2) {
        WRONG_PARAM_COUNT;
    }
    ZEND_PARSE_PARAMETERS_START(1, 2)
        Z_PARAM_ZVAL(num)
        Z_PARAM_OPTIONAL
        Z_PARAM_LONG(base)
    ZEND_PARSE_PARAMETERS_END();

    if (Z_TYPE_P(num) != IS_STRING || base == 10) {
        RETVAL_LONG(zval_get_long(num));
    } else {
        RETVAL_LONG(ZEND_STRTOL(Z_STRVAL_P(num), NULL, base));
    }}

可以看出,这里面可以处理非整型的输入,对于字符串类型也可以处理。

1 回复 有任何疑惑可以回复我~
  • 提问者 慕少8587325 #1
    首先非常感谢老师的详细解答!
    另外,老师我做过一个简单测试,就是做1亿次循环分别执行这两个方法,intdiv的执行时间比intval要多一倍,我的环境是php7.3.2,intdiv执行时间3.4~3.5秒,intval的执行时间 1.7秒,所以在已知为两个整数的话,我还是更愿意用后者。不知道我有没有误区,还请老师赐教
    回复 有任何疑惑可以回复我~ 2019-02-21 17:52:35
  • 陈雷 回复 提问者 慕少8587325 #2
    非常赞!对性能的测试做到了极致。不过咱们细细思考下,虽然经过1亿次运算,我们看到差距在2倍,但是相对差距只有1s多,其实在生产环境相对于因为业务的复杂导致的延迟可以说是小巫见大巫,所以这个差距还是能接受的。 我们解决延时提高性能的重心可能要更多的思考其他问题,你说对吧?
    回复 有任何疑惑可以回复我~ 2019-02-22 07:02:49
  • 提问者 慕少8587325 回复 陈雷 #3
    好的,谢谢老师!
    回复 有任何疑惑可以回复我~ 2019-02-22 19:41:55
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号