สวัสดีครับ หลังจาก นั่งปวดหัวกับ THStats อยู่พักใหญ่
หาสาเหตุ ปัญหา การคำนวนผลสถิติ ว่าช้า ด้วยสาเหตุใด
การเขียน ระบบคำนวนผลสถิติ ต้องคำนึงถึง ความรวดเร็วในการคำนวนผลเป็นอย่างมาก ขอไม่ร่ายยาวครับ ขอแชร์ สั้นๆ ดังนี้
Tips for php coding
1 if($a) ช้ากว่า if(isset($ia))
2. preg_match ช้ากว่า strstr และ ช้ากว่า strpos
3. preg_split ช้ากว่้า explode
4. in_array *** และการเก็บข้อมูลใน array และการ search ใน array
--------------------------------------------------------------------------------
$find = '8';
$arr = array(1,2,3,4,5,6,7,8);
if(in_array($find,$arr)) echo 'found';
ช้ากว่า (3 เท่า) เมื่อเทียบกับ
$arr = array_flip($arr); // กลับ key เป็น value หรือ กลับ value เป็น key
if(isset($arr[$find])) echo 'found';
แต่ จะช้ามาก เมื่อ นำ array_flip มาอยู่ใน loop ด้วย ซึ่งจะใช้กรณี คำนวนหลายๆ ข้่อมูล
for($i=0;$i<=100 ; $i++){
$arr = array_flip($arr);
if(isset($arr[$find])) echo 'found';
}
กล่าวคือการ เช็ค ข้อมูลใน key ของ array ทำงานได้รวดเร็วกว่า 100%
--------------------------------------------------------------------------------
5. scandir() / Functionใน php5 เร็วกว่า opendir readdir เกิบ 3-4 เท่า
6. require_once เร็วกว่า include 15-25% (เมื่อเกิด error จะหยุดทำงาน)
7. str_replace เร็ววกว่า preg_replace (เนื่องจากไม่ต้องสนใจ regular) แต่เขาว่า strtr ดีกว่า str_replace
8. การปิด error ด้วย @ หน้า function ทำให้ช้าลงถึง 200% เมื่อเกิด error/warning
9. การเก็บข้อมูล ip ลง database 123.123.123.123 มีขนาด 15 byte ถ้าเปลี่ยนด้วย ip2long ซึ่งจะได้ integer เหลือเพียง 4 byte
10. การบีบอัดข้อมูล string/text ด้วย gzcompress ประหยัดพื้นที่ลง กว่า 90% เท่าที่ทดสอบข้อมูลไม่เสียหาย การอ่าน gz / ungz ใช้เวลา ไม่กี่วินาทีเท่านั้น แต่คุ้มค่าในประหยัดพิ้นที่
11. อย่าเขียน function ไว้ใน loop โดยเด็ดขาด
12. ควรเรียนรู้เขียน Class / OOP / Framework
13. ควรเครียค่า memory ในตัวแปล เมื่อเลิกใช้งาน หรือ โดยเฉพาะเมื่อมีการดึงข้อมูลขนาดใหญ่มาไว้่ในตัวแปล ด้วย unset()
14. $a=null ไม่เท่ากับ $a=''
15. เมื่อแน่ใจ ชนิดข้อมูล ควรเช็คด้วย === ซึ่งต่างกับตรง == คือ ทำการเช็ค type ตัวแปล ซึ่งทำให้ทำงานเร็วขึ้นมาก
16. $a=1 (is int) เร็วกว่า $a='1' (is str) เร็วกว่า $a="1" (is str but check variable)
17. if(strlen($a)<10) ช้ากว่า if(isset($a{10}))
18. $b = $a ? true : false ช้ากว่า if() else (ช้ากว่้ามากครับ)
19. การใช้ full path เร็วกว่า shot path เช่น /public_html/file.php กับ /var/home/user/domains/domains.com/public_html/file.php หาได้ด้วย echo dirname(__file__)
20. การเข้าถึงตัว แปล global ช้ากว่าตัวแปลปกติ
21. การเขียน comment ไม่ส่งผลทำให้ code รันได้ช้าลง
22. mysql_connect ควรปิด mysql_close และร่วมกับ mysql_free_result
23. ** การเก็บข้อมูลด้วย text file ทำงานได้เร็วกว่า mysql อย่างมาก หากมีการวางรูปแบบที่ดี
เช่น
เก็บแบบ text file / data is array / to string (serialize) / pack by gzcompress
24. ประกาศ error_reporting(E_ALL); ไว้จะเห็นจุดผิดพลาด ที่ปกติไม่เห็น
เดี่ยวขอไว้แค่นี้ก่อนครับทำงานต่อก่อน
จาก เล็กๆ น้อยๆ ข้างต้น เมื่อมีการนำมาใช้ ตรวจสอบ ในปริมาณ ข้อมูลจำนวนมากๆ จะส่งผลให้ การ รัน ช้าลงอย่้างเห็นได้ชัด
ง่ายๆ เพื่อนๆ พี่ๆ น้องๆ หากท่านใด สนใจทดสอบ เพียง นำ code ดังกล่าว
ไปรันใน loop สัก 1000-10000 จะเห็น time ได้ชัดขึ้นครับ
วิธีการ (for PHP 5) if php 4 please read from : php manual
<?
$time_start = microtime(true);
#----------------------------------------------------------------
....... Code ............
#----------------------------------------------------------------
printf("<hr><div align=\"center\">Memory Useage %s </div>", showSize(memory_get_usage()) );
printf("<br><div align=\"center\">page generated in %f seconds </div>", (microtime(true) - $time_start));
function showSize($size_in_bytes) {
$value = 0;
if ($size_in_bytes >= 1073741824) { $value = round($size_in_bytes/1073741824*10)/10; return ($round) ? round($value) . 'Gb' : "{$value} Gb";
} else if ($size_in_bytes >= 1048576) { $value = round($size_in_bytes/1048576*10)/10; return ($round) ? round($value) . 'Mb' : "{$value} Mb";
} else if ($size_in_bytes >= 1024) { $value = round($size_in_bytes/1024*10)/10; return ($round) ? round($value) . 'Kb' : "{$value} Kb"; }
else { return "{$size_in_bytes} Bytes"; }
}
?>
นี่เป็นส่วนเล็กๆ น้อยๆ ครับ จริงๆ ยังมีอีกมาก
การปรับเพียงเล็กๆ น้อยๆ จะทำให้เว็บเราเร็วขึ้นมากๆ
ทำให้ thstats.com สามารถ calculate stats 100,000 records เพียง 41 วินาที
ซึ่งก่อนใช้ in_array 4000 records ใช้เวลาบางครั้งเกิบ 30-60 นาที เลยทีเดียว ^O^ ไม่น่าเชื่อใช่ไหมครับ
แล้วการบีบอัด ด้วย gzcompress
text file 560 MB เหลือเพียง 100 MB เศษๆ เท่านั้นเอง
:'(
ที่เล่ามาส่วนใหญ่ ได้ test time เองทั้งหมดแล้วครับ หวังว่าจะเป็นประโยชน์ ต่อไปนะครับ
เขียน code นอกจากเขียนให้ได้ตามต้องการแล้ว
เมื่อ advanced มากขึ้น ต้องคำนึงถึงความปลอดภัย
ความรวดเร็วในการทำงาน ที่มีประสิทธิภาพ แต่ code น้อยลง
และ ความสวยงามของ code # comment เผื่อมีผู้พัฒนาต่อ
ซึ่งผมก็ไม่ค่อย comment ครับเสียเวลา แต่จริงๆ ไม่ควรเลย
ผิดพลาดประการใด ขออภัยมา ณ ส่วนนี้ด้วยครับ
หากนำไปเผยแพร่ ขอ credit ด้วยครับ
๑ mean ๑
ท่านใดสนใจ นำมาแชร์ กันได้ครับ หรือต่อได้ที่
http://rootzone.net/php-tips-how-to-optimize-php
http://www.rightbrainnetworks....probably-didnt-know-about-php/
http://juliusbeckmann.de/blog/
http://kevingessner.com/nihila.../fast-array-membership-in-php/
http://www.phpbench.com/
http://hungred.com/useful-info...n/php-micro-optimization-tips/ 