纠正所谓“优化PHP速度”的几个错误/过时观点

今天看了GOOGLE的网站加速技巧,然后又看到了PHP小组针对上面技巧中的PHP部分做的反驳,受益匪浅啊。GOOGLE提出的一些PHP优化建议,之前在其他文章中也经常看到,所以在我脑海中就完全同意这些观点了;今天看到PHP小组的反驳后才知道,原来这些都是一些旧观点,基本是PHP4的优化建议,到PHP5中,这些所谓优化已经过时无效或已内置解决。连GOOGLE都不知道这些,相信大家知道的也不多,所以转来给大家看。

错误观点1. 没有原因尽量不要复制变量

PHP 4和5核心的Zend引擎使用了一个名为“copy-on-write”的内存管理系统。也就是说,无论你将一个变量的值赋值给另一个变量多少次,只要你不改变数值,数据是不会被复制的。范例:
$data
= str_repeat(“*”, 512 * 1024); // synthesize 512K of data
$memory_used_before = memory_get_usage();
$more_data = $data;
$memory_used_after = memory_get_usage();
print “Before: {$memory_used_before}nAfter: {$memory_used_after}n”;

有thread-safety及调试功能的PHP 5.3下:

之前:853968

之后:854236

没有thread-safety及调试功能的PHP 5.2下:

之前:581912

之后:581976

也就是,调试模式下有268字节的差别,正常模式下(普遍使用的)有64字节的差别。这和Google文中所述(51CTO编者注:Google原文的描述中,复制变量会“导致双倍的内存消耗”)相差甚远。

需要注意的是,PHP代码中坚决禁止在没有恰当过滤的情况下将用户提供的变量原本内容进行echo或者存储。

错误观点2. 为长字符串使用单引号

针对PHP 5.2及5.3的基准测试显示,虽然双引号使用窜改(interpolation)而单引号使用连锁(concatenation),这两个的速度是完全一致的(甚至双引号常常会更快一些)。当使用没有包含变量的普通字符串时,使用双引号的性能要明显占优。

错误观点3. 使用echo而非print

这两个方法的运行速度取决于你的PHP是如何设置在host上的。

错误观点4. 不要与echo一起使用concatenation(连锁)

事实正好相反。新的引擎处理多条echo的方法,导致在echo中使用concatenation实际上会比较快。

错误观点5. 使用switch/case替代if/else

最后,这句建议是彻底的胡说八道。决定在哪里使用switch/case或者if/else完全取决于编码习惯,他们的运行速度基本一致,除了在某些特定的情况下。

事实上,在更古老的PHP版本下(PHP 3及很老的PHP 4版本)这些大部分建议是正确的,然而在新一代的PHP下,这些绝对是错误的。


( ! ) Warning: Missing argument 1 for cwppos_show_review(), called in /data/www/enjoyphp/wp-content/themes/flat/content-single.php on line 29 and defined in /data/www/enjoyphp/wp-content/plugins/wp-product-review/includes/legacy.php on line 18
Call Stack
#TimeMemoryFunctionLocation
10.0000354984{main}( ).../index.php:0
20.0000355272require( '/data/www/enjoyphp/wp-blog-header.php' ).../index.php:17
30.174910165632require_once( '/data/www/enjoyphp/wp-includes/template-loader.php' ).../wp-blog-header.php:19
40.176210236776include( '/data/www/enjoyphp/wp-content/themes/flat/single.php' ).../template-loader.php:74
50.259910794360get_template_part( ).../single.php:5
60.259910794880locate_template( ).../general-template.php:167
70.259910794976load_template( ).../template.php:643
80.259910795360require( '/data/www/enjoyphp/wp-content/themes/flat/content-single.php' ).../template.php:686
90.266510780096cwppos_show_review( ).../content-single.php:29

1 评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注