0

我是一个“性能”爱好者程序员,并且有一个基本的理论问题:Delphi 7 是否有一些“方法”来识别使用的字符串类型并自动定义正确的类型?

例如,当您知道函数的结果字符串长度总是小于 255 时,您会使用:

function SomeFunction: String;还是function SomeFunction: ShortString;

同样的想法:

function SomeFunction(Num: Integer): Integer;还是function SomeFunciont(Num: Byte): Word;

4

2 回答 2

4

永远不要使用shortstringwith 函数,即使在 Delphi 7 中也是如此。

当用作函数结果时,shortstring始终复制完整内容(即所有字符)。

所以它会比使用普通string变量慢,后者只会增加字符串的内部引用计数,而不复制字符。

由于大多数 Delphi RTL/VCL 库使用string.shortstring在您的代码中使用将为这些方法的每次调用添加大量转换,而使用普通string. 并且在调用Windows API时,delphistring类型已经是零端的,所以会避免任何分配和转换,这在使用shortstring.

因此,您必须知道,shortstring在所有版本的 Delphi 中它都比较慢,特别是如果您使用FastMM4作为内存管理器:当使用shortstring任何 RTL/VCL/API 调用时,Delphi 编译器实际上会分配一些隐藏的临时string,因此分配一个堆中的缓冲区...远非高效:最好立即使用字符串!

如果您认为这string很慢(由于对多线程不友好的原子引用计数或内存分配),请不要使用shortstring其他结构 - 请参阅我的答案https://stackoverflow.com/a/6076407/458259和永远不要在不使用http://delphitools.info/samplingprofiler/ 之类的工具进行分析的情况下进行优化

对于使用integer值的函数,byte/word/cardinal/integer不会产生速度差异。我的习惯是尽可能使用integer,这将适合 CPU 寄存器大小。只有Int64一种值会更慢,在 32 位以下,因为它将使用 2 个寄存器或堆栈上的临时变量。

更新:使用较新版本的 Delphi,您将拥有 " inline" 关键字,这可能有助于提高返回此类类型的小函数的性能。自 Delphi 2009 以来,字符串是 Unicode 并且shortstring已被弃用,因为它已固定到系统非 Unicode 应用程序代码页。shortstring仅当您确切知道自己在做什么,并且能够使用 Alt-F2 并查看生成的 asm 代码、猜测调用了哪些隐藏的 RTL 函数时才使用。

于 2013-04-07T08:07:31.710 回答
0

Delphi 7 是否有某种方法来识别所使用的字符串类型并自动定义正确的类型?

即使它提高了性能,编译器也永远不会进行这样的转换。为此,它需要执行所谓的数据流分析。换句话说,它需要分析数据如何在程序中流动,并对变量中可能包含的内容进行推理。

但是编译器不执行这种分析,因此无法对您描述的类型进行优化。

于 2013-04-07T12:22:03.530 回答