Delphi 7函数 - 字符串还是短字符串?整数还是单词?

时间:2013-04-07 07:43:06

标签: string performance delphi variables integer

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

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

function SomeFunction: String;function SomeFunction: ShortString;

同样的想法:

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

2 个答案:

答案 0 :(得分:4)

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

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

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

由于大多数Delphi RTL / VCL库使用string,因此在代码中使用shortstring会为这些方法的每次调用添加大量转换,而使用时则不会这样。普通string。在调用Windows API时,delphi string类型已经为零,因此将避免任何分配和转换,这在使用shortstring时是必需的。

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

如果您认为string很慢(由于原子引用计数或内存分配不是多线程友好的),请不要使用shortstring,而是使用其他结构 - 请参阅我的回答{ {3}}并且永远不会使用https://stackoverflow.com/a/6076407/458259

等工具进行分析

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

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

答案 1 :(得分:-1)

  

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

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

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