gpt4 book ai didi

Delphi:快速(更)宽字符串连接

转载 作者:行者123 更新时间:2023-12-03 18:25:13 34 4
gpt4 key购买 nike

我有一个功能是转换 ADO Recordset 进入html:

class function RecordsetToHtml(const rs: _Recordset): WideString;

该函数的核心涉及大量宽字符串连接:
   while not rs.EOF do
begin
Result := Result+CRLF+
'<TR>';

for i := 0 to rs.Fields.Count-1 do
Result := Result+'<TD>'+VarAsWideString(rs.Fields[i].Value)+'</TD>';

Result := Result+'</TR>';
rs.MoveNext;
end;

对于几千个结果,该函数所花费的时间,任何用户都会感觉到,运行时间太长了。 Delphi Sampling Profiler显示 99.3% 的时间花在宽字符串连接上( @WStrCatN@WstrCat)。

任何人都可以想出一种改进宽字符串连接的方法吗?我认为 Delphi 5 没有任何类型的字符串生成器。和 Format不支持 Unicode。

并确保没有人试图偷懒:假装你正在实现接口(interface):
IRecordsetToHtml = interface(IUnknown)
function RecordsetToHtml(const rs: _Recordset): WideString;
end;

更新一

我想过使用 IXMLDOMDocument , 将 HTML 构建为 xml。但后来我意识到最终的 HTML 将是 xhtml而不是 html - 一个微妙但重要的区别。

更新二

Microsoft 知识库文章: How To Improve String Concatenation Performance

最佳答案

WideString 本质上很慢,因为它们是为了 COM 兼容性而实现的,并通过 COM 调用。如果您查看代码,它将继续重新分配字符串并调用 SysAllocStringLen() 和 C,它们是来自 oleaut32.dll 的 API。它不使用 Delphi 内存管理器,但 AFAIK 它使用 COM 内存管理器。
因为大多数 HTML 页面不使用 UTF-16,所以使用原生 Delphi 字符串类型和字符串列表可能会得到更好的结果,尽管你应该小心从 UTF 和实际代码页转换,并且转换也会降低性能.
此外,您正在使用 VarAsString() 函数,该函数可能将变体转换为 AnsiString 然后转换为WideString。检查您的 Delphi 版本是否有 VarAsWideString() 或类似的函数来避免它,或者如果您可以确定您的变体永远不会为 NULL,请依赖 Delphi 自动转换。

关于Delphi:快速(更)宽字符串连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3007164/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com