1
yangqi 2014-06-16 09:40:58 +08:00
你这个代码运行个10次100次,然后去个平均数再看看能不能得到相同结果在下结论
|
2
yakczh OP 10次
call_by_name exec time 0.002500057220459 call_user_func exec time 0.002500057220459 100次 call_by_name exec time 0.022500991821289 call_user_func exec time 0.022500038146973 |
4
rannnn 2014-06-16 10:00:52 +08:00
运行一次1秒多 10次0.002?
|
5
9 2014-06-16 10:11:42 +08:00
call_user_func($func) 比 $func(); 多绕了一步, 耗时多点不是很正常吗.
|
6
skydiver 2014-06-16 10:23:42 +08:00
猜测:第一次执行一个函数要加载,第二次不用了。。
|
7
yakczh OP @9 运行10次 耗时相同,推翻了我的结论
运行100次 call_user_func 耗时更少, 你从哪里看出耗时多点了? |
10
9 2014-06-16 11:03:05 +08:00
是 10w 次
|
12
yakczh OP @9 给你一步一步举个例子说明 第一步 函数实现不变,先运行$func() 再运行call_user_func($func);
... $func='test'; define('REPEAT',10000*10); $cnt=REPEAT; $start=microtime(true); do { $func(); } while ($cnt--); $end=microtime(true); echo "\ncall_by_name exec time " ,$end-$start; $cnt=REPEAT; $start=microtime(true); do { call_user_func($func); }while ($cnt--); $end=microtime(true); echo "\ncall_user_func exec time " ,$end-$start; 输出结果 应该是 call_by_name exec time 11.320173978806 call_user_func exec time 10.576663970947 第二步, 函数实现不变,先运行call_user_func($func); 再运行 $func() ... $func='test'; define('REPEAT',10000*10); $cnt=REPEAT; $start=microtime(true); do { call_user_func($func); }while ($cnt--); $end=microtime(true); echo "\ncall_user_func exec time " ,$end-$start; $cnt=REPEAT; $start=microtime(true); do { $func(); } while ($cnt--); $end=microtime(true); echo "\ncall_by_name exec time " ,$end-$start; 输出结果应该是 call_user_func exec time 11.387675046921 call_by_name exec time 10.002654075623 然后思考 函数实现与输出结果之间的相关性 |
13
0xef 2014-06-16 11:36:57 +08:00
越在前面越耗时是可能的
因为可能存在缓存。内存的缓存(例如预先malloc),文件信息的缓存(当然跟这里的话题)。首次运行某些函数可能会建立缓存所以会慢一些,而后来的运行因为有缓存的存在所有会快一些 http://cogug.com/ur9893 |
14
9 2014-06-16 11:41:49 +08:00 1
不就是2个代码段互换过来跑吗. 我这边是这样.
|
15
yakczh OP 从输出结果就看出来不对,或者你修改了原始程序
|
16
9 2014-06-16 11:53:23 +08:00
哪里不对, 前后发的两张图的时间都差不多. 我俩机器不一样, 我的时间跟你的时间不同很正常啊
|
17
yakczh OP |
18
yakczh OP |
19
rannnn 2014-06-16 13:38:15 +08:00
理论上应该是call_user_func慢的 然后找到call_user_func的定义,里面有个zend_fcall_info_cache保存了一些scope的信息貌似 所以我猜第一次call的时候会缓存。所以摆在前面的比较慢 不懂 core 瞎猜的 |