Pergunta

Eu estou tentando descobrir a maneira mais rápida (em PHP 5) para verificar se um valor é o digite eu preciso que seja. Eu criei duas linhas de código que ambos fazem a mesma coisa. O problema é que eu não consigo descobrir o que é baseado mais rápida fora de pontos de referência.

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

Eu criei o seguinte código de teste, mas eu não tenho mais do que o meu próprio PC (Core2Quad + XP de 32 bits + php5.2.5) e uma conta dreamhost para testá-lo com - ambos os quais mostram sobre os mesmos tempos para esta código.

$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';

De qualquer forma, eu queria saber se poderia haver mais aqui que eu estou em falta a respeito de qual destes métodos pode não apenas trabalhar mais rápido - mas pode produzir resultados estranhos também. Outra coisa é que caso tal se revele pleno êxito com ints -., Em seguida, outros tipos, tais como cordas e bóias também deve funcionar

: UPDATE:

eu apenas testado contra estes métodos do tipo bóia e descobriram que settype () era mais lenta (0,28 seg) vs floatval () (0,21 s). Portanto, a resposta a esta questão só pode ser válido para o tipo int.

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

Solução

eu acho que você está perguntando por interesse teórico puro, porque as diferenças de velocidade neste caso específico não pode ser considerado importante na prática.

Vamos dar uma olhada no código-fonte php

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

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

Como você pode ver, tanto a função usar a mesma rotina convert_to_long (que por sua vez reduz a strtol chamada de biblioteca). settype inclui (a pequena) sobrecarga de comparar o segundo argumento com um tipo string, por isso deve ser um pouco mais lento.

o método mais rápido seria a utilização (int) elenco, porque não envolve um código de operação chamada de função, mas executados diretamente pela VM.

Outras dicas

Vamos dar uma referência simples:

<?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";

Os meus resultados em 64bit Ubuntu:

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

Em números inteiros longos o quadro é semelhante. Então, (int) é o melhor, mas não há nenhuma razão real para usar intval () em vez de settype ()

A menos que você está pensando em testar um valores bazillion, não deve haver qualquer diferença de velocidade prático. Qualquer que existe é tão pequena que realmente não afeta nada.

Direto (tipo) de fundição é o mais rápido. Aqui está o código que eu uso agora.

(is_scalar($int) && is_numeric($int) ? (int) $int : 0)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top