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

Reply via email to