SetType ile hızlı PHP Tipi Jugling () * val vs () işlevleri?

4 Cevap php

Ben bir değer type I need olması olduğunu kontrol etmek için (PHP 5) hızlı şekilde anlamaya çalışıyorum. Ben de aynı şeyi yapmak kod iki satır oluşturulur. Sorun hızlı kriterler off dayanır hangi bilemiyorum olabilir.

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

Ben aşağıdaki test kodu oluşturulur ama ben bunu test etmek için kendi PC (Core2Quad + XP 32bit + php5.2.5) ve dreamhost hesabına daha fazla bir yok - bu kod için aynı zamanlarda yaklaşık göstermek her ikisi de.

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

Ama aynı zamanda garip sonuçlar verebilmektedir - Orada Ben bu yöntemlerden daha hızlı çalışması olabilir değil sadece hangi kadar eksik olduğunu burada daha olabilir eğer neyse, ben merak ediyordum. Sonra bu dizeleri ve su baskını gibi diğer türleri de çalışması gerekir - Başka bir şey bu ints tam başarı kanıtlamak gerektiğidir.

: GÜNCELLEME:

Ben sadece şamandıra tipine karşı bu yöntemleri test ve settype () floatval vs (0,28 saniye) () (.21 saniye) yavaş bulundu. Yani bu sorunun cevabı sadece int türü için geçerli olabilir.

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

4 Cevap

Ben bu durumda hız farklılıkları uygulamada önemli olarak kabul edilemez çünkü, saf teorik dışarı çıkar soruyorsun sanırım.

en php kaynak koduna bir göz atalım

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

Gördüğünüz gibi, her iki fonksiyonu (sırayla kütüphane çağrı strtol azaltır) aynı convert_to_long rutin kullanın. settype bir türü dize ile ikinci argüman karşılaştırarak (küçük) yükü içerir, bu yüzden biraz daha yavaş olmalıdır.

hızlı bir yöntem, bir işlev çağrısı işlem kodu dahil, fakat VM doğrudan idam değil çünkü, (int) döküm kullanmak olacaktır.

Basit bir kıyaslama yapalım:

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

64bit Ubuntu My sonuçları:

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

Uzun tamsayılar resim benzer. Yani (int) en iyi olduğunu, ancak orada intval kullanmak için hiçbir gerçek neden yerine setType arasında () var ()

Bir bazillion değerleri test planlıyoruz sürece, herhangi bir pratik hız farkı olmamalıdır. Varolduğunu Herhangi gerçekten hiçbir şey etkilemez çok küçük.

Doğrudan (tip) döküm hızlı. İşte şimdi kullandığımız koddur.

(is_scalar($int) && is_numeric($int) ? (int) $int : 0)