永远不要使用shortstring
with 函数,即使在 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 函数时才使用。