你好 dedlfix,
Nun, ich kann keinen signifikanten Laufzeitunterschied zwischen
is_numeric($s{0}) und ctype_digit($s{0}) feststellen.Das liegt daran, dass die Eingabemenge nur ein Zeichen ist ;)
Ich habe meinen Versuchsaufbau nochmal mit dem gesamten String (8
Zeichen) wiederholt und konnte nun eine geringfüging längere Laufzeit
von is_numeric() feststellen.
Das liegt daran, dass das umwandeln von 8 Zeichen in eine Zahl nunmal sehr
schnell geht auf heutigen Systemen ;) Sitzt ja auch nicht viel hinter.
Nichts desto trotz kann man einwandfrei ausrechnen, dass die Komplexität
von is_nummeric() höher ist. Das wirkt sich allerdings nicht immer auf
die Laufzeit aus, das hatte dir Christoph aber ja auch schon gesagt.
Da fällt das bei einer interpretierten Sprache nicht so sehr auf, dass
da mehr dahinter sitzt.PHP ist seit Version 4 keine interpretierte Sprache mehr. Es findet eine
Bytecode-Kompilierung statt.
Eh, und warum sollte es keine interpretierte Sprache mehr sein? Nur weil
Bytecode durch eine VM geschickt wird? ;) Das ist auch eine Sprache und
die wird auch interpretiert. Nene, Kamerad, natürlich ist PHP auch
weiterhin eine interpretierte Sprache. :)
Aber vertrau mir, ich habe im Source nachgeschaut, is_nummeric() ist
aufwändiger als ctype_digit().Das tat ich auch (das Nachschauen). Jedoch bin ich des C nicht mächtig
genug, deswegen schwieg ich darüber. Ich fand jedoch in beiden Funtionen
einen Verweis auf das gleiche Makro (Z_TYPE_irgendwas, wenn ich mich
recht erinnere (und das als Macro richtig erkannt habe)), das, so schien
es mir die eigentliche Prüfung vornimmt.
Nein, es ist etwas komplexer. Bei is_numeric() wird, sofern der interne
Datentyp nicht eh schon „Zahl“ ist, is_numeric_string() aufgerufen. Bei
ctype_digit() dagegen wird direkt isdigit() aufgerufen (CTYPE(isdigit), wobei das Makro CTYPE() nur noch ein paar Typechecks macht; bei einem
String wird dann halt zeichenweise durchgegangen und isdigit() auf jedes
Zeichen angewand). Zugegeben, es wird nicht viel Zeit gespart, aber doch
ein wenig, es entfällt die „* 10 + <nummer>“-Operation. Am deutlichsten
dürftest du es merken bei einer sehr langen Zahl, die an die Grenzen des
long-Bereichs gehen. Leichte Abänderung deines Codes:
<?php
define('LOOP', 100000);
$s = '489249237492384732947239429472394724';
$start = microtime_float();
for ($i= 0; $i < LOOP; $i++)
$a = is_numeric($s);
$ende = microtime_float();
printf('%19f', $ende - $start);
echo '<br>';
$start = microtime_float();
for ($i= 0; $i < LOOP; $i++)
$a = ctype_digit($s);
$ende = microtime_float();
printf('%19f', $ende - $start);
function microtime_float() {
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
?>
Dabei solltest du sich deutlich unterscheidende Zeiten bekommen. Ich
bekomme für ctype_digit() etwas weniger als die Hälfte an Laufzeit wie
bei is_nummeric().
再见,
克里斯蒂安