PHP中变量扩展与sprintf的性能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP中变量扩展与sprintf的性能相关的知识,希望对你有一定的参考价值。
关于性能,做什么之间有什么区别:
$message = "The request $request has $n errors";
和
$message = sprintf('The request %s has %d errors', $request, $n);
用php?
我会说调用函数涉及更多的东西,但我不知道PHP在幕后扩展变量名称是做什么的。
谢谢!
在所有情况下,第二个都不会更快,因为您提供的是双引号字符串,也必须为变量进行解析。如果您要进行微优化,正确的方法是:
$message = sprintf('The request %s has %d errors', $request, $n);
尽管如此,我认为秒数较慢(因为@Pekka指出差异实际上并不重要),因为函数调用的开销,解析字符串,转换值等等。但请注意,2行代码不是相当于,因为在第二种情况下,$ n被转换为整数。如果$ n是“无错误”,那么第一行将输出:
The request $request has no error errors
而第二个将输出:
The request $request has 0 errors
不要紧。
任何性能提升都是如此微不足道,以至于你会看到它(仅仅是几秒钟内的改进)只有10000s或100000次迭代 - 即便如此。
有关具体数字,请参阅this benchmark。您可以看到它必须使用100,000个函数调用生成1MB +的数据,以在数百毫秒内实现可测量的差异。几乎没有现实生活中的情况。即使是最慢的方法(带有位置参数的“sprintf()”)也只需要0.00456毫秒,最快的是0.00282毫秒。对于任何需要100,000个字符串输出调用的操作,您将有其他因素(例如网络流量),这些因素将比您通过优化它可以节省的100毫秒慢一个级别。
使用任何使您的代码最易读和可维护的代码。对我个人来说,sprintf()
方法是一个很好的想法 - 我必须考虑自己开始使用它。
关于“变量扩展与sprintf”的性能分析是here。
正如@pekka所说,“使您和其他人的代码最具可读性和可维护性”。当性能增益“低”(〜不到两次)时,忽略它。
总结基准:PHP针对Double-quoted和Heredoc分辨率进行了优化。关于平均时间的百分比,仅使用计算非常长的字符串,
- 双引号分辨率:75%
- heredoc分辨率:82%
- 单引号连接:93%
- sprintf格式:117%
- 使用索引参数形成sprintf:133%
请注意,只有sprintf执行一些格式化任务(参见基准测试'%s%s%d%s%f%s'),并且正如@Darhazer所示,它在输出方面有所不同。一个更好的测试是两个基准测试,一个只比较连接时间('%s'格式化程序),其他包括格式化过程 - 例如'%3d%2.2f'和功能等价物,然后将变量扩展为双引号...还有一个使用短模板字符串的基准组合。
PROS和CONS
正如基准测试所显示的那样,sprintf
的主要优点是非常低成本的格式化程序(!)。对于通用模板,我建议使用vsprintf函数。
doubled-quoted(和heredoc)的主要优点是一些性能;当与sprintf的位置标记进行比较时,名义占位符的一些可读性和可维护性随着参数的数量(1之后)而增长。
索引占位符的使用处于sprintf可维护性的一半。
注意:仅在必要时才使用单引号连接。请记住,PHP启用安全语法,如"Hello {$user}_my_brother!"
,以及像"Hello {$this->name}!"
这样的引用。
对于将多个String变量注入String,第一个变速器会更快。
$message = "The request $request has $n errors";
对于单次注入,点(。)连接将更快。
$message = 'The request '.$request.' has 0 errors';
用十亿次循环进行迭代并找到差异。
例如:
<?php
$request = "XYZ";
$n = "0";
$mtime = microtime(true);
for ($i = 0; $i < 1000000; $i++) {
$message = "The request {$request} has {$n} errors";
}
$ctime = microtime(true);
echo ($ctime-$mtime);
?>
最后,当考虑单个变量赋值的上下文时,第1个是最快的,可以通过查看各种基准来看到。也许,使用核心PHP函数的sprintf风格可以允许更多可扩展的代码,并且可以更好地优化opcache或apc等字节码级缓存机制。换句话说,当使用sprintf方法时,特定大小的应用程序可以使用更少的代码。缓存到RAM中的代码越少,对其他东西或更多脚本的RAM就越多。但是,这只有在脚本无法通过评估正确适应RAM的情况下才有意义。
以上是关于PHP中变量扩展与sprintf的性能的主要内容,如果未能解决你的问题,请参考以下文章