Bir tamsayı "123"
: PHP kullanarak, böyle bir dize dönüştürmek için en hızlı yolu nedir?
Neden özel yöntem en hızlı? Beklenmedik gibi "hello"
gibi girdi, ya da bir dizi alırsa ne olur?
Ben sadece hızlı bir kıyaslama uygulaması kurdum:
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%)
Ortalama olarak, intval çağrı () iki buçuk kat daha yavaş olduğunu ve girdi zaten bir tamsayı ise fark büyüğüdür.
Gerçi why bilmek ilgi duyarım.
Güncelleme: Ben tekrar testleri çalıştırmak, bu kez zorlama ile (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: Ben sadece bu yöntemlerden birini seçerken farkında olmalıdır biraz beklenmedik davranışı karşısında geldim:
$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)
Tested using PHP 5.3.1
Ben şahsen döküm güzel hissediyorum.
$iSomeVar = (int) $sSomeOtherVar;
'Merhaba' gibi bir dize gönderilmesi gerektiğini, bu tamsayı 0 atılacaktır. 'Gibi '22 yaşındayım gibi bir dize için, onu bir dizi ayrıştırmak değil 22. Şey tamsayı atılacaktır 0 olur.
Eğer gerçekten hızını İHTİYACINIZ yaparsanız, ben diğer önerileri burada zorlama hızlı olduğunu varsayarak doğru sanırım.
Bir test çalıştırın.
string coerce: 7.42296099663
string cast: 8.05654597282
string fail coerce: 7.14159703255
string fail cast: 7.87444186211
Bu, her senaryoyu 10.000.000 kez koştu bir test oldu. :-)
Co-ercion bir 0 + "123"
Döküm olan (integer)"123"
Ben Co-ercion bir nebze daha hızlı olduğunu düşünüyorum. Oh, ve çalışıyor 0 + array('123')
PHP ölümcül bir hatadır. Eğer kod verilen değerin türünü kontrol etmek isteyebilirsiniz.
Benim test kodu aşağıda.
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";
}
}
}