我对Delphi 2010中的这段代码会发生什么很好奇:
function foo: WideString;
var
myUnicodeString: UnicodeString;
begin
for i:=1 to 1000 do
begin
myUnicodeString := ... something ...;
result := result + myUnicodeString; // This is where I'm interested
end;
end;涉及多少个字符串转换,在性能上有哪些特别糟糕的?
我知道函数应该只返回一个UnicodeString,但是我在VCL流代码中看到了这个反模式,并且希望了解这个过程。
发布于 2013-08-15 18:22:57
要回答有关代码实际上正在做什么的问题,请使用以下语句:
result := result + myUnicodeString;是否有下列情况:
System._UStrFromWStr()将Result转换为临时UnicodeStringSystem._UStrCat()将myUnicodeString连接到临时System._WStrFromUStr()将临时时间转换为WideString并将其分配给Result。有一个System._WStrCat()函数,用于将WideString连接到WideString上(而System._UStrCat()用于UnicodeString)。如果CodeGear/Embarcadero在这方面更聪明,他们可以实现一个System._WStrCat()重载,它以UnicodeString作为输入,WideString作为输出(反之亦然),将WideString连接到UnicodeString上。这样,就不再需要临时UnicodeString转换了。WideString和UnicodeString都被编码为UTF-16 (好吧,但我不会在这里讨论),所以将它们连接在一起只是一个分配和移动的问题,就像将两个UnicodeStrings或两个WideStrings连接在一起时一样。
发布于 2013-08-15 15:40:19
表演很差。没有任何编码转换的必要,因为一切都是UTF-16编码。但是,WideString是COM类型的包装器,其性能比本机UnicodeString差。
当然,您应该更喜欢使用本机类型( UnicodeString或TStringBuilder )完成所有工作,并在最后可能的时刻转换为WideString。
这通常是一项好政策。您不想在内部使用WideString,因为它纯粹是一种互操作类型。因此,仅在互操作边界上转换为(和从) WideString。
https://stackoverflow.com/questions/18253978
复制相似问题