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.
var
和const
相同的变量,以便我们的函数可以通过一个参数进行变异,然后看是否会影响另一个参数。如果您在上面的代码中尝试过,您会发现x1.x
内部的Foo
递增不会更改x2.x
,因此x2
是通过值传递的。但是,尝试取消对TFoo
中的数组声明的注释,以使其大小变大,然后再次运行它-您将看到x2.x
现在如何别名为x1.x
,因此我们为x2
提供了传递引用现在!总而言之,const
始终是传递任何类型的参数的最有效方法,但是您不应该对是否具有调用方传递的值的副本或对它的引用进行任何假设。某些位置(可能被您可能会调用的其他代码所突变)。
以上是关于Delphi;传递const字符串与传递var字符串的性能的主要内容,如果未能解决你的问题,请参考以下文章