ความเชื่องช้า

posted on 15 Feb 2008 07:15 by wonam in softdev

คนบอก Ruby ช้า

บางคนเอาโปรแกรม benchmark มาวัด เช่นบล็อกนี้: dynamic languages : rationalizations and myths

เอา mandelbrot benchmark มาขึ้นต้นการวิเคราะห์ (สำหรับคนที่ไม่รู้จัก Mandelbrot คือชื่อของอะไรสักอย่างที่เกี่ยวกับ fractal ในการคำนวณใช้พลังในการคำนวณมาก) แล้วบอกว่า Ruby ช้ากว่า 500 เท่า

คงจะไม่แปลกอะไร

ยิ่งไปกว่านั้น.. คงไม่มีใครเอา Ruby ไปเขียนงานประเภทนั้นอยู่แล้ว

ผมอ่านแล้วก็ขำ ๆ

ในหลาย ๆ benchmark Java ก็ช้ากว่า C, C++ สอง-สามเท่า แต่เขาพูดถึงแค่กรณีที่ตอนนี้ Java ช้ากว่าแค่ 10% (ใน Mandelbrot นั่นล่ะ)

สำหรับผมที่ตอนนี้ใช้ dynamic language อย่างสนุกสนาน พอต้องทำอะไรเล่นบางอย่างใน Java ถึงกับเหงื่อตก (ตกจริง ๆ นะครับ)

บางคนบอกว่า ก็แค่ใส่ type ก็พอ

...คงไม่เคยเห็นตัวอย่างที่ใส่ type ไม่ได้

เอาตัวอย่างจากวันก่อนก็ได้ ผมเล่น stackless python เป็นไลบรารีสำหรับเขียนโปรแกรมพวก concurrent บน python เวลาโปรแกรมแต่ละส่วนส่งข้อความกัน ปกติเขียนเป็นโปรแกรมบวกเลข แต่ตอนให้จบการทำงานอยากส่งสตริง เช่น ส่งไปเป็น "exit" เป็นต้น

สำหรับภาษาที่เป็น static คงต้องหาวิธีการบางอย่างมา "ผสม" ของสองอย่างนี้เข้าด้วยกัน ไม่งั้นก็ส่ง -1 ถ้ามีแต่เลขบวก แต่ ถ้าผมอยากให้บวกเลขได้ทั้งเลขบวกเลขลบล่ะ?

...เหนื่อยใช่ย่อยนะครับ

อย่างไรก็ตามการเขียนแบบผสมปนเปใน dynamic language แบบนี้เขาว่ามันไม่ scale

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

สุดท้ายแล้ว ผมว่าแต่ละแนวมันก็มีที่ทางของมันอยู่ (จบบล็อกเหมือนละครน้ำเน่า) 

ผมเขียน C, C++ เวลาทำอะไรที่ต้องการความเร็วสุดขีด พวกงานถึงก็ช่างไม่ถึงก็ช่าง ผมก็ใช้ภาษาอื่น ๆ ไป เลือกตาม library เลือกตามอารมณ์

ผมว่าประเด็นคือต้องใจกว้างหน่อย มองโลกในแง่ดีหน่อย โอเค สำหรับคนที่พัฒนาไลบรารี ทำ framework การที่ภาษาล้มหายตายจาก หรือคนเปลี่ยนไปใช้ภาษาอื่น อาจทำให้ลำบาก ส่วนเราคนเขียน ก็หาภาษา หา framework หาไลบรารี เรียนรู้กันไป

ผมว่าไม่ว่าจะอย่างไรก็ตาม คนที่อยู่ในสายเทคโนโลยี คงไม่สามารถจะทำเป็นไม่รู้ไม่เห็นกับเทคโนโลยี และสิ่งต่าง ๆ ที่เกิดขึ้นได้ ถึงแม้จะไม่อยู่ในสายเฉพาะที่ถนัด (เช่น ถนัด Java ก็ดูแต่ Java อย่างเดียว ถนัด Ruby ก็ดูแต่ Ruby อย่างเดียว) ก็ตาม

ปัญหาหลัก ๆ ที่ทำให้หลายคนไม่ได้ดูพวกนี้น่าจะเป็นเวลา แล้วก็การเริ่มต้นภาษาใหม่ หรือ framework ใหม่ จนกว่าจะชินและใช้ได้คล่องได้ ก็ใช้เวลามากพอดู

(อาจจะเป็นโชคดีของผมก็ได้ ที่ไม่ได้ทำอะไรต่อเนื่อง เขียน ๆ ทิ้ง ๆ เลยได้ลองเยอะ --- นี่อาจจะเป็นสิ่งที่ทำให้ผม bias ไปหาของที่เรียนง่าย เป็นเร็ว แต่ "ไม่ยั่งยืน" (??) ก็ได้)

Comment

Comment:

Tweet

ขอบคุณสำหรับทุก ๆ comment นะครับ
เดี๋ยวว่าจะไปลอง scala เหมือนกันครับ ;)

#11 By wonam on 2008-02-26 11:17

ผมว่ากรณี Ruby ช้าเร็ว หรือ Java ช้าเร็ว มันไม่ค่อยเกี่ยวกับภาษานะครับ (อาจจะเกี่ยวบ้างในกรณีที่มือใหม่กับภาษานั้นจริงๆ)

ปัญหาเรื่องพวกนี้จริงๆ แล้วถ้ามองตามหลัก AOP มันคือ Cross cutting concern ทั้งนั้นแหละครับ เป็นปัญหาทางด้าน infrastructure ที่ถึงไม่อยากยุ่งแต่ก็หลีกเลี่ยงไม่ได้เพราะมันลากตัดผ่าน requirements ของเราเสมอๆ

ที่ Java ประสบความสำเร็จเอาชนะ C++ ได้ในยุคนั้น นอกจากตัวภาษาแล้ว ตัว Java platform ก็เล่นบทบาทสำคัญนะครับ เพราะมันตัดปัญหา cross cutting concern ออกไป อย่างเช่นเรื่อง security (ไม่มี pointer) กับเรื่องที่ให้ผู้ใช้โฟกัสไปที่ business concern (ไม่ต้องห่วงเรื่อง memory มากมายเพราะตัว Platform ทำ garbage collection ให้) แม้ในสมัยนั้น GC ในยุคนั้นเป็นแบบโง่ๆ เทียบไม่ได้เลยกับในยุคนี้เลยก็ตาม

การจัดการ cross cutting concern ยังมีอีกหลายประเด็นครับที่ platform มีบทบาทอย่างมากเช่น
- cross Platform - Write Once Run Anywhere
- Performance - มี JIT (Just-in-time), AOT (Ahead-of-time) Compiler
- Concurrency - แม้ตัวภาษา Java จะไม่เก่งเรื่องนี้เท่าภาษาตระกูล Functional แต่ lib concurrency ใหม่ของมันก็ทำให้ง่ายขึ้นระดับหนึ่ง ส่วนเรื่อง performance ของมันผมว่าเกรด A นะ
- i18n สนับสนุนภาษาก็ถือว่าเป็น xcc เหมือนกันนะครับ

ภาษาก็มีส่วนเหมือนกันครับ แต่ส่วนเรื่องประเด็น scalability ผมว่าไม่เกี่ยวกับภาษาโดยตรง แต่ถ้าเป็น maintainability นี่มีผลเต็มๆ เลยครับ

Ruby ในความคิดผมเหลือเชื่อมากเลยครับ แต่อำนาจที่ยิ่งใหญ่ก็มาพร้อมกับความรับผิดชอบอันยิ่งใหญ่ด้วยเช่นกัน

ถ้ามองหาความ balance ยอมลด พลัง ลงเพื่อแลกกับการควบคุมมันได้อย่างมีประสิทธิภาพก็น่าจะคุ้มนะครับ

เมื่อช่วงตอนคนแห่ไปใช้ Ruby ก็บูมกันเป็นพลุแตกเลยนะครับ พอพ้นช่วงเห่อ คนเริ่มคิดมากขึ้นก็พบเรื่อง cross cutting concern ที่ ruby platform ยังทำได้ไม่ดีนัก เพราะก่อนหน้านี้ตลอดมาไม่เคยต้องเผชิญกับโจทย์ประเภทนี้ อย่างที่เป็นประเด็นถกกันเรื่อง i18n , green thread, ruby ช้า เป็นต้น

ตัวอย่างจาก JRuby แก้ปัญหานี้ได้ดีทีเดียวเลยนะครับ เพราะตัว Java Platform เจอเรื่องพวกนี้จนชินแล้ว ตอนนี้ JRuby 1.1RC2 ความเร็วสูสีใกล้เคียงกับ CRuby 1.9 ด้วยซ้ำ ทั้งๆ ที่เพิ่งปรับแต่งไปได้ไม่เท่าไหร่เอง

ในอนาคตต่อไป JVM ผันตัวเองไป host หลายภาษา ทำตัวเป็น platform ที่ดีมากขึ้น Java SE 6 ตอนนี้สนับสนุนภาษา dynamic ระดับหนึ่ง แต่เรื่อง performance ยังไม่ดีเท่า java เพราะไม่ได้ถูกออกแบบมาแต่แรก

แต่ Java 7 คงเปลี่ยนโฉมไปพอสมควรทั้งตัวภาษาเอง และตัว platform ที่จะรองรับคำสั่งที่เกิดจาก functional, dynamic language มากขึ้น

ส่วนตัวแล้วผมสนใจ groovy กับ Scala อยู่ครับ

ไม่ทราบว่าอาจารย์เคยดู Scala ไหมครับ มันเป็นภาษา static type, Object Oriented, Functional language ที่สมดุลทั้งบู๊และบุ๊น อาจจะไม่หวือหวาเท่า Ruby แต่ก็จำกัดควบคุมได้โดยที่ไม่รู้สึกเสียดายอะไร

#10 By deans4j (124.120.136.233) on 2008-02-19 17:53

bact ' : Web service ทุกภาษาคุยกันได้ แต่ work รึเปล่าอีกเรื่องนึง question question

ตอนนี้หัด Python อยู่ หลายๆ อย่างต้องเปลี่ยนวิธีคิด ยากเหมือนกันแฮะ

#9 By plynoi แว่วศรี on 2008-02-18 11:20

อาจารย์ครับ ผมสร้างเริ่มติดใจ ruby แล้วครับ ตอนนี้หันทำ blog แบบที่อาจารย์สอนได้แล้วครับ แต่ว่าตอนแรก งง กะไอ้ scaffold ตั้งนาน เพิ่งมารู้ว่า rails 2.0 ขึ้นมา มันเปลี่ยน syntax เด๋วว่างๆ ผมไปหาอาจารย์ใหม่นะครับ

#8 By papon (117.47.70.8) on 2008-02-18 00:09

Java มันก็กึ่งๆ Dynamic นะผมว่า. ถ้าอยากส่งทั้งเลขทั้ง String ก็ใช้ Object เอาแล้ว return เป็น String บ้าง Integer บ้าง. แต่พอทำแบบนี้แล้วก็จะเริ่มงงๆว่าใช้ Java ทำไม question.

ถ้าทำเป็นแนว software engineering สงสัยต้องออกแบบ questionaire แล้วให้เติม เสร็จแล้วบอกว่าควรจะใช้ภาษาอะไร question. แต่กว่าจะทำอย่างที่ว่านึกไม่ออกเลยว่าจะเอาข้อมูล หรือหลักฐานมากจากไหน sad smile

#7 By veer on 2008-02-17 12:36

bact': JVM ช่วงนี้ก็ดูหลากหลายพอตัว? มี JRuby/Groovy/Scala/Javascript ด้วย น่าเล่นมากๆ.

แต่ผมก็ใช้ PHP เพราะเหมาะสมกับงาน question. จริงๆใช้อย่างอื่นเขียนน่าจะง่ายกว่าดีกว่า แต่ host ส่วนมากมี PHP sad smile. กับตอน deploy เวลาใช้พวก Cherrypy หรือ web server อื่นๆนอกจาก Apache คนตาม support ดูจะลำบากนิดๆ.

#6 By veer on 2008-02-17 12:31

Joe: Javascript ต่างไปจาก Java ถึง 2 ก้าว ถ้าผมจะนับว่า Ruby ต่างจาก Java ก้าวเดียว เพราะ Javascript นอกจากจะใช้ Duck typing แล้วยังไม่ใช่ class-based oop ด้วย แต่ Ruby เป็น class-based.

ผมเห็นด้วยนะครับว่ามันเป็นดาบ 2 คม. บางทีการเขียนภาษาที่เขียนยาวๆแบบ java ก็เป็นดาบ 2 คมเหมือนกัน. มักจะทำให้คนหลีกเลี่ยงใช้วิธีหรืออุปกรณ์ที่ดูตรงไปตรงมา. อย่าง hash หลายคนก็หลีกเลี่ยงที่จะใช้ ถึงแม้บางทีมันจะน่าใช้. class hierarchy ที่ยืดยาวก็เป็นปัญหาเหมือนกัน ทำให้ไล่โปรแกรมยาก.

อาจจะมีจุดที่พอดีๆ? อาจจะมี guideline ว่าถึงจุดไหนควรจะใช้ท่าไหน?

#5 By veer on 2008-02-17 12:22

ผมว่า ก็นะ เข้าแนวน้ำเน่า
ใช้ภาษาที่ถนัด/เหมาะกะงาน

แต่ถ้าตอบแบบนี้ ก็ต้องหาอะไรที่ทำให้โปรแกรมจากหลาย ๆ ภาษามันลิงก์หากันได้ง่าย ๆ
+ แชร์ data type กันด้วย

ในแง่นี้ .NET Framework น่าจะดีสุด
(JVM ก็ทำได้ แต่เหนื่อยกว่า)

#4 By bact' (58.137.54.35) on 2008-02-16 00:47

ผมเองไม่เคยเขียนภาษาที่เป็น Dynamic เลย มีแต่เคยอ่าน code JavaScript นิดหน่อย แต่ขอบังอาจร่วมแจมเสนอความคิดเห็นหน่อยนะครับ ถ้าคิดผิดกรุณาชี้แนะด้วยครับ

ก่อนอื่นต้องบอกก่อนว่าผมไม่ได้ไม่ชอบพวกภาษา dynamic นะครับ แล้วก็รู้สึกว่ามันมีข้อดีของมันมากมาย มันดูทำอะไรสนุกๆ พลิกแพลงอะไรได้เยอะ

แต่ผมคิดว่าการที่มันปล่อยให้ทำอะไรได้มากมาย ก็เป็นดาบสองคม มันเปิดโอกาสให้เราทำอะไรผิดๆ ได้ง่ายขึ้น มันยั่วยวนใจให้เราหาทางออกให้กับปัญหาอย่างง่ายๆ โดยที่อาจจะไม่ได้แก้ปัญหาจริงๆ ในการทำงานเป็นทีมในองค์กรปิด ซึ่งปกติมักจะมีโปรแกรมเมอร์หลายระดับปนๆ กัน ผมว่ามันยิ่งยากในการควบคุมคุณภาพของงานให้ออกมาดี การพลิกแพลงอะไรบางอย่างที่ไม่จำเป็น อาจจะทำให้ code ยิ่งอ่านยาก เวลาต้องกลับมาไล่แก้ทีหลัง

อันที่จริงจะใช้ภาษาอะไรก็มีปัญหาแบบนี้ทั้งนั้น จำเป็นต้องมีกระบวนการที่ดีคอยคุมอยู่ เพียงแต่จะเหนื่อยมากเหนื่อยน้อยในการคุมเท่านั้นเอง

เขียนมาตั้งยาว เพิ่งนึกได้ว่ามันน่าจะสรุปได้สั้นๆ เหลือแค่ประโยคเดียวเอง

"With great power comes great responsibility"
big smile

#3 By Joe (125.24.42.219) on 2008-02-16 00:11

คุยกับคนที่มีความคิดแบบ static ก็เหนื่อยหน่อยนะครับ

#2 By พสุ (61.7.176.65) on 2008-02-15 18:54

ขำๆ ครับ คิดอะไรมาก

#1 By plynoi แว่วศรี on 2008-02-15 13:24