<?php function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } $foo = "1';Select * ..."; // (int) $fStart = microtime_float(); for($i=0;$i<1000000;$i++) { $bar = (int)$foo; } $fEnd = microtime_float(); print "(int):" . ($fEnd - $fStart) . "s<br />"; // intval() $fStart = microtime_float(); for($i=0;$i<1000000;$i++) { $bar = intval($foo); } $fEnd = microtime_float(); print "intval():" . ($fEnd - $fStart) . "s<br />"; // sprintf() $fStart = microtime_float(); for($i=0;$i<1000000;$i++) { $bar = sprintf("%d", $foo); } $fEnd = microtime_float(); print "sprintf():" . ($fEnd - $fStart) . "s<br />"; ?>
最终的测试结果:
(int):0.67205619812012s
intval():1.1603000164032s
sprintf():2.1068270206451s
(int):0.66051411628723s
intval():1.1493890285492s
sprintf():2.1008238792419s
(int):0.66878795623779s
intval():1.1613430976868s
sprintf():2.0976209640503s
虽然这个测试有点变态(谁会连续转换100w次的整数?),但是由此可以看出,使用强制类型转换将字符串转化为整数速度是最快的。
PHP中将字符串转换为整数的最快方法起步
这是个旧贴,在 SO 上偶然看到的:https://stackoverflow.com/questions/239136/fastest-way-to-convert-string-to-integer-in-php
对于 "123" => 123 最快的方法是什么,如果是 "hello" => ? 转为整型又会有什么问题。
intval vs int
我以前是混着用的,有时用 intval($var) 有时用 (int) $var ,纯看哪个顺手。看了 SO 上才知道,显式的类型转换的性能大约是 intval 4 倍。这就可以是性能调优的小 Tip 了。
我测了不同的 $val 值,发现两者得到的结果完全一样,发出的警告也是相同的。
因此在不考虑 intval 需要第二个参数的情况下,就可以放心的使用 int 来做转换了。
深层原因
网友 Joseph Scott 对 OPCODE 进行了分析,解释了其深层原因
intval() 0 ASSIGN 1 SEND_VAR 2 DO_FCALL 3 ASSIGN 4 RETURN 5* ZEND_HANDLE_EXCEPTION int 0 ASSIGN 1 CAST 2 ASSIGN 3 RETURN 4* ZEND_HANDLE_EXCEPTION
SEND_VAR 和 DO_FCALL 操作,是导致 int 比 intval() 快很多的原因。
ps: 还有另一个类型转换的 settype 就不用试了,它的性能比 intval 和 int 都差。
总结
使用强制类型转换方式将字符串转化为整数是最直接的转化方式之一(可以直接获得整型的变量值)。从代码可读性角度上讲,sprintf方式代码比较长,而且其结果有可能还需要再次进行强制类型转换,而intval函数是典型的面向过程式转换,强制类型转换则比较直接的将“我要转化”这个思想传递给阅读者。从效率上讲,强制类型转换方式也是最快速的转化方式。因此,对于经常进行转化工作的程序员,我推荐使用这种方式。
您可能感兴趣的文章: