Tôi đã cố gắng tăng tốc một thói quen nhất định trong một ứng dụng, và hồ sơ của tôi, AQTime, đã xác định một phương pháp đặc biệt là một nút cổ chai. Phương pháp này đã gắn bó với chúng tôi trong nhiều năm qua, và là một phần của một -unit "misc":Đệm nhanh của một chuỗi trong Delphi
function cwLeftPad(aString:string; aCharCount:integer; aChar:char): string;
var
i,vLength:integer;
begin
Result := aString;
vLength := Length(aString);
for I := (vLength + 1) to aCharCount do
Result := aChar + Result;
end;
Trong một phần của chương trình mà tôi đang tối ưu hóa tại thời điểm phương pháp này được gọi là ~ 35k lần, và phải mất 56% thời gian thực hiện!
Thật dễ dàng để thấy rằng đó là một cách khủng khiếp sang trái-pad một chuỗi, vì vậy tôi thay thế nó với
function cwLeftPad(const aString:string; aCharCount:integer; aChar:char): string;
begin
Result := StringOfChar(aChar, aCharCount-length(aString))+aString;
end;
đó đã cải thiện đáng kể. Tổng thời gian chạy từ 10,2 giây đến 5,4 giây. Tuyệt vời! Nhưng, cwLeftPad vẫn chiếm khoảng 13% tổng thời gian chạy. Có cách nào dễ dàng để tối ưu hóa phương pháp này hơn nữa không?
Bạn có bất kỳ dữ liệu nào không bout mất bao nhiêu thời gian trong mỗi chức năng RTL liên quan đến chức năng của bạn? Giả sử, phần trăm được dành cho việc phân bổ bộ nhớ và những gì được chi tiêu sao chép ký tự? –
Bạn đang làm việc trên D2009 trở lên, tức là bạn đang làm việc với chuỗi = ansistring hoặc với chuỗi unicode? – PhiS
Đầu vào điển hình cho chức năng này là gì? Nếu bạn có một bộ giới hạn đầu vào trong thế giới thực, thì thuật toán có thể được tinh chỉnh theo cách có thể chậm hơn cho trường hợp chung, nhưng sẽ nhanh hơn cho bạn. Wodzu có một ví dụ cực đoan. – JosephStyons