Frage

Ich versuche, die schnellste Art und Weise (in PHP 5), um herauszufinden, zu prüfen, ob ein Wert die Typ I es sein müssen. Ich habe zwei Zeilen Code, die beide das gleiche tun. Das Problem ist, dass ich nicht herausfinden können, welche am schnellsten weg von Benchmarks basiert.

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

Ich habe den folgenden Testcode, aber ich habe nicht mehr als meinen eigenen PC (Core2Quad + XP 32bit + php5.2.5) und ein Konto Dreamhost es mit testen - von denen beide über die gleichen Zeiten für diese Show 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';

Wie auch immer, ich frage mich, ob es vielleicht mehr hier sein, dass ich darüber, welche diese Methoden fehle nur schneller könnte nicht funktionieren - aber vielleicht auch ungeradee Ergebnisse. Eine andere Sache ist, dass sollte dieser Erfolg mit ints voll unter Beweis stellen -. Dann andere Typen wie Strings und Schwimmer sollten auch funktionieren

: UPDATE:

ich gerade getestet, diese Methoden gegen den Schwimmer-Typen und stellte fest, dass settype () war langsamer (0,28 sec) vs floatval () (0,21 sec). So ist die Antwort auf diese Frage kann nur für den Typ int gültig sein.

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

Lösung

Ich denke, man aus purem theoretischem Interesse ist gefragt, weil die Geschwindigkeitsunterschiede in diesem speziellen Fall nicht von Bedeutung in der Praxis berücksichtigt werden kann.

Lassen Sie uns einen Blick in die PHP-Quellcode

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

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

Wie Sie sehen können, verwenden beide die gleiche Funktion convert_to_long Routine (die wiederum reduziert sich auf die Bibliotheksaufruf strtol). settype enthält (einen winzigen) Aufwand für das zweite Argument mit einem Typ String zu vergleichen, so sollte es etwas langsamer sein.

die schnellste Methode wäre zu verwenden (int) gegossen, weil sie nicht einen Funktionsaufruf Opcode beinhalten, sondern direkt von VM ausgeführt wird.

Andere Tipps

Lassen Sie uns einen einfachen Maßstab nehmen:

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

Meine Ergebnisse auf 64-Bit-Ubuntu:

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

Auf langen ganzen Zahlen ist das Bild ähnlich. So (int) ist die beste, aber es gibt keinen wirklichen Grund zu verwenden intval () anstelle von settype ()

Wenn Sie nicht auf die Prüfung ein bazillion Werte planen, es keine praktische Geschwindigkeitsdifferenz sein sollte. Jeder, der existiert, ist so klein, dass es wirklich nichts beeinflussen.

Direct (Typ) Gießen ist die schnellste. Hier ist der Code, den ich jetzt verwenden.

(is_scalar($int) && is_numeric($int) ? (int) $int : 0)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top