|
มาเขียน PHP ให้ทำงานอย่างประสิทธิภาพ (Performance) กันเถอะ (ตอนที่ 1) |
ติดตามบทความล่าสุดของผู้เขียนได้ที่ phpinfo() Facebook Page
มาเขียน PHP ให้ทำงานอย่างประสิทธิภาพ (Performance) กันเถอะ (ตอนที่ 1) บทความนี้นำเสนอสิ่งที่ควรรู้เกี่ยวกับภาษา PHP ทั้งสิ่งที่ควรใช้ และไม่ควรใช้ ที่จะทำให้โปรแกรมทำงานได้เร็วขึ้น
1. ไม่ควรประกาศตัวแปรโดยไม่จำเป็น หากใช้เพียงครั้งเดียว เพราะจะทำให้โค้ดซับซ้อนขึ้น และเปลืองหน่วยความจำมากขึ้น
Code (PHP)
<?php
$a = $_POST['a'];
$b = $_POST['b'];
$c = $_POST['c'];
$d = $_POST['d'];
$e = $_POST['e'];
$sql = "INSERT INTO `table` VALUES ('$a', '$b', '$c', '$d', '$e')";
$result = mysql_query($sql);
if (!$result) {
exit(mysql_error());
}
อย่างข้างบนเราเห็นกันบ่อยมาก คือมีการประกาศตัวแปรเพียงเพื่อจะเอาไปใส่ใน query และ query ก็เป็นอีกตัวแปรหนึ่ง ($sql)
ถ้าเราเน้น performance จะเขียนได้แบบนี้ (ตัวอย่างไม่ได้เน้นความปลอดภัย)
if (!mysql_query("INSERT INTO `table` VALUES ('$_POST[a]', '$_POST[b]', '$_POST[c]', '$_POST[d]', '$_POST[e]')")) {
exit(mysql_error());
}
เหตุผลที่คนส่วนใหญ่กำหนดตัวแปรก่อนเพื่อไปใช้ในแทนที่ในสตริง ก็อาจเป็นเพราะไม่เข้าใจหลักการพื้นฐานและรูปแบบของตัวแปรในสตริง หรือเพียงอาจจะจำต่อๆ กันมาจากโค้ดตัวอย่างที่มีอยู่ทั่วไปโดยไม่ได้ศึกษาพื้นฐานเพิ่มเติม
หากใครที่ยังไม่เข้าใจเรื่องตัวแปรในสตริงลองอ่านบทความนี้ดู ตัวแปรในสตริง
2. อย่าใช้ count() หรือฟังก์ชั่นอื่นๆ ใน expression 2 และ 3 ของลูป for หรือ expression ของลูป while
เพราะ expression 2 และ 3 จะทำงานทุกๆ รอบ การเรียกใช้ฟังก์ชั่นโดยไม่จำเป็นจะทำให้ performance ลดลง
การเรียกใช้ count() เพื่อใช้เป็นเงื่อนไขในลูป ไม่ควรทำ
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
for($i = 0; $i < count($arr); ++$i) {
echo $arr[$i];
}
ในลูป while ก็เช่นกัน
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$i = 0;
while ($i < count($arr)) {
echo $arr[$i];
$i++;
}
จากตัวอย่างข้างบนจะมีการเรียก count() ในทุกรอบของลูป ซึ่งจะลด performance
เปลี่ยนเป็นกำหนดค่าลงตัวแปรก่อน
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$n = count($arr);
for ($i = 0; $i < $n; ++$i) {
echo $arr[$i];
}
หรือจะกำหนดในส่วนของ expression แรกของลูป for
$arr = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// แบบนี้ได้ เพราะ expression แรกจะทำงานครั้งเดียว
for ($i = 0, $n = count($arr); $i < $n; ++$i) {
echo $arr[$i];
}
3. pre increment operator เร็วกว่า post increment operator
Code (PHP)
$i = 0;
$i++; // ช้ากว่าเพราะแปลงเป็น op code ได้ 4 คำสั่ง
++$i; // เร็วกว่า เพราะมี op code แค่ 3
4. ใช้ ' สำหรับสตริงที่ไม่มีการแทนค่าตัวแปร หรือสัญลักษณ์พิเศษ
ตรงจุดนี้จะได้ performance ในช่วงที่ PHP กำลัง parse ไฟล์ (ไม่ใช่ performance ในระหว่างโค้ด php ทำงาน)
เพราะ ' จะไม่มีการแทนค่าตัวแปร หรือแปลง \? ให้เป็นสัญลักษณ์พิเศษ การ parse สตริงที่ครอบด้วย ' จะเร็วกว่ามาก
Code (PHP)
$a = 'Hello'; // parse เร็วกว่า
$b = "Hello";
5. อย่าใช้ . เพื่อเชื่อมต่อสตริงโดยไม่จำเป็น
การใช้ . เพื่อเชื่อมต่อสตริง นอกจากจะทำงานช้า ยังทำให้โค้ดอ่านยาก และดูสับสน
if($_GET["Action"] == "Save")
{
//*** Insert Reply ***//
$strSQL = "INSERT INTO reply ";
$strSQL .="(QuestionID,CreateDate,Details,Name) ";
$strSQL .="VALUES ";
$strSQL .="('".$_GET["QuestionID"]."','".date("Y-m-d H:i:s")."','".$_POST["txtDetails"]."','".$_POST["txtName"]."') ";
$objQuery = mysql_query($strSQL);
//*** Update Reply ***//
$strSQL = "UPDATE webboard ";
$strSQL .="SET Reply = Reply + 1 WHERE QuestionID = '".$_GET["QuestionID"]."' ";
$objQuery = mysql_query($strSQL);
}
ลองเปลี่ยนเป็นแบบนี้ (ตัวอย่างไม่ได้เน้นความปลอดภัย)
if($_GET['Action'] == 'Save')
{
//*** Insert Reply ***//
$date = date('Y-m-d H:i:s');
$objQuery = mysql_query(
"
INSERT INTO reply
(QuestionID,CreateDate,Details,Name)
VALUES
($_GET[QuestionID], $date, $_POST[txtDetails], $_POST[txtName])
"
);
//*** Update Reply ***//
$objQuery = mysql_query("UPDATE webboard SET Reply = Reply + 1 WHERE QuestionID = '$_GET[QuestionID]' ");
}
บทความที่เกี่ยวข้อง
มาเขียน PHP ให้ทำงานอย่างประสิทธิภาพ (Performance) กันเถอะ (ตอนที่ 2)
มาเขียน PHP ให้ทำงานอย่างประสิทธิภาพ (Performance) กันเถอะ (ตอนที่ 3)
ติดตามบทความล่าสุดของผู้เขียนได้ที่ phpinfo() Facebook Page
|
|
|
|
|
|
|
|
By : |
phpinfo()
|
|
Article : |
บทความเป็นการเขียนโดยสมาชิก หากมีปัญหาเรื่องลิขสิทธิ์ กรุณาแจ้งให้ทาง webmaster ทราบด้วยครับ |
|
Score Rating : |
|
|
Create Date : |
2013-08-16 |
|
Download : |
No files |
|
Sponsored Links |
|
|
|
|