Tôi sợ tôi "làm sai" ở đây, nếu vậy hãy xóa tôi và tôi xin lỗi. Cụ thể, tôi không thấy cách tôi tạo các chú thích nhỏ gọn mà một số người đã tạo. Tuy nhiên, tôi có nhiều mối quan tâm / quan sát để thực hiện về chủ đề này.
1) Phần tử nhận xét trong mã giả trong một trong những câu trả lời phổ biến
result = query( "select smurfs from some_mushroom" );
// twiddle fingers
go_do_something_with_result( result );
thực chất là không có thật. Nếu luồng là điện toán, thì nó không phải là ngón tay cái, nó đang làm việc cần thiết. Mặt khác, nếu chỉ chờ đợi hoàn thành IO, thì nó không sử dụng thời gian của CPU, toàn bộ cơ sở hạ tầng điều khiển luồng trong kernel là CPU sẽ tìm ra thứ gì đó hữu ích để làm. Cách duy nhất để "xoay ngón tay cái" như được đề xuất ở đây là tạo ra một vòng bỏ phiếu và không ai đã mã hóa một máy chủ web thực sự là đủ để làm điều đó.
2) "Chủ đề khó", chỉ có ý nghĩa trong bối cảnh chia sẻ dữ liệu. Nếu bạn có các luồng độc lập cơ bản như trường hợp khi xử lý các yêu cầu web độc lập, thì việc phân luồng rất đơn giản, bạn chỉ cần mã hóa luồng tuyến tính về cách xử lý một công việc và ngồi yên khi biết rằng nó sẽ xử lý nhiều yêu cầu và mỗi yêu cầu sẽ độc lập hiệu quả. Cá nhân, tôi sẽ mạo hiểm rằng đối với hầu hết các lập trình viên, việc học cơ chế đóng / gọi lại phức tạp hơn đơn giản là mã hóa phiên bản luồng từ trên xuống dưới. (Nhưng vâng, nếu bạn phải giao tiếp giữa các luồng, cuộc sống trở nên rất khó khăn rất nhanh, nhưng sau đó tôi không tin rằng cơ chế đóng / gọi lại thực sự thay đổi điều đó, nó chỉ giới hạn các tùy chọn của bạn, bởi vì cách tiếp cận này vẫn có thể đạt được với các luồng Dù sao đi nữa, đó '
3) Cho đến nay, không ai đưa ra bất kỳ bằng chứng thực tế nào về lý do tại sao một loại chuyển đổi ngữ cảnh cụ thể sẽ tốn ít nhiều thời gian hơn bất kỳ loại nào khác. Kinh nghiệm của tôi trong việc tạo các hạt nhân đa tác vụ (ở quy mô nhỏ cho các bộ điều khiển nhúng, không có gì lạ mắt như HĐH "thực") cho thấy rằng điều này sẽ không xảy ra.
4) Tất cả các hình minh họa mà tôi đã thấy cho đến nay có ý nghĩa cho thấy Node nhanh hơn bao nhiêu so với các máy chủ web khác bị thiếu sót một cách khủng khiếp, tuy nhiên, chúng bị khiếm khuyết theo cách gián tiếp minh họa cho một lợi thế mà tôi chắc chắn sẽ chấp nhận cho Node (và nó không có nghĩa là không đáng kể). Node không giống như nó cần (thậm chí không cho phép, thực sự) điều chỉnh. Nếu bạn có một mô hình luồng, bạn cần tạo đủ các luồng để xử lý tải dự kiến. Làm điều này tồi tệ, và bạn sẽ kết thúc với hiệu suất kém. Nếu có quá ít luồng, thì CPU không hoạt động, nhưng không thể chấp nhận nhiều yêu cầu hơn, tạo quá nhiều luồng và bạn sẽ lãng phí bộ nhớ kernel và trong trường hợp môi trường Java, bạn cũng sẽ lãng phí bộ nhớ heap chính . Bây giờ, đối với Java, lãng phí heap là cách đầu tiên, tốt nhất, để tăng hiệu năng của hệ thống, bởi vì bộ sưu tập rác hiệu quả (hiện tại, điều này có thể thay đổi với G1, nhưng có vẻ như ban giám khảo vẫn chưa kết thúc vào thời điểm đó vào đầu năm 2013) phụ thuộc vào việc có rất nhiều đống dự phòng. Vì vậy, có vấn đề, điều chỉnh nó với quá ít luồng, bạn có CPU nhàn rỗi và thông lượng kém, điều chỉnh nó với quá nhiều, và nó sa lầy theo những cách khác.
5) Có một cách khác để tôi chấp nhận logic của tuyên bố rằng cách tiếp cận của Node "nhanh hơn theo thiết kế", và đó là điều này. Hầu hết các mô hình luồng sử dụng mô hình chuyển đổi ngữ cảnh được cắt theo thời gian, xếp chồng lên trên mô hình ưu tiên (cảnh báo phán đoán giá trị :) phù hợp hơn và hiệu quả hơn (không phải là phán đoán giá trị). Điều này xảy ra vì hai lý do, thứ nhất, hầu hết các lập trình viên dường như không hiểu quyền ưu tiên và thứ hai, nếu bạn học phân luồng trong môi trường windows, thời gian sẽ ở đó dù bạn có thích hay không (tất nhiên, điều này củng cố điểm đầu tiên ; đáng chú ý, các phiên bản đầu tiên của Java đã sử dụng quyền ưu tiên ưu tiên cho các triển khai Solaris và thời gian trong Windows. Bởi vì hầu hết các lập trình viên không hiểu và phàn nàn rằng "luồng không hoạt động trong Solaris" họ đã thay đổi mô hình thành thời gian ở khắp mọi nơi). Dù sao, điểm mấu chốt là thời gian tạo ra các chuyển đổi bối cảnh bổ sung (và có thể không cần thiết). Mọi chuyển đổi ngữ cảnh đều mất thời gian của CPU và thời gian đó được loại bỏ một cách hiệu quả khỏi công việc có thể thực hiện trong công việc thực tế. Tuy nhiên, lượng thời gian đầu tư vào chuyển đổi ngữ cảnh vì thời gian không nên nhiều hơn một tỷ lệ rất nhỏ trong tổng thời gian, trừ khi có điều gì đó kỳ quặc đang xảy ra, và không có lý do gì tôi có thể thấy rằng đó là trường hợp trong máy chủ web đơn giản). Vì vậy, vâng, các chuyển đổi ngữ cảnh dư thừa liên quan đến thời gian là không hiệu quả (và những điều này không xảy ra trong và thời gian đó được loại bỏ một cách hiệu quả khỏi công việc có thể được thực hiện trên công việc thực tế trong tay. Tuy nhiên, lượng thời gian đầu tư vào chuyển đổi ngữ cảnh vì thời gian không nên nhiều hơn một tỷ lệ rất nhỏ trong tổng thời gian, trừ khi có điều gì đó kỳ quặc đang xảy ra, và không có lý do gì tôi có thể thấy rằng đó là trường hợp trong máy chủ web đơn giản). Vì vậy, vâng, các chuyển đổi ngữ cảnh dư thừa liên quan đến thời gian là không hiệu quả (và những điều này không xảy ra trong và thời gian đó được loại bỏ một cách hiệu quả khỏi công việc có thể được thực hiện trên công việc thực tế trong tay. Tuy nhiên, lượng thời gian đầu tư vào chuyển đổi ngữ cảnh vì thời gian không nên nhiều hơn một tỷ lệ rất nhỏ trong tổng thời gian, trừ khi có điều gì đó kỳ quặc đang xảy ra, và không có lý do gì tôi có thể thấy rằng đó là trường hợp trong máy chủ web đơn giản). Vì vậy, vâng, các chuyển đổi ngữ cảnh dư thừa liên quan đến thời gian là không hiệu quả (và những điều này không xảy ra trongchủ đề hạt nhân như một quy tắc, btw) nhưng sự khác biệt sẽ là một vài phần trăm thông lượng, không phải là loại yếu tố số nguyên được ngụ ý trong các tuyên bố hiệu suất thường được ngụ ý cho Node.
Dù sao, xin lỗi vì tất cả đều dài và rầm rộ, nhưng tôi thực sự cảm thấy rằng cho đến nay, cuộc thảo luận đã không chứng minh được điều gì, và tôi sẽ rất vui khi được nghe từ ai đó trong một trong những tình huống sau:
a) một lời giải thích thực sự về lý do tại sao Node nên tốt hơn (ngoài hai kịch bản tôi đã nêu ở trên, trong đó kịch bản đầu tiên (điều chỉnh kém) tôi tin là lời giải thích thực sự cho tất cả các thử nghiệm tôi đã thấy cho đến nay. ], thực sự, tôi càng nghĩ về nó, tôi càng băn khoăn liệu bộ nhớ được sử dụng bởi số lượng lớn ngăn xếp có thể có ý nghĩa ở đây hay không. Kích thước ngăn xếp mặc định cho các luồng hiện đại có xu hướng khá lớn, nhưng bộ nhớ được phân bổ bởi hệ thống sự kiện dựa trên đóng cửa sẽ chỉ là những gì cần thiết)
b) một điểm chuẩn thực sự mang lại cơ hội công bằng cho máy chủ được lựa chọn. Ít nhất là như vậy, tôi phải ngừng tin rằng các tuyên bố về cơ bản là sai;> ([sửa] có lẽ mạnh hơn tôi dự định, nhưng tôi cảm thấy rằng những lời giải thích được đưa ra cho lợi ích hiệu suất là không đầy đủ nhất, và điểm chuẩn hiển thị là không hợp lý).
Chúc mừng, Toby
select()
nhanh hơn so với hoán đổi bối cảnh luồng.