อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย

เริ่มโดย mean, 16 ตุลาคม 2010, 20:29:45

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

mean

สวัสดีครับ หลังจาก นั่งปวดหัวกับ 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.com/blog/10-things-you-probably-didnt-know-about-php/
http://juliusbeckmann.de/blog/
http://kevingessner.com/nihilartikel/fast-array-membership-in-php/
http://www.phpbench.com/
http://hungred.com/useful-information/php-micro-optimization-tips/


[direct=https://www.ireallyhost.com/]บริการโดเมน, เว็บโฮสติ้ง, SSL Certificate[/direct]
[direct=https://www.ireallyhost.com/ssl]บริการ SSL Certificate , HTTPS สำหรับเว็บไซต์[/direct]
[direct=https://www.ireallyhost.com/]บริการ Web Hosting Free! Domain name ตลอดอายุบริการ [/direct]
[direct=https://www.ireallyhost.com/domain]บริการ จดโดเมน, Free DNS Service, Domain Forwarding, จัดการโดเมนได้เอง Domain Control Panel[/direct

IzeSem

ขอบคุณครับเมมก่อนกระทู้้ดี
แล้ว ++$ กับ $i++ เขาว่าอันแีรกเร็วกว่าจริงเปล่า

NEXT13

เข้ามางงครับ ความสามารถทางสมองไม่ถึงจริงๆ :(
ถ้าต้องการช่างภาพ หรือช่างวีดีโอในจังหวัดสุราษฎร์ธานี และภาคใต้ โทรมาได้เลยครับ 087-4731965
[direct=https://www.facebook.com/PlutoStudioThailand/]ช่างวีดีโอ สุราษฎร์ธานี[/direct] [direct=https://www.facebook.com/PlutoStudioThailand/]ช่างภาพสุราษฎร์[/direct] [direct=https://plutostudiothailand.com/]ช่างวีดีโอสุราษ[/direct]
[direct=https://www.facebook.com/PlutoStudioThailand/]ถ่ายพรีเวดดิ้งสุราษฎร์ธานี[/direct]

mean

อ้างถึงจาก: IzeSem ใน 16 ตุลาคม 2010, 20:35:03
แล้ว ++$ กับ $i++ เขาว่าอันแีรกเร็วกว่าจริงเปล่า

พอๆ กันครับ time ในการคำนวน ตัวเลข ที่เป็น interger ไม่สูงมากนั้น

แต่จะต่างกันตรงที่ ถ้า ++$i คือ +1 ที่ i แล้วจึงเอาไปคำนวน หรือตรวจสอบ
$i=1;
if(++$i == 2) echo '2'; // output is 2

ตรวจสอบค่าใน $i ก่อน แล้ว จึง มา $i +1 ภายหลัง
$i=1;
if($i++ ==2 ) echo '2'; // .......... Blank


[direct=https://www.ireallyhost.com/]บริการโดเมน, เว็บโฮสติ้ง, SSL Certificate[/direct]
[direct=https://www.ireallyhost.com/ssl]บริการ SSL Certificate , HTTPS สำหรับเว็บไซต์[/direct]
[direct=https://www.ireallyhost.com/]บริการ Web Hosting Free! Domain name ตลอดอายุบริการ [/direct]
[direct=https://www.ireallyhost.com/domain]บริการ จดโดเมน, Free DNS Service, Domain Forwarding, จัดการโดเมนได้เอง Domain Control Panel[/direct

yyy


CHIN3JI


pjgunner

ขอบคุณที่แชร์ครับ

เช่น การใช้ ternary operator ย่อมทำให้โค้ดอ่านง่ายกว่ามาก ในบางกรณี

เพียงแต่ optimize มากไปกลายเป็น โค้ดอ่านยากมาก แนะนำให้ optimize เท่าที่จำเป็นและ performance critical จริงๆ ครับ
และโค้ดที่ถูก optimize อย่างสุดๆ ควรเขียนคอมเมนต์ ให้มากครับ เพราะยิ่งทำให้เร็ว โค้ดอาจยิ่งเข้าใจยาก และใช้ตรรกะที่อ้อมโลกบ้าง จากประสบการณ์ที่ผ่านมาผม การเขียนโค้ดที่อ่านง่ายก็เขียนให้ทำงานเร็วมากได้ โดยเพียงแต่เลือกใช้ฟังชั่นที่เพียงพอต่อการทำงาน

[direct=http://www.pjgunner.com]โปรเจคกันเนอร์ รับทำโปรเจค เว็บไซต์[/direct]
I miss u๊.

ayeweb

หามานานละ โฮสเริ่มไม่ไหว ไม่ได้optimize phpสักที

[direct=https://www.bitimer.in.th/]ข่าวไอที[/direct] ข่าวสารไอที แอพไอโฟน บริการอื่นๆ
[direct=https://page.line.me/gnm7628z]บริการ ตรวจหวย[/direct] อื่นๆ ทั่วไปสาระน่ารู้ ความรู้ต่างๆ
[direct=https://goo.gl/XQp91t]Host ไทย[/direct] เว็บผู้หญิงนะคะ แต่ผู้ชายก็เข้าได้ค่ะ
[direct=https://page.line.me/oer1981h]ตรวจหวย[/direct]
ตรวจหวย ผลสลากกินแบ่งรัฐบาล>>
[direct=https://goo.gl/H3JCzK]เช่าโฮสติ้ง Ruk-com[/direct]

picharnan


gootooyoo

6. require_once เร็วกว่า include 15-25% (เมื่อเกิด error จะหยุดทำงาน) <-- ชอบใช้include มันไม่หยุด
8. การปิด error ด้วย @ หน้า function ทำให้ช้าลงถึง 200% เมื่อเกิด error/warning  <--อันนี้ก็ชอบใช้ กันไวก่อน
15. เมื่อแน่ใจ ชนิดข้อมูล ควรเช็คด้วย === ซึ่งต่างกับตรง == คือ ทำการเช็ค type ตัวแปล ซึ่งทำให้ทำงานเร็วขึ้นมาก
18. $b = $a ? true : false ช้ากว่า if() else  (ช้ากว่้ามากครับ) <-- ชอบใช้สะด้วย

เติมหน่อยครับ printf ไวกว่า echo
แล้วใน เพิ่มข้อมูล อะไรควรสร้าง id 0 ทิ่งไว้ กัน error


แจ๋วดี อิอิ
ขวากหนาม ที่เราต้องข้ามผ่าน ถึงจะเจ็บก็จะไป (\◣_◢/)  [direct=http://gootooyoo.blogspot.com] [/direct]
[direct=http://gootooyoo.blog.com] ❤ [direct=http://free-icons.blogspot.com] ❤  [direct=http://goo-dog.blogspot.com]❤

admev

ขอบคุณมากคับ ไม่เคยคิดถึงเรื่องนี้เลย วันหลังคงต้องไปนั่ง optimize บ้างแล้ว
ต้องการเครื่องปั๊มนม? [direct=http://xn--22cej6ej0bbck4hzbf2evg9eob.com/]ขายเครื่องปั๊มนม[/direct] เครื่องปั๊มนม อะไหล่เครื่องปั๊มนม เครื่องปั๊มนมไฟฟ้า

[direct=http://xn--22cej6ej0bbck4hzbf2evg9eob.com/]เครื่องปั๊มนม[/direct] ความรู้เกี่ยวกับนมแม่ การปั๊มนม วิธีการใช้เครื่องปั๊มนม

O.o!!


aum_mix

ขายที่ดิน 31 ไร่ อยู่ [direct=http://www.thailandpremiumproperty.com]ที่ดินสวย[/direct] ทำเลดีติดถนน เหมาะแก่การลงทุนเป็นอย่างยิ่ง [direct=http://www.thailandpremiumproperty.com]ที่ดินทำเลดี[/direct] และที่ดิน 2,000 ไร่ จังหวัดกาญจนบุรี [direct=http://www.thailandpremiumproperty.com]ที่ดินราคาดี[/direct]


penthai06

[direct=http://www.compilewedding.com]Wedding Directory, Bridal, Compilewedding.com[/direct]
[direct=http://www.traveldirectlink.com]Travel Directory, Traveldirectlink.com[/direct]


headmaster


ขัน

[direct=http://www.coolstylecase.com/listt.php?model=GPL&page=1]Phone Case[/direct]  [direct=http://www.designbykhan.com]Design by Khan[/direct] [direct=http://www.m-thong.com]ห้องเช่าเมืองทอง[/direct] [direct=http://www.thaidokudami.com]พลูคาวโดกุดามิ[/direct]

bouy22

สนใจทำธุรกิจ[direct=http://www.nongphojsin.com/]ไอศกรีมหนองโพ[/direct]คลิกเลย | ลงประกาศโฆษณา [direct=http://www.marukopost.com/]ประกาศฟรี[/direct] | [direct=http://www.uuppic.com/]เว็บฝากรูป[/direct] | [direct=http://www.jeedgame.com/]สคริปเกมแฟลช[/direct] |
ผลิตภัณฑ์เสริมอาหารออกซิเจนน้ำ [direct=http://www.adoxy-thai.com/]Adoxy[/direct]

siemens

 :wanwan017: ขอบคุณสำหรับความรู้ ดีๆ สำหรับมือใหม่ ๆ ที่ยังไม่รู้เรื่องอะไรคับ มาเก็บเกี่ยวประสบการณ์ครับ