Domanda

Sto cercando di capire il modo più veloce (in PHP 5) per verificare che un valore sia tipo ho bisogno di essere. Ho creato due righe di codice che fanno entrambe la stessa cosa. Il problema è che non riesco a capire quale sia il più veloce in base ai parametri di riferimento.

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

Ho creato il seguente codice di prova ma non ho altro che il mio PC (Core2Quad + XP 32bit + php5.2.5) e un account dreamhost con cui testarlo - entrambi i quali mostrano all'incirca gli stessi orari per questo codice.

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

Ad ogni modo, mi chiedevo se ci potesse essere qualcosa in più qui che mi manca su quale di questi metodi potrebbe non solo funzionare più velocemente, ma potrebbe anche produrre risultati strani. Un'altra cosa è che questo dovrebbe rivelarsi un successo pieno di ints - quindi dovrebbero funzionare anche altri tipi come stringhe e float.

: UPDATE:

Ho appena testato questi metodi con il tipo float e ho scoperto che settype () era più lento (.28 sec) vs floatval () (.21 sec). Quindi la risposta a questa domanda potrebbe essere valida solo per il tipo int.

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

Soluzione

Immagino tu stia chiedendo per puro interesse teorico, perché le differenze di velocità in questo caso particolare non possono essere considerate importanti nella pratica.

diamo un'occhiata al codice sorgente 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

come puoi vedere, entrambe le funzioni usano la stessa routine convert_to_long (che a sua volta si riduce alla chiamata in libreria strtol). settype include (un piccolo) sovraccarico di confrontare il secondo argomento con una stringa di tipo, quindi dovrebbe essere leggermente più lento.

il metodo più veloce sarebbe usare il cast (int), perché non implica un codice operativo di chiamata di funzione, ma eseguito direttamente dalla VM.

Altri suggerimenti

Diamo un semplice benchmark:

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

I miei risultati su Ubuntu a 64 bit:

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

Sui numeri interi lunghi l'immagine è simile. Quindi (int) è il migliore, ma non c'è un vero motivo per usare intval () invece di settype ()

A meno che tu non stia pianificando di testare valori bazillion, non ci dovrebbe essere alcuna differenza di velocità pratica. Tutto ciò che esiste è così piccolo da non influire su nulla.

Il casting diretto (tipo) è il più veloce. Ecco il codice che uso ora.

(is_scalar($int) && is_numeric($int) ? (int) $int : 0)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top