Tags:

ช่วงนี้ใช้ Java บน GAE ครับ

และกำลังปวดกระโหลก กับการที่มันไม่มี struct ให้ใช้ ด้วยหลายๆเหตุผล

เลยอยากทราบว่า คนใช้ Java มีวิธีอะไรบ้างที่ใช้แทน User Defined ValueType เวลาที่อยู่ๆก็ต้องการจะใช้ขึ้นมา

ขอขอบคุณล่วงหน้าครับ

Get latest news from Blognone
By: lancaster
Contributor
on 7 May 2011 - 01:18 #286229

ปกติผมใช้ class ครับ

By: Thaina
Windows
on 7 May 2011 - 01:45 #286240 Reply to:286229

บางทีมันจะมีเหตุการณ์ไม่ปกติครับ เช่น

  • ต้องการให้มัน Copy by Value ทั้งคลาส
  • อยากสร้าง Array ที่มัน Packed
  • ต้องการ Performance ไม่ต้องการ indirection
  • ไม่อยากเช็ค null
  • ฯลฯ
By: lancaster
Contributor
on 7 May 2011 - 03:49 #286261 Reply to:286240

ข้อแรกก็ .clone() เอาได้นี่ครับ ส่วนเรื่อง performance ถ้าคุณซีเรียสจุดนี้ ผมว่าไม่เหมาะตั้งแต่เขียน java แล้วล่ะครับ lol

ข้ออื่นๆ ผมไม่ทราบ ต้องให้เซียนชวามาตอบ

By: JavaDevil
iPhoneUbuntuIn Love
on 7 May 2011 - 03:47 #286258

อย่าไปแคร์ Performance มากมายครับ คุณไม่ต้อง Optimize ในรายละเอียด เขียนตาม best practice ของ java ก็น่าจะทำให้ performance อยู่ในเกนณ์ที่รับได้นะครับ ผมเชื่อว่า ใช้ Class แทน struct ก็ไม่ได้ช้าลงมากมายครับ

By: rulaz07
ContributoriPhoneAndroidBlackberry
on 7 May 2011 - 14:39 #286368 Reply to:286258

+1

By: Thaina
Windows
on 7 May 2011 - 14:54 #286372 Reply to:286258

ตอนนี้ผมใช้ GAE ครับ ยังฟรีอยู่

แต่ถ้าเกิดมีคนใช้มากๆ ก็กิน CPU Time ถ้าเกินก็ต้องเริ่มซื้อ Package และมันก็คิดตาม CPU Time ที่มากขึ้นด้วย

Performance เปนเงินเปนทองครับ

By: UltimaWeapon
Windows PhoneRed HatWindowsIn Love
on 7 May 2011 - 09:22 #286290
UltimaWeapon's picture

ถ้าใช้ structure ไม่ได้นี่ เป็นภาษาที่ไม่ซัพพอร์ท data structure ระดับ binary เลย ภาษาหลายตัวผมก็เห็นใช้ได้นะ เช่น C#, Perl

By: boykeng on 7 May 2011 - 10:19 #286301
boykeng's picture

struct มันผิดหลักการ OOP หน่ะครับ

ไม่ต้องห่วงเรื่องความเร็ว

By: Thaina
Windows
on 7 May 2011 - 15:13 #286373 Reply to:286301

ฟังดูน่าสนใจ struct มันผิดหลักการ OOP อย่างไรครับ?

ในเมื่อ Java ก็ยังต้องมี Primitive และ C# ก็มี struct ให้ใช้ ก็ยังเปน OOP ได้

ถ้าบอกว่า struct มันผิดหลักการ OOP
แล้ว struct ใน C# ทำให้ C# ผิดหลักการ OOP อย่างไรได้บ้างครับ?
Primitive ใน Java ทำให้ Java ผิดหลักการ OOP อย่างไรบ้างครับ?

ถ้าผมจำไม่ผิด หลักการ OOP ก็จะมีหลักการของ Value Type อยู่ด้วยนะครับ

By: nant
ContributorWindows PhoneRed HatUbuntu
on 7 May 2011 - 15:18 #286376 Reply to:286373

การผิดหลักการ OOP เล็กๆ น้อยๆ เช่น Primitive type ทำเพื่อความสะดวก สบาย

By: Tg on 11 May 2011 - 11:34 #287583 Reply to:286376

แล้วมันผิดหลักการ OOP ตรงไหนเหรอครับ....

By: nant
ContributorWindows PhoneRed HatUbuntu
on 12 May 2011 - 20:20 #288097 Reply to:287583

ผิดที่ primitive types ไม่มีคณสมบัติเป็นวัตถุไงครับ

By: nant
ContributorWindows PhoneRed HatUbuntu
on 7 May 2011 - 15:16 #286375

ไม่มีครับ ถ้าให้เหมือนที่สุดคือ class ที่ไม่มี method
แล้วถ้าจำไม่ผิด c ก็ไม่มี packed array เช่นกัน
หรือคำว่า packed array ของคุณ thaina หมายถึง a[n]?

By: Thaina
Windows
on 7 May 2011 - 15:33 #286378 Reply to:286375

สงสัยผมเรียกผิด หมายถึง อย่าง byte[] A = new byte[X] ธรรมดานี่แหละครับ

ก็คือ มันจอง memory ตรงๆ ขนาด X byte ไม่ใช่จอง address ไปที่ byte อีกที น่ะครับ

By: JavaDevil
iPhoneUbuntuIn Love
on 7 May 2011 - 18:05 #286409 Reply to:286378

จอง memory กับ จอง address มันต่างกันตรงไหนครับ?

By: Thaina
Windows
on 7 May 2011 - 18:43 #286412 Reply to:286409

ต่างกันแบบ

Byte[] B = new Byte[4]; //Array ขนาด 4 object แต่ละ object ต้อง new Byte()

กับ

byte[] B = new byte[4]; //Array ขนาด 4 byte

น่ะครับ

By: JavaDevil
iPhoneUbuntuIn Love
on 8 May 2011 - 00:08 #286483 Reply to:286412

ผมว่า ขนาดผมว่า มันเพิ่มต่างกันไม่เยอะหลอกครับ ^^

By: Thaina
Windows
on 8 May 2011 - 00:37 #286502 Reply to:286483

ปกติ reference to object น่าจะขนาด 4 byte

ถ้ามี object ขนาด 4 byte (เช่น IPAddress)

  • C# จอง Array struct รองรับ 256 connection == 1024 byte ก็ 1 KB + 4 byte(object array)
  • Java จอง Array class รองรับ 256 connection == 1024 byte ก็ 1 KB + จองข้อมูลกระจายใน Heap อีก 256 ตัว == 1 KB รวม 2 KB + 4 byte(object array)

struct ทั่วไปใน C# ขนาดของมันอยู่ในช่วงเฉลี่ย 4 - 16 byte
ที่ใหญ่จริงๆและมีคนใช้ประจำคือ 64 byte (Matrix)

Java ต่างกันไม่เยอะหรอกครับ แค่กินเมมมากขึ้นประมาณ ร้อยละ 50 กว่าที่ควรจะเปน แค่นั้นเอง

ยังไม่นับ Performance ที่เสียไป

  • จากการ indirection โสตหนึ่ง
  • จากการ allocate heap บ่อยๆ ทำให้เกิดช่องโหว่กระจายใน memory อีกโสตหนึ่ง
  • จากการที่ต้องให้ GC ดูแล object เล็กๆน้อยๆ เหล่านี้ ที่บางครั้งใช้งานแค่ครั้งเดียว อีกโสตหนึ่ง
By: McKay
ContributorAndroidWindowsIn Love
on 8 May 2011 - 00:51 #286516
McKay's picture

เป็นข้อแตกต่าง(เสีย?)ของ Java ครับ

ปรับตัว ไม่ก็เลิกใช้ น่าจะเป็นสองวิธีที่ดีที่สุด
เพราะ Java ไม่ใช่ C# และ C# ก็ไม่ใช่ Java ครับ


Russia is just nazi who accuse the others for being nazi.
someone once said : ผมก็ด่าของผมอยู่นะ :)

By: nant
ContributorWindows PhoneRed HatUbuntu
on 8 May 2011 - 02:09 #286527
คุณ thaina ไปดู benmark ระหว่าง C# กับ JAVA สิครับ  ในหลายๆการทดลอง JAVA เป็นรอง C++ เล็กน้อย สูสีกับ C# เลยทีเดียว 

ผมเข้าใจว่าคุณ thaina นิยม C# ซึ่งก็ไม่ผิดอะไรที่จะมีภาษาที่ชื่นชอบเป็นพิเศษ ทำให้มองภาษาที่เป็นคู่แข่งกันลบไปหน่อย (ผมเองก็แฟนบอย C++ ผมยังมอง D ในแง่ลบเลย แต่ผมก็เขียนได้นั่นแหละ)


อะนี่ครับ C# vs java
By: Thaina
Windows
on 8 May 2011 - 02:42 #286530 Reply to:286527

เปล่าเลยครับ มันไม่เกี่ยวหรอกว่าผมนิยมอะไร

แต่มันถึงจุดที่ มันคือสิ่งที่ควรจะต้องใช้แต่กลับไม่มีให้ใช้ ต่างหาก

Benchmark ในหลายๆการทดลอง มันก็คือ Field ที่ ผมไม่ได้ใช้ในเวลานี้(และคงไม่ต้องใช้)
และอีกหลายๆการทดลองที่ Benchmark มันแพ้รูดมหาราช ดันอยู่ใน Field ที่ผมกำลังอยากจะใช้

ซึ่งผมคงไม่ต้องมาทนฝืนใช้ ถ้าหากไม่ใช่เพราะอยู่ใน Platform ที่มันบังคับ

บอกอีกทีว่าผมกำลังใช้ GAE ซึ่งถ้าไม่ใช่ Java ก็ต้อง Python

และจากกระทู้นี้ก็ทำให้ผมตัดสินใจได้ว่า ถ้าใช้ GAE ต่อไป ควรจะไปตายเอาดาบหน้ากับ Python ดีกว่า
ไม่น่าเลือกเสี่ยงกับ Java แค่เพราะเห็นว่าเคยใช้มาบ้างเลย

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

ตั้งแต่สมัยที่ผมไม่คิดจะอวย C# ผมก็ยังคิดว่า Java กากส์
และตอนนี้ยิ่งมั่นใจ ว่าใครที่พูดว่า Java เร็วส์ คนนั้นกำลังหลอกลวงคนฟัง

ตั้งกระทู้นี้มาผมก็ตั้งใจจริงๆนะ ว่ามีใครจะบอกว่า Java มันมีวิธี Optimize กันบ้างหรือไม่

เอาจริงๆผมก็เห็นพวกเว็บต่างประเทศ เขาก็มีแนะนำให้ใช้ BitBuffer (ที่มาถามเพราะเผื่อใครจะมีเทคนิคอะไรดีกว่านั้น)
ซึ่งจริงๆมันก็คือทำ Array ของ struct แบบปลอมๆ แต่ประสิทธิภาพก็ยังต่ำกว่านิดหน่อย แถมความง่ายในการใช้งานต่างกันหลายขุม

คนที่เผยแพร่วิธีนี้บอกว่า ต้องออปติไมซ์โปรแกรมใน Server เพราะ Java แดกทรัพยากรมากเกินไป
พอเอาวิธีนี้มาใช้ ก็ดีขึ้นมาหลายเท่า

สรุปคือ Java มันตัดฟีเจอร์ดีๆออก "เพราะอยากให้คนใช้งานได้ง่าย"
แต่พอถึงขั้นที่ยังไงๆ ก็ต้องใช้ กลายเปนคนใช้ต้องเล่นท่ายาก แถมก็ไม่ได้เรื่องเท่าภาษาอื่นเขา

Java ควรจะละอายแก่ใจบ้างนะครับ ว่าเกิดมาก่อนกี่ปีแล้ว
เอามาอวดว่า ตั้งหลาย Benchmark ที่สูสีกับ C# น่าภูมิใจตรงไหนเนี่ย

สรุปก็แค่ขี้เกียจแก้ JVM ให้มันรองรับ struct
ดีแต่กินบุญเก่า แล้วก็อ้างข้างๆคูๆไปเรื่อย งานไม่ต้องมี Performance บ้างล่ะ (มือถือล่ะ?) รักษา OOP บ้างล่ะ (สุดท้ายก็ต้องมี Primitive อยู่ดี ก่อนหน้านี้ก็จำใจต้องเพิ่ม long เข้าในระบบ)

แล้วก็มาช่วยกันออกรับแทน ไม่แย่ขนาดนั้นหรอก ไม่ต้องใช้หรอก

สาวกยังไงก็เปนสาวกจริงๆ

ขอพูดอย่างสุดท้ายว่า

ผมเห็น Java มันก็พัฒนาอะไรๆ ตามคำเรียกร้องของคนใช้ OpenJDK มี Mailing List

แต่ในเมื่อมีแต่ผู้ใช้สาวกแบบนี้ SUN พูดว่าไม่ต้องใช้ struct ก็ชาบูว่า ดีแล้วๆ ไม่ต้องใช้ๆ

แล้วก็มาปลอบกันเอง "Performance ไม่ดี? ไม่ต้องห่วงๆ Java ไม่ห่วง Performance เขียนไปตามแนวคิดเขาก็พอ"

ชาติหน้าก็คงไม่มีให้ใช้ Performance ห่วยยังไงก็ได้ เพราะมันคือ Java

ขอบคุณครับ ที่ทำให้ผมได้ซาบซึ้งกับคำว่าสาวกอีกครั้งหนึ่ง

By: lew
FounderJusci's WriterMEconomicsAndroid
on 8 May 2011 - 04:33 #286541 Reply to:286530
lew's picture

การทำ packed struct เป็นการ "ลด" performance ครับ แม้แต่ภาษา C ก็ไม่แนะนำให้ทำ ถ้าไม่มีความต้องการพิเศษเช่นการทำ binary compatible

การทำ VM ของทุกคนติดเพดานความเร็ว CPU ทั้งสิ้น ไม่มีใครสามารถทำ VM ให้เร็วกว่าความเร็ว CPU ได้ตัว Java เองมี JIT มาล่วงหน้าหลายปี ทำความเร็ว raw throughput ได้ใกล้เคียง CPU ในหลายๆ กรณี ถ้า VM อื่นๆ จะตามมาใกล้ ก็ไม่รู้จะหนีไปไหนครับ

รอบนี้ผมถือว่าคุณ "ลองของ" ผมที่พยายามใช้คำไม่สุภาพหลังจากผมแบนคุณไปหนึ่งสัปดาห์แล้ว

แบนหนึ่งเดือนครับ และนี่เป็นรอบสุดท้ายก่อนแบนถาวร


lewcpe.com, @wasonliw

By: nant
ContributorWindows PhoneRed HatUbuntu
on 8 May 2011 - 12:04 #286620 Reply to:286530
ผมเข้าใจว่าผมกำลังคุยเรื่องวิชาการนะครับ

คุณ thaina สงสัยเรื่อง performance ก็ต้องวัดกันสิครับ ว่าเทียบกันแล้วเป็นอย่างไร การที่ไม่มี struct ทำให้ประสิทธิภาพตกหรือเปล่า ? คำตอบคือไม่ค่อยตกเมื่อเทียบกับ C#

ส่วนเร้องสาวกไม่สาวกนั้น? ผมไม่ได้ตำหนิคุณหรือเหยียดใครว่าเป็นสาวกแล้วไม่ดี เพราะผมก็สาวก C/C++ นั่นแหละครับ ผมไม่ได้ออกรับแทนจาวา (คุณน่าจะรู้ว่าสาวกภาษาเนทีฟมีมุมมองอย่างไรกับ ภาษาบน VM นะ) ผมแค่ต้องการคุยกับคุณ เรื่องจาวา
By: vavar
iPhoneAndroidBlackberryWindows
on 8 May 2011 - 17:00 #286684
vavar's picture

ตอบ จขกท ... ทำ class ปกติ
แต่ไม่ต้องใช้ method แล้ว reference แบบ package-protected
(define แบบไม่ใส่ public/private/protect)

หรือถ้าจะให้ advanced กว่านี้ รอ java7 ครับ ...

By: vittee
AndroidRed HatUbuntuWindows
on 9 May 2011 - 10:08 #286783
vittee's picture

ลองสร้าง Annotation ไปกำกับ Class ให้มีพฤติกรรมคล้ายๆ struct พอจะได้มั๊ยครับ ทำคล้ายๆเวลาจะกำหนด struct alignment บน C# นะครับ

หรือไม่ก็ ใช้พวก Serialize/Externalize Interface เข้าช่วย

By: mr_tawan
ContributoriPhoneAndroidWindows
on 9 May 2011 - 12:37 #286829
mr_tawan's picture

Java ไม่มี Value Type ที่ User สร้างเองได้ครับ ถ้าเทียบกับ C# นะ

เขาตัด Feature ที่ดูแล้วซ้ำซ้อน ไม่มีความจำเป็น ทิ้งได้ก็ทิ้ง เพื่อให้เป็นภาษาที่เรียบง่ายและเข้าใจได้ง่ายครับ Performance เป็นเรื่องรอง (ถ้ามันคอขาดบาดตายจริง ก็เขียน Native Code แล้วต่อด้วย JNI)


  • 9tawan.net บล็อกส่วนตัวฮับ
By: ico on 9 May 2011 - 18:32 #286940

มันเป็นงานอะไรถึงขนาดใช้ class แทน struct แล้วมันมีค่าใช้จ่ายเพิ่มขึ้นในจำนวนที่รับไม่ได้ครับ

ถ้าบอกได้นะครับ

By: mr_tawan
ContributoriPhoneAndroidWindows
on 9 May 2011 - 19:16 #286950
mr_tawan's picture

แนะนำให้ จขกท. อ่าน Effective Java ที่เขียนโดยคุณมารดาของ Java 'Joshua Bloch' โดยด่วน


  • 9tawan.net บล็อกส่วนตัวฮับ
By: wasanchai on 10 May 2011 - 17:15 #287274

ส่วนตัว ผมเห็นด้วยกับคุณ Thaina เขาก็มาถามดีๆ ผมว่าไม่แรง ถ้าคุยกันด้วยเหตุผล
และไม่ควรไป ban เขาด้วยคุณ lew ควรพิจารณาตัวเองครับ ผมว่าคุณ lew ทำเพื่อความสะใจมากกว่า
ถ้าจะ ban ผมอีกคนก็ไม่ว่าครับ

ขอบคุณครับ

By: mossila
iPhoneWindows PhoneAndroidBlackberry
on 11 May 2011 - 12:11 #287600 Reply to:287274
mossila's picture

แรงนะครับ..

By: mr_tawan
ContributoriPhoneAndroidWindows
on 11 May 2011 - 14:12 #287655 Reply to:287274
mr_tawan's picture

ผมว่าที่ถูกแบนก็เพราะว่าพูดจาเข้าข่ายดูถูกคนอื่นน่ะครับ ไม่มั่นใจเหมือนกัน รอคุณ ๆ ทั้งสองมาแถลงอีกที


  • 9tawan.net บล็อกส่วนตัวฮับ
By: Tg on 11 May 2011 - 18:12 #287694 Reply to:287655

เท่าๆที่อ่านไอ้ที่เขาดูถูกก็มีแค่.... java ? แล้วที่เขาเหวี่ยงนิดๆหน่อยก็สมเหตุสมผลด้วย เพราะว่าไอ้ที่บ่นๆน่ะเพราะว่าแต่ละคำตอบก็คือ "ทนๆไปเถอะ ก็จาวามันเป็นแบบเนี้ย", กับ "มันจะมีผลอะไรมาก". ทั้งที่เขาก็บอกเหตุผลมาแล้วว่าทำไมต้อง optimize ถึงลูกถึงคนขนาดนั้น....

ปล. ผมสาวกไพธอน ถึงจะกินแรมแต่ก็รักนะ

By: nidlittle
iPhoneWindows
on 11 May 2011 - 18:45 #287698 Reply to:287274

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

ผมว่าแรงอยู่นะ

By: mr_tawan
ContributoriPhoneAndroidWindows
on 11 May 2011 - 18:58 #287700 Reply to:287698
mr_tawan's picture

อืม ผมอ่านตกคำว่า แ_กทรัพยากร ไปได้ไงหว่า ??


  • 9tawan.net บล็อกส่วนตัวฮับ
By: lancaster
Contributor
on 11 May 2011 - 20:15 #287708 Reply to:287700

ถ้าให้เดาผมว่าโดนเพราะคำนี้นะครับ เพราะรู้สึกท่านไทนาเคยโดนเตือนเรื่องคำหยาบไปหลายทีแล้ว