ResourceString与Const字符串字面量的区别

8

我有一个 Delphi 应用程序中的数千个字符串字面量。它们已经被隔离在一个单独的文件中,以前用于本地化。

现在我不再需要本地化。

使用 resourcestring 与普通常量相比是否会有性能损失?

我应该将它们更改为 CONST 吗?

3个回答

8

使用const字符串将调用_UStrLAsg,资源字符串最终在LoadResString中加载。

由于问题涉及速度,因此没有什么比进行测试更好的了。

resourcestring
    str2 = 'str2';

const
    str1 = 'str1';

function ConstStr1: string;
begin
    result := str1;
end;

function ReceStr1: string;
begin
    result := str2;
end;

function ConstStr2: string;
begin
    result := str1;
end;

function ReceStr2: string;
begin
    result := str2;
end;

procedure Test;
var
    s1, s2, s3, s4: string;
begin
    s1 := ConstStr1;
    s2 := ReceStr1;
    s3 := ConstStr2;
    s4 := ReceStr2;
end;

这是我第一次使用DelphiXE中添加的AQTime对此代码进行分析,以下是结果。时间列显示机器周期。 AQTime报告 我可能在分析时犯了很多新手错误,但我认为const和resourcestring之间存在差异。如果用户能注意到这种差异取决于您如何处理字符串。在具有许多迭代的循环中,这可能很重要,但用于向用户显示信息则不太重要。

3
因为你使用了时间控制,而不仅像其他人一样“猜测”,所以我点赞。LoadString 和 FindResourceHInstance API 调用不是立即执行的。这就是为什么我们在 Delphi 7 的增强型运行时库中实现了 LoadResString 的内部缓存机制,并且在我们框架的i18n 单元resourcestring自动翻译中也进行了缓存。正如你所说,在循环中,这种缓存确实起到作用!在这样的循环中使用本地临时字符串是一个好习惯。 - Arnaud Bouchez
@Mikael @A.Bouchez 另外,计时结果看起来非常可疑。为什么 ConstStr1 和 ConstStr2 的时间差别如此之大?而且基准测试是如何进行的?需要更多细节! - David Heffernan
@Mikael 我认为这个微基准测试并没有太多的价值。我认为你需要计时真实应用程序。 - David Heffernan
@David 没有绝对的基准,但是我至少想赞扬一下使用时钟而不是猜测的尝试。关于性能,我已经在实际应用中进行了基准测试,发现在循环中使用本地临时字符串比直接使用资源字符串更快。为什么第一个调用较慢是有道理的:资源内容必须首先被访问,Windows必须计算内存映射exe中的偏移量,然后创建PChar。我猜测Windows自身正在使用一些内部缓存,因此后续调用会更快。这里我只是猜测,因为Windows是黑盒子:) - Arnaud Bouchez
@David 当然,你是对的:在没有循环的实际应用中,const 和 resourcestring 之间没有明显的区别。 - Arnaud Bouchez
显示剩余4条评论

0

既然它们存储在一个单独的文件中,而且可能没有做其他事情(干得好!),那么尝试一下也没有什么理由不去尝试。我预测这对性能不会有任何明显的影响,但我想这取决于你的应用程序还在做些什么。


-1

资源字符串确实会产生额外的开销。

与显示此类字符串或将其写入文件或数据库相比,开销并不大。

另一方面,这只是从resourcestring切换到const关键字(如果您考虑再次进行本地化,则可以切换回来)。


2
看一下 System.pas 中的 LoadResString 实现:它不是两个额外的指针重定向,而是至少两个对 Windows API 的调用:LoadString 和 FindResourceHInstance。即使资源被映射到内存中,这些 API 也不是立即执行的。然后从返回的 PChar 内容创建一个字符串。你所说的“两个指针重定向”并没有在 resourcestring 中使用 - 它还将包括从 PChar 缓冲区创建字符串。 - Arnaud Bouchez
有趣,我以为第一次获取后它们会被缓存。谢谢你教我不同的看法。 - Jeroen Wiert Pluimers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接