3

値が必要なタイプであることを確認するための最速の方法(PHP 5)を見つけようとしています。同じことを行う2行のコードを作成しました。問題は、ベンチマークに基づいてどれが最速かわからないことです。

(is_scalar($value) ? intval($value) : 0);
settype($value, 'integer');

次のテストコードを作成しましたが、自分のPC(Core2Quad + XP 32bit + php5.2.5)とそれをテストするためのdreamhostアカウントしか持っていません。どちらもこのコードでほぼ同じ時間を示しています。

$array = array(
    'false' => FALSE,
    'false2'=> 0,
    'false3'=> '0',
    'false4'=> 'FALSE',
    'true'  => TRUE,
    'true2' => 1,
    'true3' => '1',
    'true4' => 'TRUE',

    'char'  => chr(250),
    'char2' => chr(10),
    'utf'   => 0xF0,
    'utf1'  => 0xFE,

    'number' => '452.5435',
    'number2' => '-3948.33e2',
    'number3' => -343.54,
    'number4' => 99.999,
    'number5' => '3jk439fjk23945t324098523.349fj324r',

    'int'   => 2323,
    'int2'  => '2345',
    'int3'  => '0',
    'int4'  => array(),
    'int5'  => '39582347823908270983249078530793249802357846t890234879023490785',
    'int6'  => 3895732890543789324890123467548093248976123890548793289073246789458901234,

    'object3' => new SimpleXMLElement('<xml></xml>'),

    'array' => array(),
    'array2' => array('hello'),
    'array3' => array(3,54,21,0),
    'array4' => array(0.2)
);


$start = microtime(TRUE);

for($x=0;$x<10000;$x++) {
    foreach( $array as $value ) {
        (is_scalar($value) ? intval($value) : 0);
        //settype($value, 'integer');
    }
}

print (microtime(TRUE) - $start). ' seconds';

とにかく、これらの方法のどれがより速く機能するだけでなく、奇妙な結果をもたらす可能性があるかについて、私が見逃していることがもっとあるのではないかと思っていました。もう1つのことは、これがintで完全に成功することを証明した場合、文字列や浮動小数点数などの他のタイプも機能するはずです。

:アップデート:

これらのメソッドをfloatタイプに対してテストしたところ、settype()の方がfloatval()(。21秒)よりも遅い(.28秒)ことがわかりました。したがって、この質問への回答は、int型に対してのみ有効である可能性があります。

//Float
(is_scalar($value) ? floatval($value) : 0);
settype($value, 'float');
4

4 に答える 4

5

この特定の場合の速度の違いは実際には重要であるとは考えられないので、あなたは純粋な理論的関心から質問していると思います。

PHPのソースコードを見てみましょう

intval http://lxr.php.net/source/php-src/ext/standard/type.c#142

settype http://lxr.php.net/source/php-src/ext/standard/type.c#95

ご覧のとおり、両方の関数は同じconvert_to_longルーチンを使用します(これは、ライブラリ呼び出しstrtolになります)。settypeには、2番目の引数を型文字列と比較する(小さな)オーバーヘッドが含まれているため、少し遅くなるはずです。

最速の方法は、(int)キャストを使用することです。これは、関数呼び出しのオペコードを含まないが、VMによって直接実行されるためです。

于 2009-10-24T20:14:19.970 に答える
1

簡単なベンチマークを見てみましょう。

<?php
$y = "45678912";

$time_start = microtime(true);
for ($i=0; $i<500000; $i++) {
    $x = $y;
    $x = intval($x);
}
echo "\nintval: " . (microtime(true) - $time_start) . " sec.";

$time_start = microtime(true);
for ($i=0; $i<500000; $i++) {
    $x = $y;
    $x = (int)$x;
}
echo "\n(int): " . (microtime(true) - $time_start) . " sec.";

$time_start = microtime(true);
for ($i=0; $i<500000; $i++) {
    $x = $y;
    settype($x, 'int');
}
echo "\nsettype: " . (microtime(true) - $time_start) . " sec.\n";

64ビットUbuntuでの私の結果:

intval: 0.47533583641052 sec.
(int): 0.19618892669678 sec.
settype: 0.51951289176941 sec.

長整数の場合、画像は似ています。したがって、(int)が最適ですが、settype()の代わりにintval()を使用する本当の理由はありません。

于 2013-08-14T09:22:05.463 に答える
0

バジリオン値のテストを計画しているのでない限り、実際の速度の違いはありません。存在するものは非常に小さいので、実際には何も影響しません。

于 2009-10-24T19:57:35.167 に答える
0

直接(型)キャストが最速です。これが私が今使っているコードです。

(is_scalar($int) && is_numeric($int) ? (int) $int : 0)
于 2009-10-24T21:31:50.870 に答える