ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingอัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย
หน้า: [1] 2  ทั้งหมด   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: อัดอั้นตันใจ ขอแชร์ ประสบการณ์ optimize php ครับ และวิธีการ Benchmark อย่างง่าย  (อ่าน 2825 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
mean
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 121
ออฟไลน์ ออฟไลน์

กระทู้: 1,009



ดูรายละเอียด เว็บไซต์
« เมื่อ: 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....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/
« แก้ไขครั้งสุดท้าย: 17 ตุลาคม 2010, 01:01:55 โดย mean » บันทึกการเข้า

IzeSem
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 61
ออฟไลน์ ออฟไลน์

กระทู้: 1,378



ดูรายละเอียด
« ตอบ #1 เมื่อ: 16 ตุลาคม 2010, 20:35:03 »

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

พลังน้ำใจ: 18
ออฟไลน์ ออฟไลน์

กระทู้: 285



ดูรายละเอียด เว็บไซต์
« ตอบ #2 เมื่อ: 16 ตุลาคม 2010, 20:40:17 »

เข้ามางงครับ ความสามารถทางสมองไม่ถึงจริงๆ Sad
บันทึกการเข้า

ถ้าต้องการช่างภาพ หรือช่างวีดีโอในจังหวัดสุราษฎร์ธานี และภาคใต้ โทรมาได้เลยครับ 087-4731965
ช่างวีดีโอ สุราษฎร์ธานี ช่างภาพสุราษฎร์ ช่างวีดีโอสุราษ
ถ่ายพรีเวดดิ้งสุราษฎร์ธานี
mean
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 121
ออฟไลน์ ออฟไลน์

กระทู้: 1,009



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 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
บันทึกการเข้า

yyy
ก๊วนเสียว
*

พลังน้ำใจ: 14
ออฟไลน์ ออฟไลน์

กระทู้: 204



ดูรายละเอียด
« ตอบ #4 เมื่อ: 16 ตุลาคม 2010, 21:13:33 »

+1  wanwan017

bookmark ไว้ก่อน เอาไว้อ้างอิง
บันทึกการเข้า
CHIN3JI
Newbie
*

พลังน้ำใจ: 5
ออฟไลน์ ออฟไลน์

กระทู้: 48



ดูรายละเอียด
« ตอบ #5 เมื่อ: 16 ตุลาคม 2010, 21:13:48 »

ความรู้แน่นมาคับ ขอบคุณสำหรับความรู้ใหม่ครับ  wanwan003
บันทึกการเข้า
pjgunner
คนรักเสียว
*

พลังน้ำใจ: 6
ออฟไลน์ ออฟไลน์

กระทู้: 106



ดูรายละเอียด เว็บไซต์
« ตอบ #6 เมื่อ: 19 ตุลาคม 2010, 18:15:19 »

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

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

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

« แก้ไขครั้งสุดท้าย: 19 ตุลาคม 2010, 18:21:58 โดย pjgunner » บันทึกการเข้า

ayeweb
Verified Seller
เจ้าพ่อบอร์ดเสียว
*

พลังน้ำใจ: 321
ออฟไลน์ ออฟไลน์

กระทู้: 5,202



ดูรายละเอียด เว็บไซต์
« ตอบ #7 เมื่อ: 19 ตุลาคม 2010, 18:38:41 »

หามานานละ โฮสเริ่มไม่ไหว ไม่ได้optimize phpสักที
« แก้ไขครั้งสุดท้าย: 19 ตุลาคม 2010, 18:38:54 โดย ayeweb » บันทึกการเข้า


ข่าวไอที ข่าวสารไอที แอพไอโฟน บริการอื่นๆ
บริการ ตรวจหวย อื่นๆ ทั่วไปสาระน่ารู้ ความรู้ต่างๆ
Host ไทย เว็บผู้หญิงนะคะ แต่ผู้ชายก็เข้าได้ค่ะ
ตรวจหวย
ตรวจหวย ผลสลากกินแบ่งรัฐบาล>>
เช่าโฮสติ้ง Ruk-com
picharnan
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 90
ออฟไลน์ ออฟไลน์

กระทู้: 1,399



ดูรายละเอียด
« ตอบ #8 เมื่อ: 19 ตุลาคม 2010, 18:57:03 »

ขอบคุณมากครับ  เด๋ยวต้องเอาไปใช้บ้างหล่ะ
บันทึกการเข้า
gootooyoo
ก๊วนเสียว
*

พลังน้ำใจ: 27
ออฟไลน์ ออฟไลน์

กระทู้: 464



ดูรายละเอียด เว็บไซต์
« ตอบ #9 เมื่อ: 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


แจ๋วดี อิอิ
« แก้ไขครั้งสุดท้าย: 19 ตุลาคม 2010, 19:29:28 โดย gootooyoo » บันทึกการเข้า

ขวากหนาม ที่เราต้องข้ามผ่าน ถึงจะเจ็บก็จะไป (\◣_◢/) 
❤ 
admev
ก๊วนเสียว
*

พลังน้ำใจ: 19
ออฟไลน์ ออฟไลน์

กระทู้: 270



ดูรายละเอียด
« ตอบ #10 เมื่อ: 19 ตุลาคม 2010, 19:29:55 »

ขอบคุณมากคับ ไม่เคยคิดถึงเรื่องนี้เลย วันหลังคงต้องไปนั่ง optimize บ้างแล้ว
บันทึกการเข้า

ต้องการเครื่องปั๊มนม? ขายเครื่องปั๊มนม เครื่องปั๊มนม อะไหล่เครื่องปั๊มนม เครื่องปั๊มนมไฟฟ้า

เครื่องปั๊มนม ความรู้เกี่ยวกับนมแม่ การปั๊มนม วิธีการใช้เครื่องปั๊มนม
O.o!!
Verified Seller
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 237
ออฟไลน์ ออฟไลน์

กระทู้: 1,429



ดูรายละเอียด
« ตอบ #11 เมื่อ: 19 ตุลาคม 2010, 19:50:48 »

โอ้ว ขอบคุณครับ ขอเก็บ  Cry
บันทึกการเข้า
aum_mix
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 47
ออฟไลน์ ออฟไลน์

กระทู้: 1,152



ดูรายละเอียด เว็บไซต์
« ตอบ #12 เมื่อ: 19 ตุลาคม 2010, 19:55:41 »

โห้ขอบคุณมาก  wanwan017
บันทึกการเข้า

ขายที่ดิน 31 ไร่ อยู่ ที่ดินสวย ทำเลดีติดถนน เหมาะแก่การลงทุนเป็นอย่างยิ่ง ที่ดินทำเลดี และที่ดิน 2,000 ไร่ จังหวัดกาญจนบุรี ที่ดินราคาดี
vpsman
คนรักเสียว
*

พลังน้ำใจ: 38
ออฟไลน์ ออฟไลน์

กระทู้: 176



ดูรายละเอียด เว็บไซต์
« ตอบ #13 เมื่อ: 19 ตุลาคม 2010, 20:49:44 »

สุดยอดมากๆครับ wanwan017
บันทึกการเข้า
penthai06
ก๊วนเสียว
*

พลังน้ำใจ: 7
ออฟไลน์ ออฟไลน์

กระทู้: 225



ดูรายละเอียด เว็บไซต์
« ตอบ #14 เมื่อ: 20 ตุลาคม 2010, 12:01:56 »

เว็บนี้ก็เยี่ยมครับ php.lt/benchmark/phpbench.php
บันทึกการเข้า

TOOAds.com
บุคคลทั่วไป
« ตอบ #15 เมื่อ: 20 ตุลาคม 2010, 12:09:16 »

ลืมเซฟ wanwan017
บันทึกการเข้า
headmaster
Verified Seller
สมุนแก๊งเสียว
*

พลังน้ำใจ: 224
ออฟไลน์ ออฟไลน์

กระทู้: 814



ดูรายละเอียด เว็บไซต์
« ตอบ #16 เมื่อ: 20 ตุลาคม 2010, 12:17:42 »

+1

แจ่มมากมาย   Cry

ขอบคุณมากครับ
บันทึกการเข้า

ขัน
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 167
ออฟไลน์ ออฟไลน์

กระทู้: 2,254



ดูรายละเอียด เว็บไซต์
« ตอบ #17 เมื่อ: 20 ตุลาคม 2010, 12:24:46 »


+1 มีประโยชน์ จัดไป
 wanwan016
บันทึกการเข้า

bouy22
หัวหน้าแก๊งเสียว
*

พลังน้ำใจ: 408
ออฟไลน์ ออฟไลน์

กระทู้: 2,333



ดูรายละเอียด เว็บไซต์
« ตอบ #18 เมื่อ: 08 พฤศจิกายน 2010, 18:53:26 »

ตามมาอ่าน เทคนิค และ ทิป ดีๆ


ขอบคุณครับ
+1 เลย
บันทึกการเข้า

สนใจทำธุรกิจไอศกรีมหนองโพ คลิกเลย | ลงประกาศโฆษณา ประกาศฟรี | เว็บฝากรูป | สคริปเกมแฟลช |
ผลิตภัณฑ์เสริมอาหารออกซิเจนน้ำ Adoxy
siemens
คนรักเสียว
*

พลังน้ำใจ: 6
ออฟไลน์ ออฟไลน์

กระทู้: 130



ดูรายละเอียด
« ตอบ #19 เมื่อ: 08 พฤศจิกายน 2010, 19:09:59 »

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

หน้า: [1] 2  ทั้งหมด   ขึ้นบน
พิมพ์