Tại sao Go quá chậm (so với Java)?


109

Như chúng ta có thể thấy từ Trò chơi Điểm chuẩn Ngôn ngữ Máy tính năm 2010:

  • Go trung bình chậm hơn 10 lần so với C
  • Go chậm hơn Java gấp 3 lần !?

Làm thế nào điều này có thể được, hãy nhớ rằng trình biên dịch Go tạo ra mã gốc để thực thi?
Trình biên dịch chưa hoàn thiện cho Go? Hoặc có một số vấn đề nội tại với ngôn ngữ cờ vây?

CHỈNH SỬA:
Hầu hết các câu trả lời đều phủ nhận sự chậm chạp nội tại của Go wear, cho rằng vấn đề nằm ở các trình biên dịch chưa trưởng thành.
Do đó, tôi đã thực hiện một số thử nghiệm riêng để tính toán số Fibonacci : Thuật toán lặp lại chạy trong Go (freebsd, 6g) với sametốc độ như trong C (với tùy chọn O3). Đệ quy buồn tẻ chạy trong Go 2 timeschậm hơn trong C (với tùy chọn -O3; với -O0 - giống nhau). Nhưng tôi chưa thấy giảm 10 lần như trong Trò chơi điểm chuẩn.


36
Công bằng mà nói, C là ASM ngụy tạo, và Java có một số tối ưu hóa nghiêm trọng ngày nay.
Matthew Scharley

16
Có lẽ điểm chuẩn cũng không phản ánh điểm mạnh của cờ vây. Có thể là các điểm chuẩn khác thực sự nhanh hơn điểm này. Bên cạnh đó, thường không phải là hiệu suất mà là khả năng đọc của mã mới quan trọng nhất.
extraneon vào

7
@extraneon: Tôi đồng ý. Hãy nhớ rằng, Go được thiết kế cho Google và Google thường chạy mã trên 2 triệu lõi. Tôi tin là Game Benchmarks chỉ sử dụng 4 lõi.
Jörg W Mittag

4
@extraneon: Nhìn chung, tôi đồng ý, nhưng Go được thiết kế đặc biệt với tốc độ, vì "các chương trình kết quả chạy gần như nhanh bằng mã C hoặc C ++ tương đương."
shosti

4
Câu hỏi của bạn giả định quá nhiều: "Hầu hết các câu trả lời đều phủ nhận sự chậm chạp nội tại của cờ vây" là một cụm từ không chính xác để sử dụng trong một câu hỏi. Bạn có một câu hỏi để hỏi, hoặc một tuyên bố để thực hiện? Vui lòng xem c2.com/cgi/wiki?HostileStudent để hiểu lỗi của bạn.
Chris

Câu trả lời:


102

Các trình biên dịch 6g và 8g không đặc biệt tối ưu hóa, vì vậy mã mà chúng tạo ra không đặc biệt nhanh.

Chúng được thiết kế để tự chạy nhanh và tạo ra mã ổn (có một chút tối ưu hóa). gccgosử dụng các thẻ tối ưu hóa hiện có của GCC và có thể cung cấp một so sánh hữu ích hơn với C, nhưng gccgo vẫn chưa hoàn thiện về tính năng.

Số liệu điểm chuẩn gần như hoàn toàn về chất lượng thực hiện. Chúng không liên quan nhiều đến ngôn ngữ như vậy, ngoại trừ mức độ triển khai dành thời gian chạy để hỗ trợ các tính năng ngôn ngữ mà điểm chuẩn không thực sự cần. Trong hầu hết các ngôn ngữ đã biên dịch, một trình biên dịch đủ thông minh về lý thuyết có thể loại bỏ những gì không cần thiết, nhưng có một điểm là bạn đang gian lận bản trình diễn, vì rất ít người dùng thực sự của ngôn ngữ này sẽ viết các chương trình không sử dụng tính năng đó . Di chuyển mọi thứ ra khỏi đường đi mà không loại bỏ chúng hoàn toàn (ví dụ như dự đoán các điểm đến cuộc gọi ảo trong Java do JIT biên dịch) bắt đầu trở nên khó khăn.

FWIW, thử nghiệm rất nhỏ của tôi với Go khi tôi xem xét nó (về cơ bản là một vòng lặp của phép cộng số nguyên), gccgo đã tạo ra mã về phía cuối nhanh của phạm vi giữa gcc -O0gcc -O2tương đương C. Go vốn dĩ không chậm, nhưng các trình biên dịch vẫn chưa làm được mọi thứ. Hầu như không đáng ngạc nhiên đối với một ngôn ngữ có tuổi đời 10 phút.


7
Hơn nữa, có thể các chương trình cờ vây trong Trò chơi điểm chuẩn ngôn ngữ máy tính không được tối ưu hóa như chương trình C và Java.
el.pescado

Còn giữa gcc -O0 và gcc -O3 thì sao? Thậm chí có ý định rằng các trình biên dịch sẽ "làm mọi thứ"?
igouy

@igouy: tốt, tôi khá chắc rằng gccgo có ý định thu gom rác, nhưng hiện tại thì không. Vẫn còn một số tính năng được đưa vào trình biên dịch g, chẳng hạn như chúng hiện không sử dụng đặc biệt tốt các luồng máy chủ (cụ thể là trình lập lịch trình goroutine không có tính năng ưu tiên). Ngoài ra, tôi không biết các kế hoạch của Google, liệu các trình biên dịch g sẽ tối ưu hóa dữ dội hay chỉ gccgo mới làm được.
Steve Jessop

1
@xitrium: Tôi nghĩ mục đích của Go là việc triển khai không bắt buộc phải lên lịch cùng hoạt động, họ có thể kết thúc trước nếu muốn. Xem ví dụ: code.google.com/p/go/issues/detail?id=543 , chưa bị đóng là "vô lý, việc sửa cái gọi là lỗi này sẽ mâu thuẫn với định nghĩa ngôn ngữ Go", điều này sẽ xảy ra nếu Việc triển khai Go bị cấm trước :-) Vấn đề phức tạp hơn là theo mặc định Go chỉ sử dụng một luồng máy chủ duy nhất cho dù có bao nhiêu goroutines có thể chạy được.
Steve Jessop

6
Câu trả lời có thể đã lỗi thời một chút kể từ bây giờ. Gần đây, bản beta đầu tiên của Go 1.1 đã được phát hành , họ nói rằng hiệu suất của các chương trình đã biên dịch tăng khoảng 30% đến 40%. Ai đó làm ơn làm lại các bài kiểm tra này.
fuz

51

Trong bản phát hành tiếp theo của Câu hỏi thường gặp về Go , một cái gì đó tương tự như sau sẽ xuất hiện.

Hiệu suất

Tại sao Go hoạt động không tốt trên điểm chuẩn X?

Một trong những mục tiêu thiết kế của Go là tiếp cận hiệu suất của C cho các chương trình tương đương, tuy nhiên trên một số điểm chuẩn, nó hoạt động khá kém, bao gồm một số điểm trong thử nghiệm / điểm chuẩn. Tốc độ chậm nhất phụ thuộc vào các thư viện mà phiên bản của hiệu suất tương đương không có sẵn trong Go. Ví dụ: pidigits phụ thuộc vào một gói toán học đa độ chính xác và các phiên bản C, không giống như Go, sử dụng GMP (được viết bằng trình hợp dịch tối ưu hóa). Các điểm chuẩn phụ thuộc vào biểu thức chính quy (ví dụ: regex-dna) về cơ bản là so sánh gói stopgap regexp của Go với các thư viện biểu thức chính quy hoàn thiện, được tối ưu hóa cao như PCRE.

Các trò chơi điểm chuẩn chiến thắng bằng cách điều chỉnh rộng rãi và các phiên bản cờ vây của hầu hết các điểm chuẩn cần được chú ý. Nếu bạn đo lường các chương trình C và Go có thể so sánh được (bổ sung ngược là một ví dụ), bạn sẽ thấy hai ngôn ngữ có hiệu suất thô gần hơn nhiều so với bộ này sẽ chỉ ra.

Tuy nhiên, vẫn còn chỗ để cải thiện. Các trình biên dịch tốt nhưng có thể tốt hơn, nhiều thư viện cần hoạt động hiệu suất lớn và trình thu gom rác vẫn chưa đủ nhanh (ngay cả khi đã có, việc cẩn thận không tạo ra các rác không cần thiết có thể gây ảnh hưởng rất lớn).

Và đây là một số chi tiết khác về Trò chơi Điểm chuẩn Máy tính từ chuỗi danh sách gửi thư gần đây.

Thu gom và thực hiện rác trong gccgo (1)

Thu gom và thực hiện rác trong gccgo (2)

Điều quan trọng cần lưu ý là Game Benchmarks Máy tính chỉ là một trò chơi. Những người có kinh nghiệm về đo lường hiệu suất và lập kế hoạch năng lực phù hợp một cách cẩn thận giống như với khối lượng công việc thực tế và thực tế; họ không chơi trò chơi.


1
Và đây là một số chi tiết từ cùng một chủ đề mà bạn đã loại trừ - groups.google.com/group/golang-nuts/msg/2e568d2888970308
igouy

3
Điều quan trọng cần lưu ý là "điểm chuẩn là một kẻ gian" - không chỉ điểm chuẩn được công bố dưới dạng trò chơi điểm chuẩn - shootout.alioth.debian.org/flawed-benchmarks.php
igouy

18
(và mọi người ...) Chắc chắn đó là một "trò chơi" , nhưng khi tôi thấy cờ vây chỉ chậm hơn hai lần so với tốc độ nhanh nhất trên các điểm chuẩn này, ấn tượng đầu tiên của tôi là "ồ, cờ vây có vẻ nhanh" , bởi vì tôi biết các điểm chuẩn này là thiếu sót. Ngược lại, khi tôi thấy Ruby chậm hơn 65 lần so với tốc độ nhanh nhất, tôi tự nghĩ "sẽ không sử dụng Ruby cho nỗ lực đồng thời-chuyên sâu về số lượng tiếp theo của tôi" . Vì vậy, nó có thể là một "trò chơi", nhưng có một số sự thật trong đó nếu bạn coi nó như một hạt muối.
Cú phápT3rr0r

Hoạch định năng lực có một khía cạnh rất quan trọng: chi phí. Cho dù cuối cùng bạn sẽ cần hộp X hay 2 * X tạo ra sự khác biệt rất lớn. Và vì không ai có thể ước tính những gì sẽ chạy trong tương lai trên những thứ đó, cách tốt nhất là hãy xem xét các khối lượng công việc khác nhau. Tôi đã kiểm tra một vài cách triển khai trong số này và thấy chúng hầu hết đều ổn. Tôi nghĩ rằng kết quả có thể được sử dụng làm cơ sở để ước tính.
Agoston Horvath

Nói chung, các hệ thống trong thế giới thực bị hạn chế bởi IO chứ không phải bởi CPU. Do đó, dù Go là 2x hay 5x chậm hơn hầu như không tạo ra sự khác biệt nhiều đối với việc lập kế hoạch dung lượng như chuyển đổi dự phòng, cân bằng tải, bộ nhớ đệm, cấu trúc liên kết cơ sở dữ liệu và những thứ tương tự. Đây là lý do tại sao các ứng dụng ở quy mô của YouTube có thể đủ khả năng chạy nhiều hệ thống của họ bằng Python.
Sujoy Gupta

34

Câu trả lời của tôi không hoàn toàn kỹ thuật như những người khác, nhưng tôi nghĩ nó vẫn có liên quan. Tôi đã thấy cùng một điểm chuẩn trên Trò chơi điểm chuẩn trên máy tính khi tôi quyết định bắt đầu học cờ vây. Nhưng tôi thành thật nghĩ rằng tất cả những điểm chuẩn tổng hợp này đều vô nghĩa trong việc quyết định xem cờ vây có đủ nhanh cho bạn hay không.

Gần đây, tôi đã viết một máy chủ tin nhắn bằng Python bằng Tornado + TornadIO + ZMQ và đối với dự án Go đầu tiên của mình, tôi đã quyết định viết lại máy chủ trong Go. Cho đến nay, khi đã đưa máy chủ về chức năng tương tự như phiên bản Python, các thử nghiệm của tôi cho thấy tốc độ tăng gấp 4,7 lần trong chương trình Go. Xin lưu ý bạn, tôi chỉ mới viết mã bằng Go được một tuần, và tôi đã viết mã bằng Python hơn 5 năm.

Go chỉ sẽ nhanh hơn khi họ tiếp tục làm việc với nó, và tôi nghĩ rằng nó thực sự phụ thuộc vào cách nó hoạt động trong một ứng dụng thế giới thực chứ không phải các điểm chuẩn tính toán nhỏ. Đối với tôi, Go dường như dẫn đến một chương trình hiệu quả hơn những gì tôi có thể tạo ra bằng Python. Đó là câu trả lời của tôi cho câu hỏi này.


3
Bạn nghĩ mình viết mã Go chậm hơn Python bao nhiêu?
Erik Engheim

7
@AdamSmith - Tôi sẽ nói rằng tôi sẽ viết mã Go chậm hơn Python chỉ vì tôi đã viết mã Python hơn 7 năm và chỉ có một chút cờ vây. Nhưng xét về cờ vây so với các ngôn ngữ biên dịch, được nhập tĩnh khác, tôi cá rằng mình sẽ viết cờ vây nhanh hơn những ngôn ngữ khác. Cá nhân tôi cảm thấy nó là thứ gần nhất với sự đơn giản của Python với tốc độ giữa C và C ++
jdi

5
Tôi có câu chuyện tương tự. Tôi mới bắt đầu học cờ vây và theo Benchmarks Game, cờ vây CHẬM hơn JavaScript V8. Hóa ra chương trình hoạt động nhị phân cường độ cao của tôi chạy nhanh hơn 10 lần với mã Go chưa được tối ưu hóa so với trong máy ảo V8 được tối ưu hóa cao. Go có thể chậm hơn C trong nhiều thao tác, tuy nhiên không ai viết trang web bằng C. Go đã là một lựa chọn hoàn toàn khả thi và sẽ chỉ trở nên tốt hơn, khi các thư viện, khuôn khổ và công cụ mới xuất hiện.
if __name__ is Không có

1
@ user962247 đây là một tuyên bố điên rồ và sai lầm. Tôi đã viết Go trong nhiều năm nay và nó đang rất nhanh. Không ai khẳng định nó sẽ đánh bại C / C ++ / Java trên mọi điểm chuẩn tổng hợp có thể. Nhưng nó thắng trên một số (xem trang web trò chơi điểm chuẩn). Lấy nó từ một người đã thực sự viết mã Go sản xuất trong nhiều năm. Nó nhanh chóng và hiệu quả.
'19


6

Mọi thứ đã thay đổi.

Tôi nghĩ câu trả lời chính xác hiện tại cho câu hỏi của bạn là phản bác quan điểm rằng đi là chậm. Tại thời điểm điều tra của bạn, nhận định của bạn là chính đáng, nhưng go đã đạt được rất nhiều cơ sở về hiệu suất. Bây giờ, nó vẫn chưa nhanh bằng C, nhưng không phải là chậm hơn 10 lần, theo nghĩa chung.

Trò chơi điểm chuẩn ngôn ngữ máy tính

Tại thời điểm viết bài này:

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%

Mặc dù vậy, nó bị ảnh hưởng nghiêm trọng trên tiêu chuẩn cây nhị phân:

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%

Bây giờ nó ngang bằng với Java, nhưng Go không được tạo ra một cách rõ ràng để nhanh hơn Java, trong khi được sử dụng cho những thứ tương tự (ứng dụng mạng phía máy chủ)?
MaxB

1
@MaxB không, nó không được tạo ra với mục tiêu nhanh hơn Java. Nó được tạo ra với mục tiêu có hiệu suất tốt, biên dịch nhanh hơn C ++, đồng thời dễ dàng hơn và đồng thời nguyên bản để cho phép các nhà phát triển làm việc hiệu quả hơn. Đánh bại tốc độ thời gian chạy của các ngôn ngữ khác không phải là một yếu tố thúc đẩy.
jdi

5

Mặc dù hiệu quả không tốt của Go về việc sử dụng chu kỳ CPU, ví dụ, mô hình đồng thời Go nhanh hơn nhiều so với mô hình luồng trong Java và có thể so sánh với mô hình luồng C ++.

Lưu ý rằng trong tiêu chuẩn vòng chuỗi , Go là 16x nhanh hơn so với Java. Trong cùng một kịch bản, Go CSP gần như tương đương với C ++, nhưng sử dụng ít bộ nhớ hơn 4 lần.

Sức mạnh tuyệt vời của ngôn ngữ cờ vây là mô hình đồng thời của nó, Giao tiếp các quy trình tuần tự, CSP, được Tony Hoare chỉ định vào năm 70, rất dễ thực hiện và phù hợp với các nhu cầu đồng thời cao.


2

Có hai lý do cơ bản khiến Java nhanh hơn Go và C ++, và có thể nhanh hơn C trong nhiều trường hợp:

1) Trình biên dịch JIT. Nó có thể nội tuyến các cuộc gọi hàm ảo qua nhiều cấp, ngay cả với các lớp OO, dựa trên cấu hình thời gian chạy. Điều này là không thể trong một ngôn ngữ được biên dịch tĩnh (mặc dù việc biên dịch lại mới hơn dựa trên hồ sơ đã ghi có thể giúp ích). Điều này rất quan trọng đối với hầu hết các điểm chuẩn liên quan đến các thuật toán lặp lại.

2) GC. Phân bổ bộ nhớ dựa trên GC gần như miễn phí, so với malloc. Và hình phạt 'miễn phí' có thể được khấu hao trong toàn bộ thời gian chạy - thường bị bỏ qua vì chương trình kết thúc trước khi tất cả rác cần được thu gom.

Có hàng trăm (hàng nghìn?) Các nhà phát triển cực kỳ tài năng đang làm cho GC / JVM trở nên hiệu quả. Nghĩ rằng bạn có thể "viết mã tốt hơn tất cả chúng" là một điều ngu ngốc. Đó là vấn đề về bản ngã của con người - con người khó chấp nhận rằng với sự đào tạo thích hợp bởi những con người tài năng, máy tính sẽ hoạt động tốt hơn con người đã lập trình nó.

Btw, C ++ có thể nhanh như C nếu bạn không sử dụng và các tính năng OO, nhưng sau đó bạn đã khá gần với việc chỉ lập trình bằng C để bắt đầu.

Quan trọng nhất, "sự khác biệt về tốc độ" trong các bài kiểm tra này thường là vô nghĩa. Chi phí IO là những đơn hàng có mức độ lớn hơn sự khác biệt về hiệu suất, và do đó những thiết kế phù hợp để giảm thiểu chi phí IO luôn giành được chiến thắng - ngay cả trong một ngôn ngữ thông dịch. Rất ít hệ thống bị ràng buộc bởi CPU.

Lưu ý cuối cùng, mọi người gọi "trò chơi điểm chuẩn ngôn ngữ máy tính" như một "thước đo khoa học". Các bài kiểm tra hoàn toàn thiếu sót, Ví dụ: nếu bạn xem các bài kiểm tra Java cho nbody. Khi tôi chạy các bài kiểm tra trên cùng một hệ điều hành / phần cứng, tôi nhận được khoảng 7,6 giây đối với Java và 4,7 giây đối với C - điều này là hợp lý - chứ không phải là 4 lần độ chậm mà các bài kiểm tra báo cáo. Nó là mồi nhấp chuột, tin tức giả, được thiết kế để tạo ra lưu lượng truy cập trang web.

Cuối cùng, ghi chú cuối cùng ... Tôi đã chạy các bài kiểm tra bằng cách sử dụng Go, và nó là 7,9 giây. Thực tế là khi bạn nhấp vào Go, nó sẽ so sánh nó với Java và khi bạn nhấp vào Java, nó sẽ so sánh nó với C, sẽ là một lá cờ đỏ đối với bất kỳ kỹ sư nghiêm túc nào.

Để so sánh thực tế về Java, Go và C ++, hãy xem https://www.biorxiv.org/content/10.1101/558056v1 cảnh báo spoiler, Java xuất hiện hàng đầu về hiệu suất thô, với Go đi đầu với việc sử dụng bộ nhớ kết hợp và thời gian tường.


Sai lầm. C ++ IS nhanh như C, đặc biệt là khi bạn sử dụng OOP, đó là giấy khai sinh của anh ấy. trừu tượng hơn (như trong các lớp) MÀ KHÔNG CÓ BẤT CỨ XÉT ĐỒ HIỆU SUẤT RUNTIME NÀO, KHÔNG CÓ BỘ NHỚ NGOÀI TRỜI. nếu bạn không biết điều đó, hãy tiếp tục vui đùa với java, c #, go, python, v.v.

// Btw, C ++ có thể nhanh như C nếu bạn không sử dụng và các tính năng // OO, nhưng bạn đã khá gần với việc chỉ lập trình bằng C // để bắt đầu. Nếu bạn nói điều đó, bạn có rất ít manh mối về c ++, vì lợi ích của riêng bạn, đừng sử dụng nó. c và c ++ ghét ma thuật và đầu óc thời trung cổ, bản chất mê tín dị đoan, kiểu như ôi nghe nói vậy, đọc trên mạng chắc là đúng ... tránh xa c và c ++ ra, họ sẽ đánh bạn lại bạn của tôi (lời khuyên chân thành)

c là tổ tiên của c ++. nhiều người vẫn sử dụng nó ... c ++ là một c tốt hơn, nơi bạn có thể làm được nhiều việc hơn mà không phải trả giá. các tác giả java, c # và go đã không nhận được nó, tất nhiên, họ đã làm, nhưng họ có thể làm gì?!? tương tự về việc tương thích với mã (c) hiện có. đại dương cuộc sống thực của mã c! python là một món đồ chơi đẹp, hãy tận hưởng, tôi ước gì họ làm đúng, nhưng nah, zen của python nên bắt đầu bằng "trình biên dịch là bạn của bạn" ...

>> hiển thị mức sử dụng CPU ở mức 30% cho chương trình Java << Không —— "1% 0% 0% 100%".
igouy 27/02/19

1
@igouy Tôi thừa nhận rằng đó là lỗi mà tôi có thể mắc phải - khi tôi thấy tải, tôi đang diễn giải theo thuật ngữ 'tải hệ thống' và giả sử rằng, người dùng / hệ thống / io / nhàn rỗi - lỗi của tôi và đó là một lỗi nghiêm trọng.
robert tham gia

1

Tôi nghĩ rằng một thực tế thường bị bỏ qua là, biên dịch JIT có thể là> biên dịch tĩnh, đặc biệt cho các hàm hoặc phương thức bị ràng buộc muộn (thời gian chạy). Hotspot JIT quyết định tại RUNTIME phương pháp nào để nội tuyến, thậm chí nó có thể điều chỉnh bố cục dữ liệu theo kích thước / kiến ​​trúc bộ nhớ cache của CPU mà nó hiện đang chạy. C / C ++ nói chung có thể tạo nên (và tổng thể vẫn sẽ hoạt động tốt hơn) bằng cách truy cập trực tiếp vào phần cứng. Đối với Go, mọi thứ có thể trông khác vì nó cao cấp hơn so với C, nhưng hiện thiếu hệ thống / trình biên dịch tối ưu hóa thời gian chạy. Ruột của tôi nói với tôi, Go thể nhanh hơn Java vì Go không thực thi việc đuổi theo con trỏ nhiều như vậy và khuyến khích địa phương cấu trúc dữ liệu tốt hơn + yêu cầu ít phân bổ hơn.


1

Trên thực tế, cờ vây không chỉ thanh lịch và hiệu quả ở thời điểm thiết kế, mà còn siêu hiệu quả trong thời gian chạy. Điều quan trọng là sử dụng đúng hệ điều hành tức là LINUX. Kết quả lập hồ sơ hiệu suất trong Windows và Mac OS, thiếu một từ hay hơn, kém hơn một hoặc hai bậc về độ lớn.


0

trong linux, thời gian chạy go siêu nhanh, hoàn toàn có thể so sánh với c / c ++. thời gian chạy dưới windows và unix không ở cùng một giải đấu

so sánh với java không quá quan trọng, đi dành cho cả phát triển hệ thống và ứng dụng (vì java giống như cổ áo xanh chỉ dành cho phát triển ứng dụng). sẽ không đi vào chi tiết, nhưng khi những thứ như kubernetes được viết sẵn, bạn nhận ra rằng đó không phải là một món đồ chơi thân thiện với nhà tư vấn doanh nghiệp

Tôi không nhớ google đã đề cập đến dù chỉ một lần về thỏa hiệp mà bạn đề cập đến. go là thiết kế tốt, đơn giản, thanh lịch và hiệu quả để thiết kế các chương trình cấp hệ thống và ứng dụng, có con trỏ, phân bổ bộ nhớ hiệu quả và phân bổ giao dịch, tránh các biến chứng phát sinh do quá trình kế thừa triển khai dễ dàng bỏ lỡ, mang lại cho bạn các quy trình đồng thời và các cách viết các ứng dụng hiệu suất cao trong thời gian và ngân sách. một lần nữa, go cực nhanh trong linux, đó là chính xác những gì nó được thiết kế cho (rất vui vì nó làm được)


-4

Cả Java và C đều rõ ràng hơn với các định nghĩa về dữ liệu và phương thức (hàm) của chúng. C được nhập tĩnh, và Java thì ít như vậy với mô hình kế thừa của nó. Điều này có nghĩa là cách dữ liệu sẽ được xử lý được xác định khá nhiều trong quá trình biên dịch.

Go tiềm ẩn hơn với các định nghĩa về dữ liệu và chức năng của nó. Các hàm tích hợp sẵn có bản chất tổng quát hơn, và việc thiếu hệ thống phân cấp kiểu (như Java hoặc C ++) khiến Go gặp bất lợi về tốc độ.

Hãy nhớ rằng mục tiêu của Google đối với ngôn ngữ cờ vây là có được sự thỏa hiệp có thể chấp nhận được giữa tốc độ thực thi và tốc độ viết mã. Tôi nghĩ rằng họ đang đạt được một điểm tốt trong nỗ lực ban đầu của họ và mọi thứ sẽ chỉ được cải thiện khi nhiều công việc được hoàn thành hơn.

Nếu bạn so sánh Go với các ngôn ngữ được gõ động hơn có lợi thế chính là tốc độ viết mã, bạn sẽ thấy lợi thế về tốc độ thực thi của Go. Go nhanh hơn 8 lần so với perl và nhanh hơn 6 lần so với Ruby 1.9 và Python 3 trên những điểm chuẩn bạn đã sử dụng.

Dù sao câu hỏi tốt hơn để hỏi là Go có thỏa hiệp tốt giữa tính dễ lập trình so với tốc độ thực thi không? Câu trả lời của tôi là có và nó sẽ trở nên tốt hơn.


20
"việc thiếu hệ thống phân cấp kiểu (như Java hoặc C ++) khiến Go gặp bất lợi về tốc độ" - vậy sao?
Erik Kaplun

6
"Go ẩn ý hơn với các định nghĩa về dữ liệu và chức năng của nó." Sai. Ý của bạn là làm thế nào các kiểu có thể triển khai các phương thức mà không bị hiểu rõ về nó? Trình biên dịch phát hiện loại - thành viên giao diện. Điều này là nhanh chóng. "Các hàm được xây dựng có bản chất tổng quát hơn" không, các hàm nội trang, giống như mọi thứ khác, được biên dịch. Điều tương tự cũng xảy ra với các mẫu C ++. "việc thiếu hệ thống phân cấp kiểu (như Java hoặc C ++) khiến Go gặp bất lợi về tốc độ" - không chính xác, hệ thống phân cấp kiểu không liên quan gì đến việc thực thi thời gian chạy.
Malcolm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.