On Thu, May 6, 2010 at 7:34 PM, Jonas Maebe <jonas.ma...@elis.ugent.be> wrote:
>
> On 06 May 2010, at 23:28, Werner Van Belle wrote:
>
>> In 'human' (haha) terms:
>>
>> - global variable access: write data into 'ds+constant'
>> - local variables: write data into 'ss+bp+constant'.
>>
>> Since the latter involves a term more I assume it is bound to take more
>> time.
>
> That was true in the days of the 8086 (the former took 6 cycles while the 
> latter took 9 cycles). On the i386 and i486, both expressions were already 
> calculated in a single cycle; they only suffered an extra single cycle 
> penalty in case the address expression used an index (your example only 
> contains a base). On the Pentium, address expressions containing an index 
> were also evaluated in a single cycle. On today's deeply pipelined processors 
> it is extremely unlikely that there is any difference whatsoever in the 
> number of steps used to evaluate both address expressions (even if the time 
> required by the i386/i386/Pentium wasn't documented).
>
> If you wish to read the outdated details of the old Intel processors:
> * http://www.inf.puc-rio.br/~inf1018/material/intel.txt (search for 
> "8088/8086  Effective Address (EA) Calculation")
> * http://www.gamedev.net/reference/articles/article205.asp (search for 
> "Choice of Index Versus Base Register")
>
> Moreover, the first instruction takes up 10 bytes while the second one takes 
> up only 7 bytes, which means that the "global array instruction" takes up 
> more space in the icache (and that's something which actually /is/ very bad 
> from a performance point-of-view). Combined with how global variables require 
> indirection (as in "an extra memory load instruction") on RISC processors and 
> if position-independent code is used (except under some specific 
> circumstances on the x86-64), often slow down program startup (when the 
> dynamic linker has to relocate them), and often behave very badly in terms of 
> data locality (they are often surrounded by unrelated data, as opposed to 
> local variables where the surrounding data will probably also be used by the 
> same function), in general my bias would be much more against than in favour 
> of global variables from a speed perspective (and when not talking about 
> arrays, an additional advantage of local variables is that they often can be 
> kept in registers rather than in memory, which is seldom the case for global 
> variables).
>
>
> Jonas_______________________________________________


Now that's a fantastic explanation, and I guess the OP will be satisfied :-)

-Flávio
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to