Delphi;传递const字符串与传递var字符串的性能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Delphi;传递const字符串与传递var字符串的性能相关的知识,希望对你有一定的参考价值。

[快速一个;我是否正确地认为,将字符串“作为CONST”传递给方法比将字符串作为“ VAR”传递涉及更多的开销?如果将字符串参数声明为CONST,编译器将使Delphi复制该字符串,然后传递该副本,对吧?

这个问题的原因有点乏味;我们有一个遗留的Delphi 5实用程序,它的日子已经过真实编号(正在开发替代品)。它执行大量的字符串处理,经常在各种函数和过程之间传递1-2Kb字符串。在整个代码中,遵循了使用CONST或VAR传递参数(取决于所处理的工作)的“正确”观察。我们只是在寻找可能会缩短执行时间几微秒的“快速胜利”,以帮助我们渡过难关,直到新版本准备就绪。我们曾考虑将内存管理器从默认的Delphi 5 one更改为FastMM,并且我们还想知道是否值得改变字符串的传递方式-因为代码与以const形式传递的字符串可以正常工作,所以我们没有如果我们将这些声明更改为var,则会看到一个问题-该方法中的代码不会更改字符串。

但是这真的会在实际价值上有所不同吗? (该程序实际上只是对这些1kb + ish的字符串进行了大量处理;在高峰时间每分钟要处理数百个字符串)。在重写过程中,这些字符串被保存在对象/类变量中,因此它们实际上并没有以完全相同的方式被复制/传递,但是在遗留代码中,这是非常“老派”的。

自然,我们将对程序的整体运行过程进行概要分析,以了解我们所做出的改变,但是如果我们对字符串传递在第一个实例中的工作方式绝对是错误的,则没有实际尝试的意义!

答案
procedure TForm1.Button1Click(Sender: TObject); var s: string; begin s := 'foo bar baz'; UniqueString(s); SetConstCaption(s); Caption := s; end; procedure TForm1.SetConstCaption(const AValue: string); var P: PChar; begin P := PChar(AValue); P[3] := '?'; Caption := AValue; end;

这实际上将更改调用方法中的本地字符串变量,证明仅传递了指向它的指针。

但是绝对使用FastMM4,它应该对性能产生更大的影响。
另一答案
而且我也不关心它是通过值传递还是通过引用传递]]-哪个效率最高对我来说都可以”。粗体部分很重要,因为它实际上是可观察到的。考虑以下代码:

type TFoo = record x: integer; //dummy: array[1..10] of integer; end; procedure Foo(var x1: TFoo; const x2: TFoo); begin WriteLn(x1.x); WriteLn(x2.x); Inc(x1.x); WriteLn; WriteLn(x1.x); WriteLn(x2.x); end; var x: TFoo; begin Foo(x, x); ReadLn; end.

这里的窍门是,我们传递与varconst相同的变量,以便我们的函数可以通过一个参数进行变异,然后看是否会影响另一个参数。如果您在上面的代码中尝试过,您会发现x1.x内部的Foo递增不会更改x2.x,因此x2是通过值传递的。但是,尝试取消对TFoo中的数组声明的注释,以使其大小变大,然后再次运行它-您将看到x2.x现在如何别名为x1.x,因此我们为x2提供了传递引用现在!
总而言之,const始终是传递任何类型的参数的最有效方法,但是您不应该对是否具有调用方传递的值的副本或对它的引用进行任何假设。某些位置(可能被您可能会调用的其他代码所突变)。 
另一答案
None
另一答案
const
另一答案
None

以上是关于Delphi;传递const字符串与传递var字符串的性能的主要内容,如果未能解决你的问题,请参考以下文章

Delphi 11:常量对象不能作为 var 参数传递

delphi如何调用多个参数的函数

如何在2个Delphi应用程序之间传递字符串[重复]

如何使用 swig 将 const 字符串参数从 perl 传递到 c++

在delphi中窗体间怎么传递参数

delphi的简单代码