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_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to