I have often wanted to point this out, but didn't really feel the need to, until today, when I was debugging into the RTL.

When you have a string parameter, the compiler makes a call to the RTL routine _UStrAddRef, and _UStrClr.
When you have multiple string parameters, the compiler makes a call for each string parameter to _UStrAddRef, and one call to _UStrArrayClr. In addition, the compiler will compile code similar to a try finally sequence as well.

If you do not make any changes to the string parameter, it is better to make that string parameter a const.

So, assuming you have the following code pattern:

procedure AName(param1: string)

changing it to:

procedure AName(const param1: string)

reduces the 2 calls generated by the compiler.

Here's the disassembly for the procedure X(S1, S2: string)

00524AF4 55 push ebp
00524AF5 8BEC mov ebp,esp
00524AF7 83C4F8 add esp,-$08
00524AFA 8955F8 mov [ebp-$08],edx
00524AFD 8945FC mov [ebp-$04],eax
00524B00 8B45FC mov eax,[ebp-$04]
00524B03 E8B058EEFF call @UStrAddRef
00524B08 8B45F8 mov eax,[ebp-$08]
00524B0B E8A858EEFF call @UStrAddRef
00524B10 33C0 xor eax,eax
00524B12 55 push ebp
00524B13 68394B5200 push $00524b39
00524B18 64FF30 push dword ptr fs:[eax]
00524B1B 648920 mov fs:[eax],esp
00524B1E 33C0 xor eax,eax
00524B20 5A pop edx
00524B21 59 pop ecx
00524B22 59 pop ecx
00524B23 648910 mov fs:[eax],edx
00524B26 68404B5200 push $00524b40
00524B2B 8D45F8 lea eax,[ebp-$08]
00524B2E BA02000000 mov edx,$00000002
00524B33 E8FC57EEFF call @UStrArrayClr
00524B38 C3 ret
00524B39 E9B24DEEFF jmp @HandleFinally
00524B3E EBEB jmp $00524b2b
00524B40 59 pop ecx
00524B41 59 pop ecx
00524B42 5D pop ebp
00524B43 C3 ret

and here's the disassembly for Y(const S1, S2: string):

00524B44 55 push ebp
00524B45 8BEC mov ebp,esp
00524B47 83C4F8 add esp,-$08
00524B4A 8955F8 mov [ebp-$08],edx
00524B4D 8945FC mov [ebp-$04],eax
00524B50 59 pop ecx
00524B51 59 pop ecx
00524B52 5D pop ebp
00524B53 C3 ret


As you can see, without the const, the generated code is more verbose.