2010-02-06 45 views
7

Giả sử tôi có một con trỏ kiểu char * để chuỗi unicode, và tôi biết chiều dài:Marshal.PtrToStringUni() vs new String()?

char* _unmanagedStr; 
int _unmanagedStrLength; 

và tôi có 2 cách để chuyển nó sang chuỗi NET:

Marshal.PtrToStringUni((IntPtr)_unmanagedStr, _unmanagedStrLength); 

new string(_unmanagedStr, 0, _unmanagedStrLength); 

Trong thử nghiệm của tôi, cả hai cuộc gọi đều cho tôi kết quả tương tự, nhưng new string() nhanh hơn 1,8 lần so với Marshal.PtrToStringUni().

Tại sao hiệu suất đó lại khác biệt? Có khác biệt chức năng nào khác giữa cả hai?

Trả lời

9

Đánh giá từ mã nguồn sẵn có (Rotor), hàm tạo System.String (Char *) sử dụng đường dẫn mã được tối ưu hóa rất nhiều thông qua CtorCharPtr(), nó phân bổ chuỗi bằng FastAllocateString(). Marshal.PtrToStringUni() theo một đường dẫn mã hoàn toàn khác, nó được viết bằng C++ và có vẻ sao chép chuỗi hai lần, mà không có lợi ích của một "cấp phát nhanh".

Rõ ràng, không cùng lập trình viên đã làm việc về điều này. Hầu như chắc chắn thậm chí không cùng một đội kể từ khi mã phù hợp với một mô hình lập trình khác nhau. Người quản lý gần nhất trong chung có lẽ là bốn cấp độ lên.

Không chắc chắn điều đó sẽ hữu ích như thế nào, hãy sử dụng nhanh. Các rủi ro sẽ tạo ra một loại ngoại lệ tương tự trên Windows.

8

Thứ hai không tuân thủ CLS, yêu cầu mã không an toàn và có thể có hành vi chưa được xác định, đó là lý do tại sao có thể nó nhanh hơn. Ngoài ra còn có một nhu cầu để pin con trỏ đến địa chỉ không được quản lý hoặc bộ thu gom rác có thể tái phân bổ nó dẫn đến một mã lộn xộn hơn. Trừ khi bạn đã xác định rằng đây là một nút cổ chai cho ứng dụng của bạn, bạn có thể sẽ muốn sử dụng hàm PtrToStringUni.

Các vấn đề liên quan