[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Magnitude of Order "For Loop" performance deltas based on syntax cha
From: |
Christian Franke |
Subject: |
Re: Magnitude of Order "For Loop" performance deltas based on syntax change |
Date: |
Sat, 24 Sep 2016 14:29:09 +0200 |
User-agent: |
Mozilla/5.0 (Windows NT 10.0; WOW64; rv:43.0) Gecko/20100101 Firefox/43.0 SeaMonkey/2.40 |
Tom McCurdy wrote:
Bash Version: 4.3
Patch Level: 11
Release Status: release
Description:
Two nearly identical "For Loop" setups have large deltas in
performance. See test program below. Was confirmed in IRC chat room by
multiple users. Input is very noticeable with around 100,000 values.
The script was originally used to take an input file where the first
line would determine how many int values were to follow. The remaining
lines each had values that were sorted, and then the smallest
difference between any two values were found.
Repeat-By:
Using script below comment/uncomment each method to test.
On my machine
Method-1 finishes in around 2 seconds
Method-2 finishes in around 72 seconds
I tested the scripts on Win10 with the current Cygwin x64 version of
bash (4.3.46(7)):
Method-1: ~4 seconds
Method-2: ~24 seconds
Further observations:
- Method-1 could be slowed down significantly by modifications of the
first two assignments in the for loop:
1) Swap current/next assignments:
next=${Pi[$i+1]}
current=${Pi[$i]}
Result: ~26 seconds
2) Do these assignments with 'let' statements instead:
let current=Pi[i]
let next=Pi[i+1]
Result: ~25 seconds
3) Do both:
let next=Pi[i+1]
let current=Pi[i]
Result: ~49 seconds
- Method-2 could be significantly speed up if the order of the array
accesses is reversed:
for (( i=0; i<N-1; i++)); do
if (( -(Pi[i] - Pi[i+1]) < min )); then
min=$((-(Pi[i]-Pi[i+1])))
fi
done
Result: ~3 seconds
(using 'let' in the 'min' assignment failed with syntax error - Bug?)
There is at least some (IMO unexpected) performance degradation if
arrays are accessed not sequentially.
Thanks,
Christian