PHP: Performance tips

Tip จากพี่ใหญ่ใจดี Google ครับ
ต้นฉบับ: http://code.google.com/speed/articles/optimizing-php.html
ผู้เขียน: Eric Higgins, Google Webmaster

PHP Performance Tips

  • อย่า copy ตัวแปรอย่างไร้ประโยชน์
    ในบางครั้งมือใหม่ PHP จะพยายามทำให้ code ดูสะอาดอ่านง่ายขึ้นด้วยการ copy ค่ามาใส่ตัวแปรที่ชื่อสั้น ๆ ซึ่งทำให้เปลือง memory เพิ่มขึ้นอีกเท่าหนึ่ง และแน่นอนทำให้ช้าลงด้วย จากตัวอย่างด้านล่าง ถ้า user ส่ง description ขนาด 512kB เข้ามาทาง textarea จะทำให้กิน memory ถึง 1MB เลยทีเดียว
    BAD: $description = $_POST['description']; echo $description;
    GOOD: echo $_POST['description'];

    semicolon: ถ้าแค่ copy แล้วไป display เฉย ๆ แบบตัวอย่างก็ไม่ควรทำแน่นอน แต่ในบางครั้งเพื่อการดูแลรักษา code ที่ง่ายขึ้นก็อาจจะจำเป็นต้องมีการ assign ตัวแปรแบบนี้บ้าง ก็ต้องแลกกับ performance ที่จะลดลง

  • ใช้ single-quote สำหรับ string
    แม้ว่า PHP อนุญาตให้ใช้ทั้ง single-quote และ double-quote ในการเขียน string แต่มันไม่ได้เหมือนกันนะ! การใช้ double-quote เป็นการบอก PHP ให้อ่าน string เพื่อค้นหาตัวแปรและแทนค่า ดังนั้นสำหรับ string เปล่า ๆ ที่ไม่มีตัวแปรกหรือการแทนที่ใด ๆ การใช้ double-quote ย่อมทำให้ PHP ต้องทำงานเพิ่มขึ้นโดยไม่จำเป็น การใช้ . เพื่อต่อ string จะทำให้ performance ดีขึ้น
    BAD: $output = "This is a plain string";
    GOOD: $output = 'This is a plain string';
    BAD: $type = "mixed"; $output = "This is a $type string";
    GOOD: $type = 'mixed'; $output = 'This is a ' . $type .' string';

    semicolon: +1

  • ใช้ echo ในการ print
    ใช้ function echo ในการพิมพ์ออก output เพื่อความอ่านง่ายและ performance
    BAD: <?php print($myVariable); ?>
    GOOD: <?php echo $myVariable; ?>

    semicolon: เค้าว่าเร็วกว่านะ... แต่ผมก็ไม่แน่ใจเนื่องจากปรกติก็ใช้ echo อยู่แล้ว

  • อย่าใช้การต่อ string กับคำสั่ง echo
    PHP โปรแกรมเมอร์มือใหม่หลายคนที่ไม่ทราบว่าเราสามารถส่งตัวแปรกหลาย ๆ ตัวแปรให้กับคำสั่ง echo ได้ โดยคั่นโดย comma (,) แทนที่จะต่อ string ด้วย . เนื่องจากการต่อ string ทำให้ PHP ต้องทำงานเพิ่มขึ้นด้วยการนำ string และตัวแปรทั้งหมดมาต่อกันก่อนที่จะพิมพ์ออกไป ในขณะที่ตัวอย่างด้านล่าง echo จะพิมพ์ string และตัวแปรออกไปเลยตามลำดับที่ส่งให้
    BAD: echo 'Hello, my name is' . $firstName . $lastName . ' and I live in ' . $city;
    GOOD: echo 'Hello, my name is' , $firstName , $lastName , ' and I live in ' , $city;

    semicolon: อย่าว่าแต่มือใหม่เลย มือกลางเก่ากลางใหม่อย่างผมก็ไม่ได้คิดถึงจุดนี้เหมือนกัน

  • ใช้ switch/case แทน if/else
    ใช้ switch/case แทน if/else สำหรับการเปรียบเทียบค่าตัวแปรเดียวเพื่อประสิทธิภาพ, ความอ่านง่ายและการดูแลรักษา code ที่ง่าย
    BAD: if($_POST['action'] == 'add') { 
        addUser(); 
    } elseif ($_POST['action'] == 'delete') { 
        deleteUser(); 
    } elseif ($_POST['action'] == 'edit') { 
        editUser(); 
    } else { 
        defaultAction(); 
    }
    GOOD: switch($_POST['action']) { 
        case 'add': 
            addUser(); 
            break; 
        case 'delete': 
            deleteUser(); 
            break; 
        case 'edit': 
            editUser(); 
            break; 
        default: 
            defaultAction(); 
            break; 
    } 

    semicolon: +1

Comments

Jojoe

เหตุฉะนี้แล เวลา assign ลงตัวแปรเค้าถึงพยายามให้ unset() ทิ้ง รวมไปถึงเหล่าบรรดา object ด้วยชิไหมคับพี่

ถ้า copy มั่วซั่วก็คงต้อง

ถ้า copy มั่วซั่วก็คงต้อง unset กันบ้างหนะ