0

私は自分のコードをphpでプロファイリングしています。質問は次の機能についてです:

// returns true if edge exists in the tree
protected function edgeExist( $srcNodeId, $firstToken ) {
    $result = array_key_exists( $srcNodeId, $this->edges )
              && array_key_exists( $firstToken, $this->edges[$srcNodeId]);
    return $result;
}

プロファイラーによると、関数edgeExistは実行時間の約10%を消費しますが、関数は実行時間array_key_existsの約0.2%を消費します。なぜ関数はedgeExistそんなに多くを消費するのですか?

4

3 に答える 3

1

これはもっと速いかもしれません、それを試してください:

protected function edgeExist( $srcNodeId, $firstToken ) {
    return isset($this->edges[$srcNodeId][$firstToken]);
}

とを使用する場合、わずかな違いがarray_key_exists()ありisset()ます。マニュアルをご覧ください。

于 2012-07-11T22:56:40.970 に答える
0

プロファイルの結果を比較してみてください

protected function edgeExist( $srcNodeId, $firstToken ) {
    $result = array_key_exists( $firstToken, array());
    return $result;
}

protected function edgeExist( $srcNodeId, $firstToken ) {
    $result = array_key_exists( $firstToken, $this->edges[$srcNodeId]);
    return $result;
}

$ this-> edges [$ srcNodeId]は巨大な配列であり、phpはそれに内部魔法をかける必要があると思います。

于 2012-07-11T23:12:55.753 に答える
0

各部分が実行された時間を測定できます。

protected function edgeExist( $srcNodeId, $firstToken ) {
    $time = microtime();
    $result1 = array_key_exists( $srcNodeId, $this->edges )
    $time2 = microtime();
    $result2 = array_key_exists( $firstToken, $this->edges[$srcNodeId]);
    $time3 = microtime();
    $result = $result1 && $result2;
    $time4 = microtime();
    echo "calculating the first result took " . $time2 - $time1 . " microseconds\n".
    echo "calculating the second result took " . $time3 - $time2 . " microseconds\n".
    echo "calculating the && took " . $time4 - $time3 . " microseconds\n".
    return $result;
}

これは謎を解くはずです;)

于 2012-07-11T23:31:11.810 に答える