Monday, March 10th, 2008

เวลาเขียนโปรแกรมเกี่ยวกับโครงสร้างพวก set กับ map ในจาวา จะมกลุ่มของคลาส เรียกรวมๆ กันว่า collection ให้ เวลาจะใช้ set ก็สร้างวัตถุ set ขึ้นมาเลย จะปวดหัวหน่อยก็แค่ ประเภทของ set กับ map ในจาวาที่มีหลากหลายเหลือเกิน (คนเอาไปสร้างต่อเยอะแยะไปหมด ทั้งจาก apache หรือของ sun เอง) แต่ใช้จริงๆ ก็ไม่กี่คลาสแถม method ก็เหมือนกัน

แต่ใน php ตัวโครงสร้างพวกนี้ดันอยู่ใน array ซะหมด เพราะ array ของ php ดันประหลาด(จริงๆ ก็ไม่ประหลาดหรอก ภาษาแบบ php แทบจะมีเหมือนกันหมด) สามารถเป็น set กับ map ได้เลยโดยไม่ต้องพึ่งพาใคร เช่น


$array['map_key'] = 'map_value';
$array['set_value'] = 'set_value';

แค่ทำตามด้านบนก็ได้ set กับ map มาใช้แล้ว แต่พวก operation ต่างๆของ set กับ map หละ(จริงๆ map ก็คือ set อ่ะนะที่ค่าใน set ชี้ออกไปอีกที่หนึ่งเท่านั้นเอง) อย่างพวก intersect หรือ union อะไรทำนองนี้ ถ้าเป็นภาษา python หรือ ruby ก็คงทำอะไรประมาณเอาตัวแปรมาบวก ลบกันได้เลย แต่ php ดันทำไม่ได้นี่สิ เมื่อวานเลยลองขุดๆ ดูปรากฏว่า php มี function เตรียมไว้ให้พร้อมแล้ว สำหรับการทำงานเกี่ยวกับ set ต่างๆ มีทั้ง intersect, union, different, … อะไรต่างๆ มากมาย ดูได้จากหน้านี้ http://th2.php.net/manual/en/ref.array.php
ดูไปแล้วอาจจะไม่เท่เหมือน python แต่แค่มีให้ใช้ก็ดีหละนะ (เขียนเองเอา for loop ไล่หาแล้วสร้างใหม่แน่เลย :lol: )

Saturday, September 22nd, 2007

เมื่อคืน pFz เอา url ที่เกี่ยวกับการเปรียบเทียบระหว่าง switch กับ if-else โดยคำตอบก่อนที่ pFz จะแจมไปก็คือ if-else เร็วกว่า แต่ pFz แย้งไปตรงข้ามเพราะ compiler ส่วนใหญ่จะมีการแต่ง switch ให้เร็วขึ้นโดยการแปลงเป็น hash table ซะ ดูไปก็ไม่รู้หรอกว่าอะไรจะเร็วกว่า เลยลองเขียน จาวากับซีมาทดลองดูให้เห็นกันไปเลย

sourcecode: Java, C

ผลสรุปก็คืออะไรจะเร็วกว่าอะไรขึ้นกับ

  1. จำนวนกรณีที่นำมาเปรียบเทียบยิ่งเยอะจะยิ่งเห็นผลชัด
  2. กรณีที่ตกลงไปในการเปรียบเทียบ จากโค้ดก็คือค่า cSample นั่นเอง โดยถ้าตกในกรณีแรกของ if หรือ case แน่นอน if จะเร็วกว่า แต่ถ้าตกกรณีหลังๆ switch จะเร็วกว่า

ผลลัพธ์
เลขบนคือ switch เลขล่างคือ if-else
Java, cSample = 0


llun@pluto:~/Desktop/test$ java Test
1467552309
1264288753

Java, cSample = 50 (default/else)


llun@pluto:~/Desktop/test$ java Test
2286091238
2327289899

Java, cSample = 15 (middle)


llun@pluto:~/Desktop/test$ java Test
1424442862
1570707918

Java ยิ่งตกเคสหลังๆ if/else จะช้าลง คล้าย switch แต่ switch หลังๆ จะเร็วหว่า

C, cSample = 0


llun@pluto:~/Desktop/test$ ./test
8.00
7.00

C, cSample = 50 (default/else)


llun@pluto:~/Desktop/test$ ./test
6.00
43.00

C, cSample = 15 (middle)


llun@pluto:~/Desktop/test$ ./test
8.00
26.00

ของ C นี่ switch แทบจะเป็นค่าคงที่เลย

สำหรับ php ยังไม่ได้เขียน แค่คิดว่าผลน่าจะไปทาง if/else มากกว่าเนื่องจาก php ไม่มีการแปลง code ก่อนเหมือนสองภาษาข้างบน ไว้เย็นๆ ค่อยเขียนลองอีกทีละกัน

เอกสารเพิ่มเติมที่ pFz เอามาให้อ่าน :

  1. Java switch
  2. PHP switch
  3. Switching track in java


เพิ่มเติมสำหรับภาษา php
Runtime, Sourcecode


เพิ่มเติมอีกภาษา ruby
Sourcecode
หลังจากทดลองพบความแตกต่างอย่างสิ้นเชิง เพราะ php กับ ruby switch ช้ากว่า if-else ทุกกรณี โดยเฉพาะ ruby switch นี่เมื่อตกกรณี default นี่ช้าโคตรๆ เลย แต่ php ผลกับใกล้เคียงกัน เห้อ อยู่กับ php ต่อไป :razz:

Thursday, August 23rd, 2007

วันนี้นั่งสำรวจ Apache Slide แล้วก็เจอ WebDAVServlet เข้าก็เลยคิดว่าเขียนเรื่อง นี้คั่นซะด้วยเลยดีกว่า ต่อจากเรื่องที่แล้วด้วย อีกอย่างยังไงจะเขียนอะไรพื้นฐานก็เขียนเป็นชุดเดียวกันซะเลย :razz:

ในจาวา HttpServlet เป็น Servlet พื้นฐานที่คนเขียน Web Application น่าจะรู้จักกันทุกคน (หรือป่าว ผมนี่ข้ามขั้นไปลองเล่น Strut ก่อนแล้วค่อยกลับมารู้จัก Servlet และ JSP ทีหลัง :razz: ) เพราะมีไว้สำหรับจัดการคำสั่งของ HTTP ทั้งหมดที่ส่งเข้ามายัง Server โดยคลาส HttpServlet ก็มี method พื้นฐานที่เตรียมไว้ให้คนเขียนขั้นตอนการทำงานหลักๆ ลงไปคือ doDelete, doGet, doHead, do… ตามคำสั่ง HTTP ที่มีเป๊ะ โดยแต่ละ method ก็จะรับตัวแปรมาสองตัวคือ HttpServletRequest และ HttpServletResponse ซึ่งดูตามชื่อก็คงเดาออกกันหมดว่ามันทำหน้าที่อะไร

มาดูในฝั่ง PHP บ้างดีกว่า เท่าที่เห็นมารู้สึกจะมีตัวแปรที่กำหนดมาให้เลยสองตัวคือ $_GET และ $_POST ก็ตรงตามคำสั่ง HTTP สองคำสั่งคือ GET กับ POST แต่ผมสงสัยว่าคำสั่งอื่นมันทำยังไงนี่สิ ไช่ $_REQUEST หรือป่าวหว่า ยังไงใครที่เคยเขียนลองมาเล่าๆ หน่อยละกันครับ สงสัยอยู่นะเนี๊ยะ

หมดและภาษาที่เคยเขียน (มีภาษา C อีกอันเขียนเป็น CGI แต่อันนั้นมันไม่มีตัวช่วยอ่ะ) ดูๆ ไปแล้วทุกภาษาก็คงเหมือนกันหมด เห็น pF บอกในพันทิพย์มีคนถามเกี่ยวกับเรื่องพวกนี้ แต่ดูไปแล้ว ถ้าไปดู HTTP ปัญหาเหล่านั้นก็น่าจะหมดไป เพราะแต่ละอย่างก็มาจาก HTTP ทั้งนั้นเลย เดี๊ยวพรุ่งนี้(มั้ง) คงได้เขียน WebDAV หละ ตามด้วย Apache Slide และ Apache Jackrabbit . . . :mad: ทำไมเขียนไปเขียนมาเรื่องมันตามมายาวเหยียดเลยหว่า

ปอลอ. จะรับปริญญาแล้ว เดือนหน้ารู้สึกเวลามันเดินไวจริงๆ เลยแฮะ