ThaiSEOBoard.com

พัฒนาเว็บไซต์ => Programming => ข้อความที่เริ่มโดย: mean ที่ 16 ตุลาคม 2010, 20:29:45



หัวข้อ: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: mean ที่ 16 ตุลาคม 2010, 20:29:45
สวัสดีครับ หลังจาก นั่งปวดหัวกับ 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/


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ แล
เริ่มหัวข้อโดย: IzeSem ที่ 16 ตุลาคม 2010, 20:35:03
ขอบคุณครับเมมก่อนกระทู้้ดี
แล้ว ++$ กับ $i++ เขาว่าอันแีรกเร็วกว่าจริงเปล่า


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ แล
เริ่มหัวข้อโดย: NEXT13 ที่ 16 ตุลาคม 2010, 20:40:17
เข้ามางงครับ ความสามารถทางสมองไม่ถึงจริงๆ :(


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ แล
เริ่มหัวข้อโดย: mean ที่ 16 ตุลาคม 2010, 20:42:33
แล้ว ++$ กับ $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


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: yyy ที่ 16 ตุลาคม 2010, 21:13:33
+1  :wanwan017:

bookmark ไว้ก่อน เอาไว้อ้างอิง


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: CHIN3JI ที่ 16 ตุลาคม 2010, 21:13:48
ความรู้แน่นมาคับ ขอบคุณสำหรับความรู้ใหม่ครับ  :wanwan003:


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: pjgunner ที่ 19 ตุลาคม 2010, 18:15:19
ขอบคุณที่แชร์ครับ

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

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



หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ แ
เริ่มหัวข้อโดย: ayeweb ที่ 19 ตุลาคม 2010, 18:38:41
หามานานละ โฮสเริ่มไม่ไหว ไม่ได้optimize phpสักที


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: picharnan ที่ 19 ตุลาคม 2010, 18:57:03
ขอบคุณมากครับ  เด๋ยวต้องเอาไปใช้บ้างหล่ะ


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: gootooyoo ที่ 19 ตุลาคม 2010, 19:11:09
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


แจ๋วดี อิอิ


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: admev ที่ 19 ตุลาคม 2010, 19:29:55
ขอบคุณมากคับ ไม่เคยคิดถึงเรื่องนี้เลย วันหลังคงต้องไปนั่ง optimize บ้างแล้ว


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: O.o!! ที่ 19 ตุลาคม 2010, 19:50:48
โอ้ว ขอบคุณครับ ขอเก็บ  :'(


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: aum_mix ที่ 19 ตุลาคม 2010, 19:55:41
โห้ขอบคุณมาก  :wanwan017:


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: vpsman ที่ 19 ตุลาคม 2010, 20:49:44
สุดยอดมากๆครับ :wanwan017:


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: penthai06 ที่ 20 ตุลาคม 2010, 12:01:56
เว็บนี้ก็เยี่ยมครับ php.lt/benchmark/phpbench.php (http://www.php.lt/benchmark/phpbench.php)


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: TOOAds.com ที่ 20 ตุลาคม 2010, 12:09:16
ลืมเซฟ :wanwan017:


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: headmaster ที่ 20 ตุลาคม 2010, 12:17:42
+1

แจ่มมากมาย   :'(

ขอบคุณมากครับ


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: ขัน ที่ 20 ตุลาคม 2010, 12:24:46

+1 มีประโยชน์ จัดไป
 :wanwan016:


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: bouy22 ที่ 08 พฤศจิกายน 2010, 18:53:26
ตามมาอ่าน เทคนิค และ ทิป ดีๆ


ขอบคุณครับ
+1 เลย


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: siemens ที่ 08 พฤศจิกายน 2010, 19:09:59
 :wanwan017: ขอบคุณสำหรับความรู้ ดีๆ สำหรับมือใหม่ ๆ ที่ยังไม่รู้เรื่องอะไรคับ มาเก็บเกี่ยวประสบการณ์ครับ


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: mean ที่ 08 พฤศจิกายน 2010, 19:15:36
เอานี่ครับ

$_event = microtime(true);

.......PHP CODE.......

 printf("<br>Run time %f </b>",microtime(true) - $_event );


หัวข้อ: Re: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
เริ่มหัวข้อโดย: bird35793 ที่ 09 พฤศจิกายน 2010, 09:34:44
โหสุดยอด อย่างนี้ต้องรีบเก็บแล้ว  :wanwan011: