2009-05-28 35 views
36

Nguyên nhân kỹ thuật cụ thể của Ruby chậm hơn rất nhiều trên Windows? Mọi người báo cáo về việc giảm tốc độ 3X từ Linux/OSX và có một số cuộc thảo luận mơ hồ về Ruby sử dụng trình biên dịch cho các phiên bản Windows tạo mã chậm nhưng tôi không thể tìm thấy bất kỳ chi tiết cụ thể nào.Tại sao ruby ​​lại chậm hơn nhiều so với cửa sổ?

Bất kỳ ai biết chi tiết cụ thể? Tôi không quan tâm đến cơn gió mạnh Windoze hút yuks yuk.

+0

Tôi nghĩ của Ruby mã đã được giải thích. ? – leppie

+2

Nó là nhưng người giải thích vẫn phải được biên soạn. Việc thực hiện phổ biến nhất được viết bằng C. – nitecoder

+0

Phiên bản ổn định hiện tại (1.9.1) sử dụng một máy ảo mới, được gọi là YARV, là một công cụ JIT. – wvdschel

Trả lời

20

Tôi đoán có một vài tùy chọn có thể, và họ có lẽ tất cả thêm lên:

  1. của Ruby được chủ yếu phát triển trên Linux, nó kết thúc một cách máy móc tối ưu hóa cho nó. Mã được kiểm tra thường xuyên cho Windows và mọi thứ hoạt động, nhưng kết quả vẫn là nhà phát triển sẽ dành nhiều thời gian tối ưu hóa cho Linux hơn Windows.
  2. Theo kinh nghiệm của tôi, các phiên bản gần đây của gcc (4.3 trở lên) tạo mã hiệu quả hơn các phiên bản gần đây của Visual Studio (ít nhất là 2005). Các thử nghiệm của tôi bao gồm trong cả hai trường hợp chi tiêu khoảng một ngày để tìm ra các tùy chọn tốt nhất cho tối ưu hóa mã.
  3. Liên quan đến điểm 1, nếu bạn biên dịch cùng một dự án sử dụng gcc cho Windows hoặc Linux, tôi thường quan sát thấy giảm khoảng 20% ​​hiệu suất trên Windows so với Linux. Ở đây một lần nữa, tôi cho rằng điều này là bởi vì Linux (hoặc Unices nói chung) là một mục tiêu chính cho gcc, cửa sổ là một cổng. Ít thời gian hơn dành cho Windows so với Linux.

Cuối cùng, nếu bạn muốn tối ưu hóa Ruby cho Windows, một lượng đáng kể thời gian (và tiền, theo như tôi biết, trình biên dịch trên Windows không có miễn phí) sẽ phải được chi tiêu sử dụng một nút cổ chai profiler và tối ưu hóa. Và mọi thứ sẽ phải được thử nghiệm trên Linux để đảm bảo không có mất hiệu suất.

Tất nhiên, tất cả sẽ được kiểm tra lại với thông dịch viên mới YARV.

+4

Cả AMD CodeAnalyst và Vtune của Intel đều có sẵn miễn phí :-) –

+0

Quảng cáo 3.Không có sự khác biệt trong việc tối ưu hóa mã cho Windows hoặc Linux chỉ thay đổi nền tảng phần cứng có thể tạo ra sự khác biệt. – lispmachine

+3

MRI VS8/9 được xây dựng chậm hơn so với MRI do MinGW chế tạo. Cuối cùng tôi đã kiểm tra, nhị phân Windows chính thức được xây dựng với VS6, thậm chí còn chậm hơn; đó là một lúc trước, mặc dù. Tôi chuyển sang JRuby cho Windows và không nhìn lại. – user60401

2

Lúc đầu, bạn cần phân biệt giữa phiên bản cũ hơn MRI interpreter (phiên bản tối đa 1.8) và phiên bản YARV mới hơn, là phiên dịch chính thức cho Ruby 1.9. Có những cải tiến hiệu suất lớn và một thiết kế khác trong Ruby 1.9, vì vậy cần phải biết bạn đang nói phiên bản nào. Tôi đoán rằng những gì bạn đã đọc đề cập đến phiên bản 1.8.x, là phiên bản duy nhất có trình cài đặt một cú nhấp chuột cho đến nay.

Ngoài ra, bạn cũng nên biết liệu bạn có đang nói về hiệu suất Ruby on Rails hay Ruby nói chung hay không. Tôi biết rằng cần có một sự phân biệt rõ ràng giữa hai điều này, nhưng vì Ruby on Rails là việc sử dụng chính của Ruby, mọi người thường nói về hiệu quả của nó như thể họ đang nói về hiệu suất của Ruby.

Đối với trình biên dịch, Ruby có thể được xây dựng bằng bất kỳ phiên bản Visual Studio nào gần đây, điều này còn tốt hơn. Tôi đoán rằng nếu một sự khác biệt hiệu suất như vậy tồn tại, người ta nên xem xét việc thực hiện các thông dịch viên và xem nếu có cái gì đó sẽ làm cho một sự khác biệt giữa một POSIX và một hệ thống Windows.

+2

Ruby 1.9 (với YARV) vẫn còn chậm hơn nhiều trên Windows. (Lưu ý rằng tôi chưa thực sự thực hiện bất kỳ điểm chuẩn nào, đó chỉ là quan sát không khoa học của tôi.) –

1

Mức độ hiệu suất không phải là 300%, nói chung, thay vào đó, tỷ lệ này gần 50% -100%. Lời giải thích của Jim bình thường là một trong những lý do tại sao các kịch bản xử lý dữ liệu chậm hơn trên Windows so với các phiên bản Unix và Linux.

Trong trường hợp tổng quát hơn, điều duy nhất tôi có thể nghĩ là phát triển Ruby là trung tâm của Linux, điều này dẫn đến nhiều UNIX-isms theo cách Ruby được xây dựng.Ngoài ra, vì hầu hết các nhà phát triển hoạt động không phải là người dùng Windows, rất ít chuyên gia tối ưu hóa Windows hiện diện trong nhóm và hầu hết các quyết định tối ưu hóa hiệu suất đều tập trung vào việc làm cho mọi thứ nhanh hơn trên các hệ thống Unix.

Ví dụ cụ thể về điều này là Ruby sử dụng thông số sao chép khi ghi, mà theo những gì tôi đọc, không thể thực hiện đúng trên Windows, gây ra rất nhiều chi phí trong các cuộc gọi phương thức.

Tôi dường như không thể hiểu được điều gì, Jim thường làm gì để xứng đáng với phiếu bầu -8.

2

Không hoàn toàn đối với câu hỏi của bạn, nhưng đã có một cuộc thảo luận tuyệt vời về số Deep Fried Bytes podcast đã thảo luận cùng một câu hỏi trong ngữ cảnh IronPython. Tôi hiểu câu hỏi của bạn liên quan đến Ruby, nhưng có thể có những vấn đề liên quan cũng ảnh hưởng đến Ruby.

Ngoài ra, cuộc thảo luận thực hiện tốt công việc tìm kiếm sâu hơn một chút so với "Windows hút", vì vậy bạn nên kiểm tra nó.

14

Tôi chưa thực hiện nhiều công việc với mã nguồn của trình thông dịch YARV, vì vậy các nhận xét sau đây chỉ liên quan đến thông dịch viên 1.8.6 MIR.

Trong quá trình cố gắng viết phần mở rộng C cho Ruby trong Visual Studio, tôi phát hiện ra sự kinh dị của tôi rằng các tệp nhị phân Windows của Ruby 1.8.6 được biên dịch bằng Visual C++ 6.0, được phát hành ngay sau khi kết thúc chiến tranh thế giới thứ hai. Kể từ đó trình biên dịch (và các bộ vi xử lý mà họ nhắm mục tiêu) đã nâng cao đáng kể. Trong khi Linux xây dựng có được sự tốt đẹp gcc mới nhất, Windows xây dựng limps cùng với công nghệ biên dịch của thế kỷ trước. Đó là một lý do. (Tuyên bố từ chối trách nhiệm: được cho là 1,9 sẽ được xây dựng với mingw, trong đó tôi không phải là người hâm mộ, nhưng cũng phải tốt hơn VC6)

Nếu không biết những gì bạn tìm thấy chậm hơn trên Windows thì khó có thể nhận xét thêm, nhưng tôi sẽ lưu ý rằng tôi thấy việc triển khai I/O trên Ruby sẽ kém hiệu quả hơn với cả I/O và mạng cục bộ. Tôi không bao giờ delved vào việc thực hiện các I/O nguyên thủy, đủ để xem lý do tại sao, nhưng tôi cho rằng việc triển khai giả định các cấu trúc IO nhanh trên Linux là cấu trúc IO nhanh trên Windows, mà hầu như không phải như vậy.

+4

+1 cho cuộc chiến tranh thế giới thứ hai :) –

0

ntfs nén tệp tự động trên cửa sổ đang làm chậm mọi thứ cho tôi. nó bắt đầu hoạt động tự động khi bạn ở mức thấp trên không gian hd ... và sau đó nó cần giải nén và giải nén các tập tin trên bay, khi bạn truy cập chúng, lãng phí chu kỳ CPU ..

Chạy lệnh sau để giải nén toàn bộ ntfs ổ đĩa từ gốc của nó (tức là "C: \") và xem nếu có bất kỳ sự khác biệt, với tôi nó thực hiện một sự khác biệt rất lớn và có ruby ​​/ đường ray tốc độ trở lại những gì tôi đã được sử dụng để trước!

lệnh là:

compact /u /s /i 
Các vấn đề liên quan