【发布时间】:2010-12-13 08:32:24
【问题描述】:
我试图加快应用程序中的某个例程,而我的分析器 AQTime 将一种方法特别确定为瓶颈。该方法已经存在多年,并且是“杂项”单元的一部分:
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;
在我正在优化的程序部分中,该方法被调用了大约 35k 次,它花费了惊人的 56% 的执行时间!
很容易看出左填充字符串是一种可怕的方式,所以我将其替换为
function cwLeftPad(const aString:string; aCharCount:integer; aChar:char): string;
begin
Result := StringOfChar(aChar, aCharCount-length(aString))+aString;
end;
这给了很大的推动作用。总运行时间从 10.2 秒到 5.4 秒。惊人的!但是,cwLeftPad 仍然占总运行时间的 13% 左右。有没有一种简单的方法可以进一步优化这种方法?
【问题讨论】:
-
您是否有关于您的函数所涉及的每个 RTL 函数花费了多少时间的数据?比如说,分配内存和复制字符的百分比是多少?
-
您使用的是 D2009 或更高版本,即您使用的是 string=ansistring 还是 unicode 字符串?
-
这个函数的典型输入是什么?如果您有一组有限的真实世界输入,那么可以以一种在一般情况下可能较慢但对您来说更快的方式来调整算法。 Wodzu 有一个极端的例子。
-
通常 5-15 个字符的字符串被填充到 20-50 个字符。
-
每次填充字符都不一样,是一个填充字符还是多个填充字符,例如:'.',0','#'。
标签: algorithm delphi optimization string