Question

J'essaie de trouver le moyen le plus rapide (en PHP 5) de vérifier qu'une valeur est tapez ce dont j'ai besoin pour l’être. J'ai créé deux lignes de code qui font la même chose. Le problème est que je ne peux pas déterminer lequel est le plus rapide sur la base de critères.

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

J'ai créé le code de test suivant, mais je n'ai pas plus que mon propre PC (Core2Quad + XP 32bit + php5.2.5) et un compte dreamhost pour le tester - les deux ayant à peu près les mêmes délais pour cela code.

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

Quoi qu'il en soit, je me demandais s’il ne me manquait pas plus de savoir laquelle de ces méthodes pourrait non seulement fonctionner plus rapidement, mais pourrait également donner des résultats étranges. Une autre chose est que si cela réussit pleinement avec ints, d’autres types tels que les chaînes et les floats devraient également fonctionner.

: UPDATE:

Je viens de tester ces méthodes avec le type float et j'ai constaté que settype () était plus lent (0,28 seconde) que floatval () (0,21 seconde). La réponse à cette question ne peut donc être valable que pour le type int.

//Float
(is_scalar($value) ? floatval($value) : 0);
settype($value, 'float');
Était-ce utile?

La solution

Je suppose que vous demandez par intérêt purement théorique, car les différences de vitesse dans ce cas particulier ne peuvent pas être considérées comme importantes dans la pratique.

jetons un coup d'oeil dans le code source 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

comme vous pouvez le constater, les deux fonctions utilisent la même routine convert_to_long (qui se réduit à l'appel de la bibliothèque strtol). settype inclut (minuscule) surcharge de la comparaison du deuxième argument avec une chaîne de type, il devrait donc être légèrement plus lent.

la méthode la plus rapide consisterait à utiliser (int) cast, car elle n'implique pas d'opcode d'appel de fonction, mais est exécutée directement par la VM.

Autres conseils

Prenons un repère simple:

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

Mes résultats sur Ubuntu 64 bits:

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

Sur les entiers longs, l’image est similaire. Donc (int) est le meilleur, mais il n’ya pas de vraie raison d’utiliser intval () au lieu de settype ()

Sauf si vous avez l’intention de tester des milliards de dollars, il ne devrait pas y avoir de différence de vitesse pratique. Tout ce qui existe est si petit qu'il n'affecte vraiment rien.

La diffusion directe (type) est la plus rapide. Voici le code que j'utilise maintenant.

(is_scalar($int) && is_numeric($int) ? (int) $int : 0)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top