Điều gì có thể được thực hiện để tăng tốc gọi các phương thức gốc từ mã được quản lý?Tối ưu hóa được quản lý cho các cuộc gọi gốc
Tôi đang viết một chương trình cần có khả năng quản lý danh sách các đối tượng có kích thước tùy ý và truy xuất thông tin từ các đối tượng đó ở tốc độ cao, nguồn cấp dữ liệu vào tập lệnh. Kịch bản là các bit của mã C# được biên dịch. Tôi đang viết một lớp giao diện cơ bản từ C++ (native) DLL/SO/etc cho lớp quản lý C# (.Net hoặc Mono).
Bây giờ, tôi đã thực hiện một số thử nghiệm và tôi nhận thấy rằng trung bình, PInvoking một phương pháp gốc từ mã được quản lý chậm hơn 100 lần so với thực hiện tất cả. nhanh chóng, để tham khảo).
Cú pháp tôi đã sử dụng là:
[DllImport("test.dll")]
extern static public String test_method(String value);
String returnedValue = test_method("hello world");
Có cách nào để cache một con trỏ đến chức năng, một số mã của Invoker nhanh, điều đó sẽ làm tăng tốc độ sau khi tải thư viện bản địa? Điều đó sẽ giải quyết vấn đề khá gọn gàng, vì vậy tôi nghi ngờ nó tồn tại. : P
Chỉnh sửa: Tôi không chỉ định, nhưng điều này cần phải hoạt động trên Windows, Linux (ít nhất là Ubuntu) và Mac OS X, tất cả cho cả x86 và x64. Nếu không tôi sẽ đi với một giao diện C + +/CLI và được thực hiện với nó, nhưng trừ khi đó làm việc cho tất cả 3 nền tảng, tôi không thể sử dụng nó.
Có thể có một số chuyển đổi chuỗi ký tự và chuỗi ký tự diễn ra làm chậm tốc độ này xuống. Bạn có nhận được tỷ lệ hiệu suất tương tự không nếu bạn đo lường các hàm có nghĩa làint thay vì chuỗi? – x4u
Tôi không có nghĩa là phải đề cập đến rõ ràng nhưng tôi sẽ kể từ 100x có vẻ ngoài dòng trong kinh nghiệm của tôi, nhưng bạn không chạy gỡ lỗi xây dựng \ và hoặc với trình gỡ lỗi đính kèm khi làm perf đo trên mã. Net? –
@chibacity: Đó thực sự là một bản dựng gỡ lỗi với trình gỡ rối được đính kèm. Mặc dù tất cả các thành phần, bản địa và được quản lý, đều đã gỡ lỗi với các trình gỡ rối. Tôi sẽ chạy lại số của mình với bản phát hành bản phát hành và kiểm tra sự khác biệt. – ssube