如何加快这种方法? is_int那么慢吗?

时间:2013-06-05 11:21:44

标签: php cakephp

我正在使用(高度优化/改编版本)CakePHP 2.3,我的应用程序运行在非常慢的硬件(300MHz ARM)上,所以我仍然在尽可能优化。框架的一种方法经常被称为非常快(~1-5ms),但我想不出一种方法来改进它(不改变输出) - 总共我花了大约10%的总时间这个方法:

public static function normalizeObjectArray($objects) {
    $normal = array();
    foreach ($objects as $i => $objectName) {
        $options = array();
        if (!is_int($i)) {
            $options = (array)$objectName;
            $objectName = $i;
        }
        list(, $name) = pluginSplit($objectName);
        $normal[$name] = array('class' => $objectName, 'settings' => $options);
    }
    return $normal;
}

有没有人知道如何加快速度?

对于其中一个来说,探查器的输出有以下输出 - 我已经询问了如何改进pluginSplit in this question
enter image description here
(分析比正常执行慢大约10-15倍)

is_int是那么慢还是那个时间“丢失”了?

2 个答案:

答案 0 :(得分:1)

通过删除方法进行优化。

normalizeObjectArray是转换数组的方法:

public $foo = array(
    'One',
    'Two',
    'Three' => array('option' => 1, 'other' => 2)
);

成:

public $foo = array(
    'One' => array('className' => 'One', 'settings' => array()),
    'Two' => array('className' => 'Two', 'settings' => array()),
    'Three' => array('className' => 'Three', 'settings' => array('option' => 1, 'other' => 2))
);

如果不是尝试优化此代码,而是重构代码而不调用它,并确保无论在何处调用它,数组已经所需的格式(例如组件,帮助器,行为数组) ,逻辑是多余的,可以简单地删除。

答案 1 :(得分:0)

首先,你可以避免使用list。相反,你可以这样做:

$normal[pluginSplit($objectName)[1]] = ... ;

其次,我认为(不确定)ctype_digit()可以提高性能。

顺便问一下,你能举例说明$objects的内容吗?这听起来像一个怪异的阵列......