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的性能的主要内容,如果未能解决你的问题,请参考以下文章

PHP 格式化字符串sprintf()

php sprintf()与外国字符?

php扩展在全局变量中不存在但是打印phpinfo却存在?

PHP中函数sprintf .vsprintf (占位符)

php扩展与嵌入--变量的里里外外

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]