[fpc-pascal] A check before setting a property (or the cost of a	call instruction)
    Luiz Americo Pereira Camara 
    luizmed at oi.com.br
       
    Thu Jul 22 23:10:18 CEST 2010
    
    
  
Hi,
In Lazarus i just committed the following code:
    if Alignment <> FDataLink.Field.Alignment then
      Alignment := FDataLink.Field.Alignment;
but i could do also:
   Alignment := FDataLink.Field.Alignment;
The setter property of Alignment  already checks if the passed value is 
equal:
procedure TCustomEdit.SetAlignment(const AValue: TAlignment);
begin
  if FAlignment = AValue then
    exit;
  FAlignment := AValue;
  if HandleAllocated then
    TWSCustomEditClass(WidgetSetClass).SetAlignment(Self, FAlignment);
end;
Most of the time the condition Alignment <> FDataLink.Field.Alignment 
will evaluate to false.
Removing this check would make the code smaller.
Here is the generated code:
With the check:
[78] if Alignment <> FDataLink.Field.Alignment then
    movl    12(%ebx),%eax
    movl    24(%eax),%eax
    movl    44(%eax),%eax
    cmpl    8(%ebx),%eax
    je    .Lj35
# [79] Alignment := FDataLink.Field.Alignment;
    movl    12(%ebx),%eax
    movl    24(%eax),%eax
    movl    44(%eax),%edx
    movl    %ebx,%eax
    call    P$ASMCHECKBEFOREASSIGNMENT_TMYDBEDIT_$__SETALIGNMENT$TALIGNMENT
Without the check:
# [79] Alignment := FDataLink.Field.Alignment;
    movl    12(%ebx),%eax
    movl    24(%eax),%eax
    movl    44(%eax),%edx
    movl    %ebx,%eax
    call    P$ASMCHECKBEFOREASSIGNMENT_TMYDBEDIT_$__SETALIGNMENT$TALIGNMENT
Is worth removing the check?
The cost of not doing the call compensates the extra code added by the 
check?
PS: this specific case is not speed sensitive. It was used more as an 
example.
Luiz
    
    
More information about the fpc-pascal
mailing list