PHP 中变量扩展与冲刺 (sprintf) 的性能

关于性能,做以下事情有什么区别吗:

$message = "The request $request has $n errors";

$message = sprintf('The request %s has %d errors', $request, $n);

在 PHP 中?

我会说调用一个函数涉及更多的东西,但我不知道PHP在幕后做了什么来扩展变量名称。

谢谢!


答案 1

这并不重要。

任何性能提升都将如此之小,以至于您只会在10000或100000次迭代中看到它(作为几百秒的改进) - 即使这样也是如此。

有关具体数字,请参阅此基准。您可以看到它必须使用100,000个函数调用生成1MB以上的数据,才能在数百毫秒内实现可测量的差异。这几乎不是现实生活中的情况。即使是最慢的方法(“带有位置参数的 sprintf()”)也只需要 0.00456 毫秒,而最快的方法则需要 0.00282 毫秒。对于任何需要 100,000 个字符串输出调用的操作,您将有其他因素(例如网络流量),这些因素将比您通过优化此值可能节省的 100 毫秒慢。

使用任何使你的代码对你和其他人来说最具可读性和可维护性的东西。就我个人而言,这种方法是一个不错的想法 - 我必须考虑自己开始使用它。sprintf()


答案 2

在所有情况下,第二个都不会更快,因为您提供的是双引号字符串,也必须为变量解析该字符串。如果您要进行微优化,正确的方法是:

$message = sprintf('The request %s has %d errors', $request, $n);

尽管如此,我相信秒数会变慢(正如@Pekka指出的那样,差异实际上并不重要),因为函数调用,解析字符串,转换值等的开销。但请注意,这两行代码并不等价,因为在第二种情况下,$n被转换为整数。如果$n为“无错误”,则输出第一行:

The request $request has no error errors

而第二个将输出:

The request $request has 0 errors

推荐