À l'aide de PHP, ce qui est le moyen le plus rapide pour convertir une chaîne de caractères comme ceci: "123"
d'un entier?
Pourquoi est-ce la méthode la plus rapide? Qu'advient-il si il fait inattendu d'entrée, comme "hello"
ou un tableau?
À l'aide de PHP, ce qui est le moyen le plus rapide pour convertir une chaîne de caractères comme ceci: "123"
d'un entier?
Pourquoi est-ce la méthode la plus rapide? Qu'advient-il si il fait inattendu d'entrée, comme "hello"
ou un tableau?
Je viens de mettre en place rapidement un exercice d'analyse comparative:
Function time to run 1 million iterations
--------------------------------------------
(int) "123": 0.55029
intval("123"): 1.0115 (183%)
(int) "0": 0.42461
intval("0"): 0.95683 (225%)
(int) int: 0.1502
intval(int): 0.65716 (438%)
(int) array("a", "b"): 0.91264
intval(array("a", "b")): 1.47681 (162%)
(int) "hello": 0.42208
intval("hello"): 0.93678 (222%)
En moyenne, appelant intval() est deux fois et demi plus lent, et la différence est la plus grande si votre entrée est déjà un entier.
Je serais curieux de savoir pourquoi .
Mise à jour: j'ai exécuter les tests, cette fois avec la coercition (0 + $var)
| INPUT ($x) | (int) $x |intval($x) | 0 + $x |
|-----------------|------------|-----------|-----------|
| "123" | 0.51541 | 0.96924 | 0.33828 |
| "0" | 0.42723 | 0.97418 | 0.31353 |
| 123 | 0.15011 | 0.61690 | 0.15452 |
| array("a", "b") | 0.8893 | 1.45109 | err! |
| "hello" | 0.42618 | 0.88803 | 0.1691 |
|-----------------|------------|-----------|-----------|
Addendum: je viens de trouver un peu inattendu comportement que vous devez être conscient au moment de choisir l'une de ces méthodes:
$x = "11";
(int) $x; // int(11)
intval($x); // int(11)
$x + 0; // int(11)
$x = "0x11";
(int) $x; // int(0)
intval($x); // int(0)
$x + 0; // int(17) !
$x = "011";
(int) $x; // int(11)
intval($x); // int(11)
$x + 0; // int(11) (not 9)
Testé à l'aide de PHP 5.3.1
Personnellement, je pense que le casting est la plus jolie.
$iSomeVar = (int) $sSomeOtherVar;
Si une chaîne de caractères comme "Bonjour" être envoyé, il sera jeté à l'entier 0. Pour une chaîne telle que "22 ans", elle sera convertie en entier 22. Tout ce qu'il ne peut pas analyser un certain nombre devient 0.
Si vous avez vraiment BESOIN de la vitesse, je suppose que les autres suggestions ici sont correct en supposant que la contrainte est la plus rapide.
L'exécution d'un test.
string coerce: 7.42296099663
string cast: 8.05654597282
string fail coerce: 7.14159703255
string fail cast: 7.87444186211
C'était un test exécuté chaque scénario de 10 000 000 de fois. :-)
La contrainte est - 0 + "123"
Le Casting est (integer)"123"
Je pense que la Contrainte est un tout petit peu plus rapide. Oh, et en essayant 0 + array('123')
est une erreur fatale en PHP. Vous pourriez voulez que votre code pour vérifier le type de la valeur fournie.
Mon test de code est ci-dessous.
function test_string_coerce($s) {
return 0 + $s;
}
function test_string_cast($s) {
return (integer)$s;
}
$iter = 10000000;
print "-- running each text $iter times.\n";
// string co-erce
$string_coerce = new Timer;
$string_coerce->Start();
print "String Coerce test\n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_coerce('123');
}
$string_coerce->Stop();
// string cast
$string_cast = new Timer;
$string_cast->Start();
print "String Cast test\n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_cast('123');
}
$string_cast->Stop();
// string co-erce fail.
$string_coerce_fail = new Timer;
$string_coerce_fail->Start();
print "String Coerce fail test\n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_coerce('hello');
}
$string_coerce_fail->Stop();
// string cast fail
$string_cast_fail = new Timer;
$string_cast_fail->Start();
print "String Cast fail test\n";
for( $i = 0; $i < $iter ; $i++ ) {
test_string_cast('hello');
}
$string_cast_fail->Stop();
// -----------------
print "\n";
print "string coerce: ".$string_coerce->Elapsed()."\n";
print "string cast: ".$string_cast->Elapsed()."\n";
print "string fail coerce: ".$string_coerce_fail->Elapsed()."\n";
print "string fail cast: ".$string_cast_fail->Elapsed()."\n";
class Timer {
var $ticking = null;
var $started_at = false;
var $elapsed = 0;
function Timer() {
$this->ticking = null;
}
function Start() {
$this->ticking = true;
$this->started_at = microtime(TRUE);
}
function Stop() {
if( $this->ticking )
$this->elapsed = microtime(TRUE) - $this->started_at;
$this->ticking = false;
}
function Elapsed() {
switch( $this->ticking ) {
case true: return "Still Running";
case false: return $this->elapsed;
case null: return "Not Started";
}
}
}
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.