Chậm lại rất nhiều khi chạy Lua dưới dạng lib liên kết tĩnh so với trình thông dịch độc lập


7

Tôi đang phát triển một số thuật toán trong Lua, phần lớn được chạy trong Lua (vài cuộc gọi đến C ++) và tôi nhận thấy sự chậm chạp rất lớn khi tôi chạy chúng từ ứng dụng của mình thay vì trình thông dịch Lua mặc định. Kịch bản trở lại sau khoảng 11 giây với trình thông dịch và khoảng hơn 5 phút với chương trình của tôi.

Tôi không nghĩ rằng đó là một vấn đề với việc gọi hàm C ++, việc ghi đè hàm đó bằng một hàm trống trong tập lệnh không có tác dụng đáng chú ý về thời gian.

Cả Lua và chương trình đều được biên dịch với Visual Studio 2010 (Tôi đã tạo ra một giải pháp mới cho Lua, với các dự án cho cả trình thông dịch và thư viện tĩnh)

Tôi đã chạy một trình lược tả mã (trình biên dịch Rất buồn ngủ, không thể làm cho trình lược tả Lua hoạt động nhưng chưa cố gắng nhiều) và thấy rằng trong ứng dụng của tôi, khoảng 50% thời gian dành cho malloc .. và 40% miễn phí, cả hai được gọi từ trình thu gom rác Lua (đã cố gắng vô hiệu hóa để kiểm tra, nhưng nó gặp sự cố khi sử dụng nhiều bộ nhớ (có thể hiểu được), trình thông dịch Lua nhìn thấy khoảng 4mb sử dụng ram).

Tôi mới đến Lua, vì vậy rất có thể tôi đã làm gì đó sai ở đâu đó, có ai có một vài gợi ý để thử không?


malloc! Gốc rễ của mọi tội lỗi! Chúng tôi gặp phải một vấn đề tương tự khi lần đầu tiên điều tra Lua và chỉ đơn giản là từ bỏ nỗ lực, vì vậy tôi tò mò muốn xem liệu có giải pháp nào không.
Crashworks

Không có đề xuất thay đổi trình xử lý bộ nhớ mặc định cho lua thành một trình sử dụng realloc ... nếu tôi nhớ chính xác thì điều này được cho là nhanh hơn nhiều trong một số trường hợp. Nhưng đó là ~ 3 năm trước. Làm thế nào để bạn ràng buộc Lua? Nếu bạn sử dụng Luabind, ngoại trừ khá nhiều chức năng gọi hàm đáng kể so với các phương thức liên kết trực tiếp, hoặc có thể được so sánh vớiLua.
Tìm hiểuCocos2D

Bạn đã thử các đề xuất trong việc tối ưu hóa GC của lua chưa? lua-users.org/wiki/OptimisingGarbageCollection
David Young

@DavidYoung Tôi đã thử tối ưu hóa nó một chút, nhanh hơn khoảng 15%, vì vậy không có gì thực sự giải thích được sự khác biệt lớn về tốc độ
Elva

Tài khoản cho một lớp cần được gọi
Elva

Câu trả lời:


4

Như bạn nói, Lua mặc định cấp phát bộ nhớ như điên. Bạn nên xem xét việc viết một bộ cấp phát tùy chỉnh có kiến ​​thức tốt hơn về các mẫu phân bổ thường được sử dụng bởi các chương trình Lua của bạn hoặc cắm vào một cái gì đó như tcmalloc để có hiệu suất phân bổ tốt hơn.


Tôi đã thử điều đó, nó tiết kiệm được một chút thời gian (vài giây, vẫn không ở gần trình thông dịch độc lập), có thể vấn đề (hoặc một trong số đó) là thời gian phân bổ không đổi và phụ thuộc vào dung lượng bộ nhớ được bảo lưu trước? Điều đó sẽ có thể giải quyết được bằng cách sử dụng nhóm bộ nhớ chỉ dành cho Lua, tôi sẽ cung cấp cho nó một shot (bất kỳ ai cũng có một số gợi ý về việc thực hiện điều đó?).
Elva

Điều gì tiết kiệm một vài giây, tcmalloc? Lý do malloc nói chung không chậm vì thời gian phân bổ không phải là hằng số (mặc dù nó thường không) - bởi vì phân bổ có địa phương bộ nhớ cache khủng khiếp, rất nhiều khóa, kiểm tra tính nhất quán trong các bản dựng gỡ lỗi, v.v. Về cơ bản, bạn nên không bao giờ được gọi malloc thực (và đặc biệt là không thực sự miễn phí!) trong khi thực thi tập lệnh - luôn sử dụng nhóm bộ nhớ hiện có càng nhiều càng tốt.
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.