我正在编写一些简单的文件操作,如果将字符串大小保存在变量中会不会更快,就会想到一个想法。结果表明它快10倍。
使用此代码:

include "../classes/Timer.class.php";
$t = new Timer();             //Timer class I've written for this purpose [link below]
$multiplyer = 3000000;        //Times to try the operation
$string = str_repeat("ggggggggggg",2);  //I first tried 2000 here, but for 2 there are same results
$t("calling");     //Saving time
for($i=0; $i<$multiplyer; $i++) {
  $size =  strlen($string);
  $size2 = strlen($string);
  $size3 = strlen($string);
}
$t("clover");
$t("caching");     //Saving time
for($i=0; $i<$multiplyer; $i++) {
  $size =  strlen($string);
  $size2 = $size;
  $size3 = $size;
}
$t("chover");
$total = $t["calling-clover"]+$t["caching-chover"];  //percents are usefull :)
echo "Calling: {$t["calling-clover"]} (".round(($t["calling-clover"]/$total)*100)."%)<br>\n";
echo "Caching in variables: {$t["caching-chover"]} (".round(($t["caching-chover"]/$total)*100)."%)<br>\n";


结果:


致电:1.988455057(67%)
缓存变量:0.984993458(33%)


更有趣的是,我在str_repeat调用中输入的数字并不重要,因此strlen显然不计算任何内容-大小必须保存在某个地方,而strlen只是该函数返回值。
这意味着:
真的函数调用这么慢吗?
如果不是,此strlen是特定的吗?

Timer.class.php

最佳答案

函数调用比变量检索要多得多。每次执行函数时:


创建一个新的堆栈,并将函数的参数存储在堆栈中。
该函数的返回值在堆栈上分配了内存
先前分配的内存地址存储在堆栈中
该函数的地址称为
该函数从堆栈中读取参数
返回值存储在堆栈中
将执行恢复到调用方并清除堆栈

关于php - 当字符串大小无关紧要时,为什么strlen()比使用变量慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14835246/

10-13 04:47