On 14.09.2014 18:05, Philippe wrote:
someone wrote about a better performance using "with". is that true?
even with a simple pointer as in:
with ptr^ do
begin
prop1 := ...
prop2 := ...
end;
which should be faster then
ptr^.prop1 := ...
ptr^.prop1 := ...
others wrote it is just usefull to save writing time ...
Take this example:
=== code begin ===
program twithtest;
type
TTest = object
procedure SetProp1(aValue: Integer);
procedure SetProp2(aValue: Integer);
property Prop1: Integer write SetProp1;
property Prop2: Integer write SetProp2;
end;
PTest = ^TTest;
procedure TTest.SetProp1(aValue: Integer);
begin
end;
procedure TTest.SetProp2(aValue: Integer);
begin
end;
procedure TestWith;
var
p: PTest;
begin
New(p);
with p^ do begin
Prop1 := 42;
Prop2 := 21;
end;
Dispose(p);
end;
procedure TestWithout;
var
p: PTest;
begin
New(p);
p^.Prop1 := 42;
p^.Prop2 := 21;
Dispose(p);
end;
begin
end.
=== code end ===
This is the relevant code generated for TestWith:
=== asm begin ===
# [28] with p^ do begin
movl -4(%ebp),%ebx
# [29] Prop1 := 42;
movl %ebx,%eax
movw $42,%dx
call P$TWITHTEST_TTEST_$__SETPROP1$SMALLINT
# [30] Prop2 := 21;
movl %ebx,%eax
movw $21,%dx
call P$TWITHTEST_TTEST_$__SETPROP2$SMALLINT
=== asm end ===
and this for TestWithout:
=== asm begin ===
# [42] p^.Prop1 := 42;
movl -4(%ebp),%eax
movw $42,%dx
call P$TWITHTEST_TTEST_$__SETPROP1$SMALLINT
# [43] p^.Prop2 := 21;
movl -4(%ebp),%eax
movw $21,%dx
call P$TWITHTEST_TTEST_$__SETPROP2$SMALLINT
=== asm end ===
As you can see the expression p^ is only evaluated once in the TestWith
case while it's evaluated twice in the TestWithout one. So it's only
minimally faster in this example (one less memory access), but if you
use enough members of TTest it a more or less tight loop it might even
be noticeable.
Regards,
Sven
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal