網站製作學習誌

記錄學習製作網站的一切

PHP 小實驗 (1) - 等號的差異

以後可能會三不五時測試一些小東西,以驗證自己的想法。

今天實驗的是以下的寫法會不會造成效能上的影響:

1
if ($x == TRUE) { //... }

常看到很多程式員會有這種寫法,我個人認為除非改用三個等號 (即全相等) 來強制認定 $x 一定要是布林值外,否則這是不必要的動作。因為如果有時候 $x 是非零整數值或非空字串的話,程式也還是會認為它是 TRUE ,不必特意用相等運算來判斷。

1
if ($x === TRUE) { //... }

而且我認為這種方式也可能會影響效能,因為程式必須執行相等運算。為了證明這件事,我就寫了一個小程式來驗證看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?php
$start_time = (float) microtime(TRUE);
$is_checked = 0;
for ($i = 0; $i < 2000000; $i ++)
{
if ($is_checked)
{
echo "OK!\n";
}
}
$end_time = (float) microtime(TRUE);
echo "Spent Time: ", ($end_time - $start_time), "(s)\n";
$start_time = 0.0;
$end_time = 0.0;
$start_time = (float) microtime(TRUE);
$is_checked = 0;
for ($i = 0; $i < 2000000; $i ++)
{
if (TRUE == $is_checked)
{
echo "OK!\n";
}
}
$end_time = (float) microtime(TRUE);
echo "Spent Time: ", ($end_time - $start_time), "(s)\n";
$start_time = 0.0;
$end_time = 0.0;
$start_time = (float) microtime(TRUE);
$is_checked = 0;
for ($i = 0; $i < 2000000; $i ++)
{
if (TRUE === $is_checked)
{
echo "OK!\n";
}
}
$end_time = (float) microtime(TRUE);
echo "Spent Time: ", ($end_time - $start_time), "(s)\n";
?>

我習慣把要判斷的常數值放在等式的左邊,這樣一來可以防止我不小心把兩個等號 (相等) 寫成一個等號 (指定) 。

以上程式在我的電腦上的執行結果如下:

1
2
3
Spent Time: 1.7956340312958(s)
Spent Time: 6.9031929969788(s)
Spent Time: 5.9217112064362(s)

這是把執行時間放大後的結果,我們可以發現沒有等號快得多,而使用相等 (==) 就會慢三倍多;至於全相等 (===) 雖然也比沒有等號慢了三倍,但卻比相等來得快一點點。

其實 PHP 在底層的部份大都做了一些最佳化,我們多數時候並不需要特別去找它的麻煩。所以多瞭解語言的特性,會有助於寫出簡明與效能兼顧的程式。

歡迎大家討論與指正。

Comments