On Mon, September 15, 2014 07:55, Sven Barth wrote:
> 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:
 .
 .
> 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.

Have you tried to enable optimizations? Diff of the two code fragments
generated with 2.6.4 and -O3:

--- t_with_o3.s Mon Sep 15 08:59:07 2014
+++ t_without_o3.s      Mon Sep 15 08:59:32 2014
@@ -1,18 +1,14 @@
-# [26] New(p);
+# [40] New(p);
        movl    $0,%eax
        call    fpc_getmem
        movl    %eax,%ebx
-# [28] with p^ do begin
-       movl    %ebx,%esi
-# [29] Prop1 := 42;
-       movl    %esi,%eax
+# [42] p^.Prop1 := 42;
        movw    $42,%dx
        call    P$TWITHTEST_TTEST_$__SETPROP1$SMALLINT
-       movl    %esi,%eax
-# [t.pas]
-# [30] Prop2 := 21;
+# [43] p^.Prop2 := 21;
+       movl    %ebx,%eax
        movw    $21,%dx
        call    P$TWITHTEST_TTEST_$__SETPROP2$SMALLINT
-# [33] Dispose(p);
+# [45] Dispose(p);
        movl    %ebx,%eax
        call    fpc_freemem

Note that there are actually more instructions generated for version using
'with' in this case (obviously depending on the context). In other words,
the remark about micro-optimizations (which may not necessarily lead to
expected results) applies here...

Tomas


_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to