foreach (i; taskPool.parallel(0..2_000_000)
    Steven Schveighoffer 
    schveiguy at gmail.com
       
    Wed Apr  5 22:50:27 UTC 2023
    
    
  
On 4/5/23 6:34 PM, Paul wrote:
> On Tuesday, 4 April 2023 at 22:20:52 UTC, H. S. Teoh wrote:
> 
>> Best practices for arrays in hot loops:
>> - Avoid appending if possible; instead, pre-allocate outside the loop.
>> - Where possible, reuse existing arrays instead of discarding old ones
>>   and allocating new ones.
>> - Use slices where possible instead of making copies of subarrays (this
>>   esp. applies to strings).
>> - Where possible, prefer sequential access over random access (take
>>   advantage of the CPU cache hierarchy).
> 
> Thanks for sharing Teoh!  Very helpful.
> 
> would this be random access? for(size_t i; i<arr.length; i++) using 
> indices?
> ...and this be sequential foreach(a;arr) ?
No, random access is access out of sequence. Those two lines are pretty 
much equivalent, and even a naive compiler is going to produce exactly 
the same generated code from both of them.
A classic example is processing a 2d array:
```d
for(int i = 0; i < arr[0].length; ++i)
    for(int j = 0; j < arr.length; ++j)
      arr[j][i]++;
// vs
for(int j = 0; j < arr.length; ++j)
    for(int i = 0; i < arr[0].length; ++i)
      arr[j][i]++;
```
The first accesses elements *by column*, which means that the array data 
is accessed non-linearly in memory.
To be fair, both are "linear" in terms of algorithm, but one is going to 
be faster because of cache coherency (you are accessing sequential 
*hardware addresses*).
-Steve
    
    
More information about the Digitalmars-d-learn
mailing list