Tags:

array & switch ของ php

แบบไหนทำงานเร็วกว่ากันครับ เช่น

function thai_month($mm) {
$r_month= array( "01" => 'มกราคม',
"02" => 'กุมภาพันธ์',
"03" => 'มีนาคม',
"04" => 'เมษายน',
"05" => 'พฤษภาคม',
"06" => 'มิถุนายน',
"07" => 'กรกฎาคม',
"08" => 'สิงหาคม',
"09" => 'กันยายน',
"10" => 'ตุลาคม',
"11" => 'พฤศจิกายน',
"12" => 'ธันวาคม' );
return $r_month= [$mm];
}

function thai_month($mm) {
switch($mm) {
case '01' : $t_month = "มกราคม"; break;
case '02' : $month = "กุมภาพันธ์";break;
case '03' : $month = "มีนาคม";break;
case '04' : $month = "เมษายน";break;
case '05' : $month = "พฤษภาคม";break;
case '06' : $month = "มิถุนายน";break;
case '07' : $month = "กรกฎาคม";break;
case '08' : $month = "สิงหาคม";break;
case '09' : $month = "กันยายน";break;
case '10' : $month = "ตุลาคม";break;
case '11' : $month = "พฤศจิกายน";break;
case '12' : $month = "ธันวาคม";break;
}
return $month;
}

Get latest news from Blognone
By: lancaster
ContributorUbuntuWindows
on 26 June 2010 - 01:41 #186510

แบบแรกครับ

By: icez
ContributoriPhoneAndroidRed Hat
on 26 June 2010 - 01:42 #186512

แบบแรก แต่แก้บรรทัด return นิดนึงครับ

return $r_month[$mm];

By: 0xffeeddaa on 26 June 2010 - 15:27 #186672

ถ้าแบบนี้เทียบกับแบบแรกอันไหนเร็วกว่ากัครับ
function thai_month($mm) {
switch($mm) {
case '01' : return "มกราคม";
case '02' : return "กุมภาพันธ์";
case '03' : return "มีนาคม";
case '04' : return "เมษายน";
case '05' : return "พฤษภาคม";
case '06' : return "มิถุนายน";
case '07' : return "กรกฎาคม";
case '08' : return "สิงหาคม";
case '09' : return "กันยายน";
case '10' : return "ตุลาคม";
case '11' : return "พฤศจิกายน";
case '12' : return "ธันวาคม";
}
return;
}

By: icez
ContributoriPhoneAndroidRed Hat
on 26 June 2010 - 18:47 #186704

ยังไงก็แบบแรกอยู่ดีครับ
เทียบชุดคำสั่งแล้ว worse case ของแบบที่สองคือตรวจสอบทั้งหมด 12 ครั้ง

ส่วนแบบแรก ไม่มีการตรวจสอบ assign ค่าแล้ว jump ไปที่ข้อมูลที่ต้องการเลย

By: lew
FounderJusci's WriterMEconomicsAndroid
on 26 June 2010 - 23:58 #186756 Reply to:186704
lew's picture

หลายๆ ครั้งฟังก์ชั่น hash มันก็ช้าได้เรื่องนะครับ ยิ่งข้อมูลน้อยๆ อย่างนี้โอกาสที่จะเร็วกว่า hash มีสูง


lewcpe.com, @public_lewcpe

By: wiennat
Writer
on 27 June 2010 - 12:38 #186858 Reply to:186704

คุ้นๆว่า switch case มันจะไม่เหมือนกับ if/else if พอสมควรเลยนะครับ เหมือนว่าถ้าเป็น switch case ปกติมันจะทำการเทียบทีเดียวแล้ว jump ไป instruction นั้นๆได้เลย แต่ว่าตัว if/else if ต่างหากที่กรณีที่แย่ที่สุดจะทำ 12 ครั้ง

แต่นั่นก็ต้องขึ้นกับว่าตัว interpreter ทำงานแบบไหนด้วยล่ะมั้งครับ


onedd.net

By: multiplex on 27 June 2010 - 17:28 #186927

ขอบคุณครับ งั้นคงต้องไปไล่แก้ code ในลักษณะแบบนี้ใหม่ครับ
แลกกับความเร็ว แล้วเสียหน่วยความจำไปแว๊บหนึ่งประมาณนี้หรือป่าวครับ

By: anu
Contributor
on 27 June 2010 - 17:32 #186928

มีการทดสอบไว้บ้างครับ

http://www.php.lt/benchmark/phpbench.php

และ

http://www.phpbench.com/

ปกติเขียนเทสเองชัวร์กว่าครับ ลูบซักหลายหมื่น-แสน-ล้าน รอบ

By: KaizerWing on 28 June 2010 - 13:37 #187084

ผมว่ากรณีนี้ switch-case (แบบที่สอง) ชนะนะครับ เพราะ range ค่อนข้างแคบ (01-12) optimizer คง jump ที่ระดับ machine code แบบที่ @wiennat บอกไว้ ("เดา"ว่า optimizer ของ interpreter/compiler ส่วนใหญ่ทำแบบนี้รวมถึง php)

ส่วนแบบ array (แบบแรก) ต้องใช้เวลาเพิ่มตอนแปลง index โดยเฉพาะทุกครั้งที่เข้าฟังก์ชัน ต้องมีการสร้าง array และ assign ค่าให้ $r_month ทุกครั้ง (แต่ถึงทำเป็น static variable ไว้ด้านนอกฟังก์ชันก็คิดว่าไม่น่าจะเร็วกว่าอยู่ดีครับ)

แต่ถ้า range กว้างๆ (เช่น 1, 1000, 10000, 100000, ....., 10000000) และมีจำนวนไม่เยอะนี่ เท่าที่เคยทราบบาง optimizer จะทำแบบเดียวกับ if-else แต่ถ้าจำนวนเยอะมากๆอาจใช้ binary-search ครับ

By: rattananen
AndroidWindows
on 29 June 2010 - 14:03 #187335

เรื่องความเร็วแบบแรกครับ เพราะใช้ key hash เข้าถึงข้อมูลเลย
ถ้าเรื่องประหยัด memory แบบสองครับเพราะไม่ต้องบันทึกข้อมูลเดือนลง memony ก่อนครับ