ทำไม Go จึงช้ามาก (เมื่อเทียบกับ Java)


109

ดังที่เราเห็นจากเกมเกณฑ์มาตรฐานภาษาคอมพิวเตอร์ในปี 2010:

  • Go จะช้ากว่าCโดยเฉลี่ย 10 เท่า
  • Go ช้ากว่าJava 3 เท่า!?

สิ่งนี้จะเป็นได้อย่างไรโดยจำไว้ว่า Go compiler สร้างโค้ดเนทีฟสำหรับการดำเนินการ
คอมไพเลอร์ที่ยังไม่บรรลุนิติภาวะสำหรับ Go? หรือมีปัญหาบางอย่างกับภาษา Go?

แก้ไข:
คำตอบส่วนใหญ่ปฏิเสธความช้าของ Go โดยอ้างว่าปัญหาอยู่ในคอมไพเลอร์ที่ยังไม่บรรลุนิติภาวะ
ดังนั้นฉันจึงได้ทำการทดสอบด้วยตัวเองเพื่อคำนวณตัวเลข Fibonacci : อัลกอริทึมซ้ำทำงานใน Go (freebsd, 6g) ด้วยsameความเร็วเช่นเดียวกับใน C (พร้อมตัวเลือก O3) ตัวเรียกซ้ำที่น่าเบื่อทำงานใน Go 2 timesช้ากว่าใน C (พร้อมตัวเลือก -O3 กับ -O0 - เหมือนกัน) แต่ฉันไม่เคยเห็น 10x ลดลงเหมือนในเกม Benchmarks


36
เพื่อความเป็นธรรม C คือ ASM ปลอมตัวและ Java มีการเพิ่มประสิทธิภาพอย่างจริงจังในปัจจุบัน
Matthew Scharley

16
บางทีเกณฑ์มาตรฐานอาจไม่ได้สะท้อนถึงจุดแข็งของ Go อาจเป็นไปได้ว่าเกณฑ์มาตรฐานอื่น ๆ จะเร็วกว่านี้จริง นอกจากนี้บ่อยครั้งมันไม่ใช่ประสิทธิภาพ แต่เป็นความสามารถในการอ่านของโค้ดที่สำคัญที่สุด
ภายนอก

7
@extraneon: ฉันเห็นด้วย จำไว้ว่า Go ออกแบบมาสำหรับ Google และ Google มักจะรันโค้ดบน 2 ล้านคอร์ ฉันเชื่อว่าเกม Benchmarks ใช้เพียง 4 คอร์
Jörg W Mittag

4
@extraneon: ฉันเห็นด้วยโดยทั่วไป แต่ Go ได้รับการออกแบบมาโดยเฉพาะโดยคำนึงถึงความเร็วเช่นเดียวกับ "โปรแกรมผลลัพธ์จะทำงานได้เกือบเร็วที่สุดเท่าที่เทียบเคียงรหัส C หรือ C ++"
shosti

4
คำถามของคุณถือว่ามากเกินไป: "คำตอบส่วนใหญ่ปฏิเสธความช้าที่แท้จริงของ Go" เป็นวลีที่ไม่ถูกต้องสำหรับใช้ในคำถาม คุณมีคำถามที่จะถามหรือมีคำสั่งให้ทำ? โปรดดูc2.com/cgi/wiki?HostileStudentเพื่อทำความเข้าใจข้อผิดพลาดของคุณ
คริส

คำตอบ:


102

คอมไพเลอร์ 6g และ 8g ไม่ได้รับการปรับให้เหมาะสมโดยเฉพาะดังนั้นโค้ดที่สร้างขึ้นจึงไม่เร็วเป็นพิเศษ

ออกแบบมาเพื่อให้ทำงานได้อย่างรวดเร็วและสร้างโค้ดที่ใช้ได้ (มีการเพิ่มประสิทธิภาพเล็กน้อย) gccgoใช้การเพิ่มประสิทธิภาพที่มีอยู่ของ GCC และอาจให้การเปรียบเทียบที่ตรงประเด็นมากขึ้นกับ C แต่ gccgo ยังไม่สมบูรณ์

ตัวเลขเกณฑ์มาตรฐานเกือบทั้งหมดเกี่ยวกับคุณภาพของการนำไปใช้งาน พวกเขาไม่ได้มีส่วนเกี่ยวข้องกับภาษามากนักยกเว้นในขอบเขตที่การใช้งานใช้เวลารันไทม์ที่รองรับคุณสมบัติภาษาที่เกณฑ์มาตรฐานไม่ต้องการจริงๆ ในภาษาคอมไพเลอร์ส่วนใหญ่คอมไพเลอร์ที่ฉลาดเพียงพอในทางทฤษฎีสามารถตัดทอนสิ่งที่ไม่จำเป็นออกไปได้ แต่มีจุดที่คุณต้องใช้การสาธิตเนื่องจากมีผู้ใช้ภาษาจริงเพียงไม่กี่คนที่เขียนโปรแกรมที่ไม่ได้ใช้คุณสมบัตินั้น . การย้ายสิ่งต่างๆออกไปโดยไม่ลบออกทั้งหมด (เช่นการคาดการณ์ปลายทางการโทรเสมือนใน Java ที่คอมไพล์ด้วย JIT) เริ่มยุ่งยาก

FWIW การทดสอบเล็กน้อยของฉันกับ Go เมื่อฉันดูมัน (การวนซ้ำของการบวกจำนวนเต็มโดยทั่วไป) gccgo สร้างโค้ดไปยังจุดสิ้นสุดอย่างรวดเร็วของช่วงระหว่างgcc -O0และgcc -O2เทียบเท่า C Go ไม่ช้าโดยเนื้อแท้ แต่คอมไพเลอร์ยังไม่ทำทุกอย่าง แทบจะไม่น่าแปลกใจสำหรับภาษาที่เก่ากว่า 10 นาที


7
ยิ่งไปกว่านั้นอาจเป็นไปได้ว่าโปรแกรม Go ในเกมเกณฑ์มาตรฐานภาษาคอมพิวเตอร์นั้นไม่ได้รับการปรับให้เหมาะสมเท่ากับภาษา C และ Java
el.pescado

แล้วระหว่าง gcc -O0 กับ gcc -O3 ล่ะ? มีความตั้งใจที่จะให้คอมไพเลอร์ "ทำทุกอย่าง" หรือไม่?
igouy

@igouy: อืมฉันค่อนข้างมั่นใจว่า gccgo มีความตั้งใจที่จะเก็บขยะซึ่งตอนนี้มันยังไม่มี ยังคงมีคุณสมบัติบางอย่างที่จะเข้าสู่คอมไพเลอร์ g ด้วยเช่นในปัจจุบันพวกเขาไม่ได้ใช้เธรดโฮสต์ได้ดีโดยเฉพาะ (โดยเฉพาะตัวกำหนดตารางเวลา goroutine ไม่ใช่การล้างข้อมูลล่วงหน้า) นอกเหนือจากนั้นฉันไม่รู้แผนของ Google ว่าคอมไพเลอร์ g จะเพิ่มประสิทธิภาพอย่างดุเดือดหรือไม่หรือมีเพียง gccgo เท่านั้น
Steve Jessop

1
@xitrium: ฉันคิดว่าความตั้งใจของ Go คือการใช้งานไม่จำเป็นต้องกำหนดเวลาร่วมมือกันพวกเขาสามารถจองล่วงหน้าได้หากต้องการ ดูตัวอย่างเช่นcode.google.com/p/go/issues/detail?id=543ซึ่งไม่ได้ถูกปิดว่า "ไร้สาระการแก้ไขข้อบกพร่องที่เรียกว่านี้จะขัดแย้งกับคำจำกัดความของภาษา Go" ซึ่งควรเป็นหาก การใช้งาน Go ไม่ได้รับอนุญาตให้ทำการจองล่วงหน้า :-) ปัญหานี้ประกอบขึ้นจากข้อเท็จจริงที่ว่าโดยค่าเริ่มต้น Go ใช้เธรดโฮสต์เดียวเท่านั้นไม่ว่าจะมี goroutines กี่ตัวที่รันได้
Steve Jessop

6
คำตอบอาจจะล้าสมัยไปบ้างในตอนนี้ เมื่อเร็ว ๆ นี้เบต้าแรกของ Go 1.1 ได้รับการเผยแพร่โดยระบุว่าประสิทธิภาพของโปรแกรมที่คอมไพล์เพิ่มขึ้นประมาณ 30% ถึง 40% ใครก็ได้โปรดทำการทดสอบอีกครั้ง
fuz

51

ในคำถามที่พบบ่อยเกี่ยวกับGoรุ่นถัดไปควรมีสิ่งที่คล้ายกับสิ่งต่อไปนี้ปรากฏขึ้น

ประสิทธิภาพ

เหตุใด Go จึงทำงานได้ไม่ดีในเกณฑ์มาตรฐาน X

เป้าหมายการออกแบบอย่างหนึ่งของ Go คือการเข้าถึงประสิทธิภาพของ C สำหรับโปรแกรมที่เทียบเคียงกันได้ แต่ในเกณฑ์มาตรฐานบางอย่างก็ทำได้ไม่ดีนักรวมถึงหลายอย่างในการทดสอบ / เกณฑ์มาตรฐาน ช้าที่สุดขึ้นอยู่กับไลบรารีที่เวอร์ชันของประสิทธิภาพเทียบเคียงไม่มีใน Go ตัวอย่างเช่น pidigits ขึ้นอยู่กับแพ็กเกจคณิตศาสตร์แบบหลายความแม่นยำและเวอร์ชัน C ซึ่งแตกต่างจาก Go ใช้ GMP (ซึ่งเขียนในแอสเซมเบลอร์ที่ปรับให้เหมาะสม) เกณฑ์มาตรฐานที่ขึ้นอยู่กับนิพจน์ทั่วไป (เช่น regex-dna) โดยพื้นฐานแล้วจะเปรียบเทียบแพ็คเกจ regexp stopgap ของ Go กับไลบรารีนิพจน์ทั่วไปที่ได้รับการปรับให้เหมาะสมอย่างสมบูรณ์เช่น PCRE

เกมเกณฑ์มาตรฐานชนะได้จากการปรับแต่งที่กว้างขวางและเกณฑ์มาตรฐานส่วนใหญ่ของ Go ต้องให้ความสนใจ หากคุณวัดโปรแกรม C และ Go ที่เทียบเคียงกัน (reverse-complement เป็นตัวอย่างหนึ่ง) คุณจะเห็นว่าทั้งสองภาษามีประสิทธิภาพใกล้เคียงกันมากกว่าที่ชุดนี้จะระบุ

ยังมีช่องว่างสำหรับการปรับปรุง คอมไพเลอร์นั้นดี แต่อาจจะดีกว่านี้หลาย ๆ ไลบรารีต้องการผลงานที่สำคัญและตัวเก็บขยะก็ยังไม่เร็วพอ (แม้ว่าจะเป็นเช่นนั้นก็ตามการดูแลไม่ให้สร้างขยะที่ไม่จำเป็นอาจมีผลอย่างมาก)

และนี่คือรายละเอียดเพิ่มเติมเกี่ยวกับเกมเกณฑ์มาตรฐานคอมพิวเตอร์จากเธรดรายชื่ออีเมลล่าสุด

การเก็บขยะและประสิทธิภาพใน gccgo (1)

การเก็บขยะและประสิทธิภาพใน gccgo (2)

สิ่งสำคัญคือต้องทราบว่าเกมเกณฑ์มาตรฐานคอมพิวเตอร์เป็นเพียงเกม ผู้ที่มีประสบการณ์ในการวัดผลการปฏิบัติงานและการวางแผนกำลังการผลิตจะจับคู่อย่างรอบคอบเช่นเดียวกับปริมาณงานจริงและจริง พวกเขาไม่เล่นเกม


1
และนี่คือรายละเอียดบางส่วนจากชุดข้อความเดียวกับที่คุณได้ยกเว้นไว้ - groups.google.com/group/golang-nuts/msg/2e568d2888970308
igouy

3
สิ่งสำคัญคือต้องทราบว่า "เกณฑ์มาตรฐานเป็นเครื่องมือ" ไม่ใช่แค่เกณฑ์มาตรฐานที่เผยแพร่เป็นเกมมาตรฐานเท่านั้น - shootout.alioth.debian.org/flawed-benchmarks.php
igouy

18
(และทุกคน ... ) แน่นอนว่ามันเป็น"เกม"แต่เมื่อฉันเห็นว่า Go ช้ากว่าที่เร็วที่สุดในเกณฑ์มาตรฐานเหล่านี้เพียงสองเท่าความประทับใจแรกของฉันคือ"ว้าว Go ดูเหมือนเร็ว"เพราะฉันรู้ว่าเกณฑ์มาตรฐานเหล่านี้คือ มีข้อบกพร่อง. ในทางตรงกันข้ามเมื่อฉันเห็นทับทิมเป็นครั้งที่ 65 ช้ากว่าที่เร็วที่สุดที่ผมคิดกับตัวเอง"ไม่ gonna ใช้ทับทิมสำหรับความพยายามพร้อมกัน-ตัวเลขมากของฉันไป" ดังนั้นมันอาจจะเป็น "เกม" แต่ก็มีความจริงอยู่บ้างถ้าคุณใช้เกลือเม็ดหนึ่ง
SyntaxT3rr0r

การวางแผนกำลังการผลิตมีสิ่งสำคัญมาก: ต้นทุน ไม่ว่าคุณจะต้องการกล่อง X หรือ 2 * X สร้างความแตกต่างอย่างมากในตอนท้าย และเนื่องจากไม่มีใครสามารถประมาณได้ว่าจะเกิดอะไรขึ้นในอนาคตทางเลือกที่ดีที่สุดคือการดูปริมาณงานที่แตกต่างกัน ฉันได้ตรวจสอบการใช้งานบางส่วนแล้วและพบว่าส่วนใหญ่ใช้ได้ ฉันคิดว่าผลลัพธ์สามารถใช้เป็นฐานในการประมาณได้
Agoston Horvath

โดยทั่วไประบบในโลกแห่งความจริงจะถูก จำกัด โดย IO ไม่ใช่โดย CPU ดังนั้นไม่ว่า Go จะช้ากว่า 2x หรือ 5x ก็แทบจะไม่สร้างความแตกต่างให้กับการวางแผนกำลังการผลิตได้มากเท่ากับการเฟลโอเวอร์การโหลดบาลานซ์การแคชโทโพโลยีฐานข้อมูลและอื่น ๆ นี่คือเหตุผลว่าทำไมแอปที่มีขนาดเท่า YouTube จึงสามารถรันระบบจำนวนมากใน Python ได้
Sujoy Gupta

34

คำตอบของฉันไม่ได้เป็นเรื่องเชิงเทคนิคเหมือนของคนอื่น ๆ แต่ฉันคิดว่ามันยังเกี่ยวข้อง ฉันเห็นเกณฑ์มาตรฐานเดียวกันในเกมเกณฑ์มาตรฐานคอมพิวเตอร์เมื่อฉันตัดสินใจเริ่มเรียนรู้ Go แต่ฉันคิดตามตรงว่าเกณฑ์มาตรฐานสังเคราะห์ทั้งหมดเหล่านี้ไม่มีจุดหมายในแง่ของการตัดสินใจว่า Go นั้นเร็วพอสำหรับคุณหรือไม่

ฉันได้เขียนเซิร์ฟเวอร์ข้อความใน Python โดยใช้ Tornado + TornadIO + ZMQ เมื่อเร็ว ๆ นี้และสำหรับโครงการ Go แรกของฉันฉันตัดสินใจเขียนเซิร์ฟเวอร์ใหม่ใน Go จนถึงขณะนี้เซิร์ฟเวอร์มีฟังก์ชันการทำงานเดียวกันกับเวอร์ชัน Python การทดสอบของฉันแสดงให้ฉันเห็นว่าความเร็วเพิ่มขึ้น 4.7 เท่าในโปรแกรม Go โปรดทราบว่าฉันเขียนโค้ดใน Go เพียงแค่สัปดาห์เดียวเท่านั้นและฉันเขียนโค้ดใน Python มานานกว่า 5 ปีแล้ว

Go จะเร็วขึ้นเท่านั้นในขณะที่พวกเขาทำงานต่อไปและฉันคิดว่ามันขึ้นอยู่กับประสิทธิภาพของมันในแอปพลิเคชันในโลกแห่งความเป็นจริงและไม่ใช่เกณฑ์มาตรฐานการคำนวณเล็กน้อย สำหรับฉันเห็นได้ชัดว่า Go ส่งผลให้โปรแกรมมีประสิทธิภาพมากกว่าที่ฉันสามารถผลิตได้ใน Python นั่นคือคำตอบของฉันสำหรับคำถามนี้


3
คุณคิดว่าจะเขียน Go code ช้ากว่า Python แค่ไหน?
Erik Engheim

7
@AdamSmith - ฉันจะบอกว่าฉันจะเขียน Go code ได้ช้ากว่า Python เพียงเพราะฉันเข้ารหัส Python มา 7 ปีขึ้นไปและ Go เพียงเล็กน้อย แต่ในแง่ของ Go เทียบกับภาษาที่รวบรวมและพิมพ์แบบคงที่อื่น ๆ ฉันเดิมพันว่าฉันจะเขียน Go ได้เร็วกว่าภาษาอื่น โดยส่วนตัวแล้วฉันรู้สึกว่ามันเป็นสิ่งที่ใกล้เคียงที่สุดกับความเรียบง่ายของ Python ด้วยความเร็วระหว่าง C และ C ++
jdi

5
ฉันมีเรื่องราวที่คล้ายกัน ฉันเพิ่งเริ่มเรียนรู้ Go และตาม Benchmarks Game Go นั้นช้ากว่า JavaScript V8 ปรากฎว่าโปรแกรมของฉันที่มีการดำเนินการแบบไบนารีที่เข้มข้นทำงานได้เร็วขึ้น 10 เท่าด้วยรหัส Go ที่ไม่ได้เพิ่มประสิทธิภาพมากกว่าใน V8 VM ที่ปรับให้เหมาะสม Go อาจช้ากว่า C ในการดำเนินการหลายอย่าง แต่ไม่มีใครเขียนเว็บไซต์ใน C Go เป็นตัวเลือกที่ทำงานได้อย่างสมบูรณ์แบบอยู่แล้วและควรจะดีขึ้นเมื่อมีไลบรารีเฟรมเวิร์กและเครื่องมือใหม่ ๆ ปรากฏขึ้น
ถ้า __name__ ไม่มี

1
@ user962247 นี่เป็นคำพูดที่บ้าและผิด ฉันเขียน Go มาหลายปีแล้วและมันก็เร็วมาก ไม่มีใครอ้างว่ามันจะเอาชนะ C / C ++ / Java ในทุกเกณฑ์มาตรฐานสังเคราะห์ที่เป็นไปได้ แต่มันชนะในบางส่วน (ดูเว็บไซต์เกมมาตรฐาน) เอามาจากคนที่เขียน Production Go code มาหลายปีแล้ว รวดเร็วและมีประสิทธิผล
jdi


6

สิ่งต่างๆมีการเปลี่ยนแปลง

ฉันคิดว่าคำตอบที่ถูกต้องในปัจจุบันสำหรับคำถามของคุณคือการโต้แย้งความคิดที่ว่าไปช้า ในช่วงเวลาของการซักถามของคุณการตัดสินของคุณเป็นสิ่งที่ถูกต้อง แต่หลังจากนั้น go ก็ได้รับความสำคัญอย่างมากในแง่ของประสิทธิภาพ ตอนนี้มันยังไม่เร็วเท่า C แต่ไม่ใกล้จะช้ากว่า 10 เท่าในความหมายทั่วไป

เกมเกณฑ์มาตรฐานภาษาคอมพิวเตอร์

ในขณะที่เขียนนี้:

source  secs    KB      gz      cpu     cpu load

reverse-complement
1.167x
Go      0.49    88,320  1278    0.84    30% 28% 98% 34%
C gcc   0.42    145,900 812     0.57    0% 26% 20% 100%

pidigits
1.21x
Go      2.10    8,084   603 2.10    0% 100% 1% 1%
C gcc   1.73    1,992   448 1.73    1% 100% 1% 0%

fasta
1.45x
Go      1.97    3,456   1344    5.76    76% 71% 74% 73%
C gcc   1.36    2,800   1993    5.26    96% 97% 100% 97%

regex-dna
1.64x
Go      3.89    369,380 1229    8.29    43% 53% 61% 82%
C gcc   2.43    339,000 2579    5.68    46% 70% 51% 72%

fannkuch-redux
1.72x
Go      15.59   952 900 62.08   100% 100% 100% 100%
C gcc   9.07    1,576   910 35.43   100% 99% 98% 94%

spectral-norm
2x
Go      3.96    2,412   548 15.73   99% 99% 100% 99%
C gcc   1.98    1,776   1139    7.87    99% 99% 100% 99%

n-body
2.27x
Go      21.73   952 1310    21.73   0% 100% 1% 2%
C gcc   9.56    1,000   1490    9.56    1% 100% 1% 1%

k-nucleotide
2.40x
Go      15.48   149,276 1582    54.68   88% 97% 90% 79%
C gcc   6.46    130,076 1500    17.06   51% 37% 89% 88%

mandelbrot
3.19x
Go      5.68    30,756  894 22.56   100% 100% 99% 99%
C gcc   1.78    29,792  911 7.03    100% 99% 99% 98%

แม้ว่าจะต้องทนทุกข์ทรมานอย่างไร้ความปราณีในเกณฑ์มาตรฐานต้นไม้ไบนารี:

binary-trees
12.16x
Go      39.88   361,208 688 152.12  96% 95% 96% 96%
C gcc   3.28    156,780 906 10.12   91% 77% 59% 83%

ตอนนี้เทียบเท่ากับ Java แต่ Go ไม่ได้สร้างขึ้นอย่างชัดเจนเพื่อให้เร็วกว่า Java ในขณะที่ใช้สำหรับสิ่งเดียวกัน (แอปเครือข่ายฝั่งเซิร์ฟเวอร์)?
MaxB

1
@MaxB ไม่มันไม่ได้ถูกสร้างขึ้นโดยมีเป้าหมายให้เร็วกว่า Java มันถูกสร้างขึ้นโดยมีเป้าหมายเพื่อให้มีประสิทธิภาพที่ดีการรวบรวมที่เร็วกว่า C ++ และการทำงานพร้อมกันได้ง่ายขึ้นและเนทีฟเพื่อให้นักพัฒนาสามารถทำงานได้มากขึ้น การเอาชนะความเร็วรันไทม์ของภาษาอื่นไม่ได้เป็นปัจจัยผลักดัน
jdi

5

แม้ว่า Go จะมีประสิทธิภาพไม่ดีนักเกี่ยวกับการใช้งานรอบ CPU แต่โมเดลการทำงานพร้อมกันของ Go นั้นเร็วกว่าโมเดลเธรดใน Java มากและสามารถเทียบเคียงได้กับโมเดลเธรด C ++

โปรดทราบว่าในเกณฑ์มาตรฐานของเธรดริง Go เร็วกว่า Java 16 เท่า ในสถานการณ์เดียวกัน Go CSP เกือบจะเทียบได้กับ C ++ แต่ใช้หน่วยความจำน้อยกว่า 4 เท่า

พลังที่ยอดเยี่ยมของภาษา Go คือรูปแบบการทำงานพร้อมกันนั่นคือการสื่อสารตามลำดับกระบวนการ CSP ซึ่งระบุโดย Tony Hoare ในยุค 70 ซึ่งง่ายต่อการใช้งานและเหมาะสมกับความต้องการที่เกิดขึ้นพร้อมกันอย่างมาก


2

มีเหตุผลพื้นฐานสองประการที่ทำให้ Java เร็วกว่า Go และ C ++ และอาจเร็วกว่า C ในหลาย ๆ กรณี:

1) คอมไพเลอร์ JIT สามารถเรียกใช้ฟังก์ชันเสมือนแบบอินไลน์ผ่านหลายระดับแม้จะมีคลาส OO ก็ตามโดยอิงตามโปรไฟล์รันไทม์ สิ่งนี้ไม่สามารถทำได้ในภาษาที่คอมไพล์แบบสแตติก (แม้ว่าการคอมไพล์ใหม่ที่ใหม่กว่าตามโปรไฟล์ที่บันทึกไว้จะช่วยได้) สิ่งนี้สำคัญมากสำหรับการวัดประสิทธิภาพส่วนใหญ่ที่เกี่ยวข้องกับอัลกอริทึมซ้ำ ๆ

2) GC. การจัดสรรหน่วยความจำตาม GC นั้นแทบจะฟรีเมื่อเทียบกับ malloc และค่าปรับ 'ฟรี' สามารถตัดจำหน่ายได้ตลอดทั้งรันไทม์ซึ่งมักจะข้ามไปเนื่องจากโปรแกรมหยุดทำงานก่อนที่จะต้องรวบรวมขยะทั้งหมด

มีนักพัฒนาที่มีความสามารถสูงจำนวนหลายร้อย (หลายพันคน) ทำให้ GC / JVM มีประสิทธิภาพ การคิดว่าคุณสามารถ "เขียนโค้ดได้ดีกว่าทั้งหมด" ถือเป็นความโง่เขลา มันเป็นปัญหาอัตตาของมนุษย์ที่อยู่ในหัวใจ - มนุษย์มีช่วงเวลาที่ยากลำบากที่จะยอมรับว่าด้วยการฝึกฝนที่เหมาะสมโดยมนุษย์ที่มีความสามารถคอมพิวเตอร์จะทำงานได้ดีกว่ามนุษย์ที่ตั้งโปรแกรมไว้

Btw, C ++ สามารถเร็วเท่ากับ C ได้หากคุณไม่ได้ใช้และคุณสมบัติ OO แต่คุณก็ค่อนข้างใกล้เคียงกับการเขียนโปรแกรมใน C เพื่อเริ่มต้นด้วย

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

ในท้ายที่สุดผู้คนกล่าวถึง "เกมเกณฑ์มาตรฐานภาษาคอมพิวเตอร์" ว่าเป็น "การวัดผลทางวิทยาศาสตร์" การทดสอบมีข้อบกพร่องอย่างสมบูรณ์ตัวอย่างเช่นหากคุณดูการทดสอบ Java สำหรับ nbody เมื่อฉันเรียกใช้การทดสอบบน OS / ฮาร์ดแวร์เดียวกันฉันจะได้รับ Java ประมาณ 7.6 วินาทีและ 4.7 วินาทีสำหรับ C ซึ่งสมเหตุสมผลไม่ใช่ความช้า 4 เท่าที่รายงานการทดสอบ มันคือคลิกเหยื่อข่าวปลอมที่ออกแบบมาเพื่อสร้างการเข้าชมไซต์

ในที่สุดหมายเหตุสุดท้าย ... ฉันทำการทดสอบโดยใช้ Go และใช้เวลา 7.9 วินาที ความจริงที่ว่าเมื่อคุณคลิกที่ Go มันจะเปรียบเทียบกับ Java และเมื่อคุณคลิกที่ Java มันจะเปรียบเทียบกับ C ควรเป็นธงสีแดงกับวิศวกรที่จริงจัง

สำหรับการเปรียบเทียบในโลกแห่งความเป็นจริงของ Java, Go และ C ++ โปรดดูที่https://www.biorxiv.org/content/10.1101/558056v1 การแจ้งเตือนสปอยเลอร์ Java จะอยู่ในอันดับต้น ๆ ในด้านประสิทธิภาพแบบดิบโดย Go ออกมาด้านบนด้วยการใช้หน่วยความจำรวม และเวลาติดผนัง


ไม่ถูกต้อง. C ++ เร็วพอ ๆ กับ C โดยเฉพาะอย่างยิ่งเมื่อคุณใช้ OOP นั่นคือแผ่นสูติบัตรของเขา นามธรรมมากขึ้น (เช่นเดียวกับในชั้นเรียน) โดยไม่มีการปรับลดประสิทธิภาพการทำงานตลอดเวลาโดยมีหน่วยความจำไบต์พิเศษเป็นศูนย์ หากคุณไม่ทราบว่าให้ frolicking ด้วย java, c #, go, python, et cetera

// Btw, C ++ สามารถเร็วเท่ากับ C ได้หากคุณไม่ได้ใช้และคุณสมบัติ OO // แต่คุณก็ค่อนข้างใกล้เคียงกับการเขียนโปรแกรมใน C // เพื่อเริ่มต้นด้วย ถ้าคุณพูดอย่างนั้นคุณมีเงื่อนงำน้อยมากเกี่ยวกับ c ++ เพื่อประโยชน์ของคุณเองอย่าใช้มัน c และ c ++ เกลียดเวทมนตร์และจิตใจในยุคกลางเชื่อโชคลางโดยธรรมชาติเช่นโอ้ฉันได้ยินมาว่าอ่านทางอินเทอร์เน็ตมันต้องเป็นความจริง ... อยู่ห่างจาก c และ c ++ พวกเขาจะบายคุณกลับเพื่อนของฉัน (คำแนะนำที่ซื่อสัตย์)

c เป็นบรรพบุรุษของ c ++ หลายคนยังคงใช้มัน ... c ++ เป็น c ที่ดีกว่าซึ่งคุณสามารถทำได้มากขึ้นโดยไม่ต้องจ่ายราคา ผู้เขียน java, c # and go ไม่เข้าใจแน่นอนว่าพวกเขาทำได้ แต่พวกเขาทำอะไรได้บ้าง!? เช่นเดียวกันกับการเข้ากันได้กับรหัส (c) ที่มีอยู่ มหาสมุทรชีวิตจริงของรหัส c! python เป็นของเล่นที่ดีสนุกดีฉันหวังว่ามันจะถูกต้อง แต่ไม่ zen ของ python ควรเริ่มต้นด้วย "compiler is your friend" ...

>> แสดงการใช้งาน CPU ที่ 30% สำหรับโปรแกรม Java << ไม่ใช่ —— "1% 0% 0% 100%"
igouy

1
@igouy ฉันยอมรับว่านั่นเป็นข้อผิดพลาดที่ฉันอาจทำ - เมื่อฉันเห็นการโหลดฉันกำลังตีความในเงื่อนไข 'โหลดระบบ' และสมมติว่าผู้ใช้ / ระบบ / io / ไม่ได้ใช้งาน - ความผิดพลาดของฉันและมันเป็นข้อผิดพลาดที่สำคัญ
robert engels

1

ฉันคิดว่าข้อเท็จจริงที่มักถูกมองข้ามคือการคอมไพล์ JIT สามารถ> การคอมไพล์แบบคงที่โดยเฉพาะสำหรับฟังก์ชันหรือเมธอดที่ถูกผูกไว้ (รันไทม์) JIT ฮอตสปอตจะตัดสินใจที่ RUNTIME ว่าจะใช้วิธีใดในการอินไลน์แม้กระทั่งอาจปรับเค้าโครงข้อมูลตามขนาดแคช / สถาปัตยกรรมของ CPU ที่กำลังทำงานอยู่ C / C ++ โดยทั่วไปสามารถสร้างขึ้นได้ (และโดยรวมจะยังคงทำงานได้ดีกว่า) โดยการเข้าถึงฮาร์ดแวร์โดยตรง สิ่งต่างๆสำหรับ Go อาจดูแตกต่างออกไปเนื่องจากระดับสูงกว่าเมื่อเทียบกับ C แต่ในขณะนี้ยังขาดระบบ / คอมไพเลอร์การเพิ่มประสิทธิภาพรันไทม์ ลำไส้ของฉันบอกฉันว่า Go อาจเร็วกว่า Java เนื่องจาก Go ไม่บังคับใช้การไล่ตัวชี้มากขนาดนั้นและส่งเสริมให้โครงสร้างข้อมูลดีขึ้นในพื้นที่ + ต้องการการจัดสรรน้อยลง


1

ตามความเป็นจริง Go ไม่เพียง แต่สวยงามและมีประสิทธิภาพในเวลาออกแบบเท่านั้น แต่ยังมีประสิทธิภาพสูงในขณะทำงานอีกด้วย กุญแจสำคัญคือการใช้ระบบปฏิบัติการที่เหมาะสมเช่น LINUX ผลลัพธ์การทำโปรไฟล์ประสิทธิภาพภายใต้ Windows และ Mac OS นั้นหากไม่มีคำที่ดีกว่าคำสั่งที่มีขนาดต่ำกว่าหนึ่งหรือสองลำดับ


0

ภายใต้ linux รันไทม์ go นั้นเร็วมากเทียบได้กับ c / c ++ รันไทม์ go ภายใต้ windows และ unix ไม่ได้อยู่ในลีกเดียวกัน

การเปรียบเทียบกับ java นั้นไม่สำคัญนัก go มีไว้สำหรับการพัฒนาระบบและแอปพลิเคชัน (เนื่องจาก java เป็นเหมือน blue collar สำหรับการพัฒนาแอปพลิเคชันเท่านั้น) จะไม่ลงรายละเอียด แต่เมื่อมีการเขียนสิ่งต่างๆเช่น kubernetes คุณจะรู้ว่าไม่ใช่ของเล่นที่เป็นมิตรกับที่ปรึกษาขององค์กร

ฉันจำไม่ได้ว่า Google พูดถึงแม้แต่ครั้งเดียวเกี่ยวกับการประนีประนอมที่คุณอ้างถึง go คือการออกแบบที่ดีเรียบง่ายสง่างามและมีประสิทธิภาพสำหรับการออกแบบระบบและโปรแกรมระดับแอปพลิเคชันมีตัวชี้การจัดสรรหน่วยความจำที่มีประสิทธิภาพและการจัดสรรตำแหน่งหลีกเลี่ยงความยุ่งยากที่เกิดจากการสืบทอดการนำไปใช้งานที่พลาดง่ายทำให้คุณมีกิจวัตรร่วมและอื่น ๆ ที่ทันสมัย วิธีการเขียนแอปพลิเคชันประสิทธิภาพสูงในเวลาและงบประมาณ อีกครั้ง go นั้นเร็วมากภายใต้ linux ซึ่งเป็นสิ่งที่ออกแบบมาเพื่อ (มีความสุขมากที่ทำ)


-4

ทั้ง Java และ C มีความชัดเจนมากขึ้นด้วยคำจำกัดความของข้อมูลและวิธีการ (ฟังก์ชัน) C ถูกพิมพ์แบบคงที่และ Java น้อยกว่าด้วยโมเดลการสืบทอด ซึ่งหมายความว่าวิธีจัดการข้อมูลนั้นมีการกำหนดไว้ค่อนข้างมากในระหว่างการคอมไพล์

Go มีนัยยะมากกว่ากับข้อมูลและคำจำกัดความของฟังก์ชัน ฟังก์ชันในตัวมีลักษณะทั่วไปมากกว่าและการไม่มีลำดับชั้นประเภท (เช่น Java หรือ C ++) ทำให้ Go มีข้อเสียด้านความเร็ว

โปรดทราบว่าเป้าหมายของ Google สำหรับภาษา Go คือการประนีประนอมที่ยอมรับได้ระหว่างความเร็วในการดำเนินการและความเร็วในการเข้ารหัส ฉันคิดว่าพวกเขาประสบความสำเร็จในความพยายามครั้งแรกและสิ่งต่างๆจะดีขึ้นเมื่อทำงานเสร็จมากขึ้นเท่านั้น

หากคุณเปรียบเทียบ Go กับภาษาที่พิมพ์แบบไดนามิกมากกว่าซึ่งข้อได้เปรียบหลักคือความเร็วในการเขียนโค้ดคุณจะเห็นข้อได้เปรียบด้านความเร็วในการดำเนินการของ Go Go เร็วกว่า perl 8 เท่าและเร็วกว่า Ruby 1.9 และ Python 3 ถึง 6 เท่าในเกณฑ์มาตรฐานที่คุณใช้

อย่างไรก็ตามคำถามที่ดีกว่าที่จะถามคือ Go เป็นการประนีประนอมที่ดีในความสะดวกในการเขียนโปรแกรมเทียบกับความเร็วในการดำเนินการหรือไม่? คำตอบของฉันคือใช่และควรจะดีขึ้น


20
"การขาดลำดับชั้นประเภท (เช่น Java หรือ C ++) ทำให้ Go มีข้อเสียด้านความเร็ว" --wut?
Erik Kaplun

6
"Go มีความหมายมากกว่าคำจำกัดความของข้อมูลและฟังก์ชัน" ไม่ถูกต้อง คุณหมายถึงประเภทที่สามารถใช้วิธีการโดยไม่ต้องอธิบายเกี่ยวกับมันได้อย่างไร? คอมไพเลอร์ตรวจพบชนิด - การเป็นสมาชิกส่วนต่อประสาน เร็วขนาดนี้ "ฟังก์ชั่นในตัวมีลักษณะทั่วไปมากกว่า" ไม่บิลด์อินก็เหมือนอย่างอื่นที่คอมไพล์ สิ่งเดียวกันเกิดขึ้นกับเทมเพลต C ++ "การไม่มีลำดับชั้นประเภท (เช่น Java หรือ C ++) ทำให้ Go มีข้อเสียด้านความเร็ว" - ไม่ถูกต้องลำดับชั้นประเภทไม่มีส่วนเกี่ยวข้องกับการรันรันไทม์
Malcolm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.