繁体   English   中英

使用settype()和* val()函数最快的PHP类型检查?

[英]Fastest PHP Type Jugling with settype() vs *val() functions?

我试图找出最快的方法(在PHP 5中)来检查值是否是我需要类型 我创建了两行代码,它们都做同样的事情。 问题是我无法根据基准找出最快的。

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

我创建了以下测试代码,但除了我自己的PC(Core2Quad + XP 32bit + php5.2.5)和一个dreamhost帐户即可使用它进行测试-这两个代码显示的时间大致相同。

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

无论如何,我想知道是否还有更多的地方想念这些方法中的哪一种不仅可以更快地工作,而且还可能产生奇怪的结果。 另一件事是,如果这证明使用int完全成功,那么其他类型(例如字符串和浮点数)也应该起作用。

:更新时间:

我只是针对浮点类型测试了这些方法,发现settype()比floatval()慢(.28秒)(。21秒)。 因此,此问题的答案可能仅对int类型有效。

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

我想您是出于纯粹的理论兴趣而提出的,因为在这种情况下,速度差异在实践中不被认为是重要的。

让我们来看看php源代码

间隔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

如您所见,这两个函数都使用相同的convert_to_long例程(依次减少为库调用strtol)。 settype包括比较第二个参数和类型字符串的开销(很小),因此它应该稍微慢一些。

最快的方法是使用(int)强制转换,因为它不涉及函数调用操作码,而是由VM直接执行。

让我们以一个简单的基准:

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

我在64位Ubuntu上的结果:

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

在长整数上,图片相似。 所以(int)是最好的,但是没有真正的理由使用intval()而不是settype()

除非您打算测试成千上万的值,否则不应有任何实际的速度差异。 任何存在的东西都很小,不会真正影响任何东西。

直接(类型)铸造最快。 这是我现在使用的代码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM