File: benchmarkRT

package info (click to toggle)
rawtherapee 5.12-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 124,328 kB
  • sloc: cpp: 271,715; ansic: 27,904; sh: 1,109; python: 521; cs: 155; xml: 57; makefile: 15
file content (273 lines) | stat: -rwxr-xr-x 10,276 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
#!/usr/bin/env bash
# Use this Bash script to test RT processing speed.
# Written by DrSlony
# v1  2012-02-10
# v2  2013-02-15
# v3  2013-03-04
# v4  2013-03-07
# v5  2013-03-23
# v6  2017-07-03
# v7  2017-07-04
# www.rawtherapee.com

inFile='http://rawtherapee.com/shared/test_images/colorspace_flowers.pef'
rtExe="rawtherapee-cli"
OPTIND=1 # Reset in case getopts has been used previously in the shell.
tmpDir="/tmp/rawtherapee-benchmark"
runs=5
echo

die () {
    printf '%s\n' "Cleaning up."
    rm -rv "${tmpDir}"
    exit 1
}

trap die HUP INT QUIT ABRT TERM

download () {
    local retries=3
    while [[ $retries -ne 0 ]]; do
        wget --progress=dot:binary --continue --trust-server-names --tries=1 --timestamping "$1" 2>&1 | sed "s/^/\t/"
        return=${PIPESTATUS[0]}
        ((retries--))
        if [[ $return -eq 0 ]]; then # I don't trust wget to only exit with 0 if it downloaded the file successfully, so I check.
            if [[ -f "$(basename "$1")" ]]; then
                break
            fi
        fi
        printf "%s\n\n" "Failed to download \"$1\"" "Retrying: "
        sleep 1s
    done
    if [[ $retries -eq 0 ]]; then
        printf "%s\n" "Tried to download \"$1\" 3 times but failed. Exiting."
        exit 1
    fi
}

howto() {
    cat<<END
    Introduction
    ------------
    Benchmark the time it takes for RawTherapee to process an image.
    The designated file will be processed ${runs} times in a row, and
    the average time of those ${runs} runs will be calculated.

    All options are optional.

    Make sure you have no unnecessary background activity - no programs
    intensively using the CPU. Turn off all P2P, multimedia, graphics
    editing, games, database, server and other "heavy" software,
    otherwise the timings will be skewed. You can use the "top" and
    "ps ux" commands to see a list of running processes and their CPU usage.

    Usage
    -----
    ./benchmarkRT [OPTIONS]

    Options
    -------
    -a        - Run a benchmark for all the tools available in RT.

    -e        - Absolute path to but excluding the "${rtExe}" executable.
                e.g. "-e ${HOME}/programs/code-rawtherapee/build/release"

    -h        - Print this help screen.

    -i <file> - Absolute path to image file. This can be a file on your
    hard drive or a url. The url must start with "http". The default
    behavior if you do not specify -i is to download a raw image from
    ${inFile}

    -s <PP3-1> -s <PP3-2> -s <PP3-#> - Absolute path to sidecar file.
    You can specify multiple sidecar files, use -s each time.
    The processing profile can be a file on your hard drive or a url.
    The default behaviour if you do not specify -s is to use the
    "Neutral" profile.

    Examples
    --------
    Run the default benchmark (recommended)
    ./benchmarkRT

    Run a benchmark using your own image file, a RawTherpee executable in a
    custom directory, and multiple processing profiles:
    ./benchmarkRT -i /tmp/kittens.raw -s /tmp/noise_reduction.pp3 -s /tmp/tonemapping.pp3 -s /tmp/retinex.pp3

    Further Help
    ------------
    If you need further help, discover bugs or want to request new
    functionality, then tell us in the forum or on IRC:
        https://discuss.pixls.us/t/welcome-to-the-rawtherapee-forum-read-this-first/473
        http://webchat.freenode.net/?randomnick=1&channels=rawtherapee&prompt=1

END
}

OPTIND=1
while getopts "ae:i:s:h?" opt; do
    case "$opt" in
        a)  testAllTools=1
            ;;
        e)  customExeDir="${OPTARG%/}"
            ;;
        i)  inFile="$OPTARG"
            ;;
        s)  sidecarCustom+=("$OPTARG")
            ;;
        h|\?|*)
            howto
            exit 0
            ;;
    esac
done
shift $((OPTIND-1))
[ "$1" = "--" ] && shift

inFileName="$(basename "${inFile}")"
if [[ ! -e "${tmpDir}" ]]; then
    if [[ ! -w /tmp ]]; then
        printf "Error: /tmp is not writable.\n"
        exit 1
    fi
    mkdir "$tmpDir"
fi

cd "$tmpDir"

if [[ ${inFile} = http* ]]; then # if inFile is a url and if we haven't downloaded it already, then download it
    [[ ! -e "${tmpDir}/${inFileName}" ]] && {
    printf "%s\n\n" "${inFileName} not found in ${tmpDir}, downloading it."
    [[ ! -w /tmp ]] && { printf "Error: /tmp is not writable.\n"; exit 1; }
    [[ ! -e "$tmpDir" ]] && mkdir "$tmpDir"
    cd "$tmpDir"
    download "$inFile"
    echo
}
else # otherwise if inFile is not a url, check if it exists
    [[ ! -e "${inFile}" ]] && { # if it doesn't exist, choke
    printf "%s\n" "You specified" "-i ${inFile}" "but that file does not exist."
    exit 1
}
cp "${inFile}" "${tmpDir}/${inFileName}"
fi

rtExeDirs=("${customExeDir}" "${HOME}/rt" "${HOME}/programs/code-rawtherapee/build/release" "${HOME}/rt_${branch}_${buildType}" "${HOME}/rawtherapee/")
found="false"
for rtExeDir in "${rtExeDirs[@]}"; do
    if [[ -x "${rtExeDir}/${rtExe}" ]]; then
        found="true"
        break
    fi
done

if [[ $found = false ]]; then
    printf "%s\n" "Could not find the RawTherapee executable." "Re-run this script using the -e flag."
    exit 0
fi

if [[ $testAllTools -ne 1 ]]; then
    if [[ -n "${sidecarCustom}" ]]; then # if sidecarCustom was specified
        for sidecarFile in "${sidecarCustom[@]}"; do
            if [[ ${sidecarFile} = http* ]]; then # and if sidecarCustom starts with an http
                if [[ ! -e "${tmpDir}/$/{sidecarFile##*/}" ]]; then # and if sidecarCustom hasn't been previously downloaded, then download it
                    printf "${sidecarCustom} not found in ${tmpDir}, downloading it.\n"
                    download "$sidecarCustom"
                fi
            fi
            if [[ -e "${sidecarFile}" ]]; then # then check if it exists
                sidecarFinal+=("${sidecarFile}")
            else
                printf '%s\n' "You specified \"-s ${sidecarFile}\" but it does not exist. Make sure you wrote a full, absolute path, e.g.:" "  -s /tmp/custom.pp3"
                exit 1
            fi
        done
        unset sidecarFiles
        sidecarFiles=("${sidecarCustom[@]}")
    else
        # if sidecarCustom was not specified, use neutral. Since neutral is not a file,
        # we take advantage of the fact that when RawTherapee does not find a processing profile, it uses neutral values.
        sidecarFinal=("Neutral")
    fi
else
    unset sidecarFiles avgTable sidecarDir
    sidecarDir="${tmpDir}/"
    tools=("Auto Exposure;Exposure;Auto=true" "Sharpening - Unsharp Mask;Sharpening;Enabled=true;Method=usm" "Sharpening - RL Deconvolution;Sharpening;Enabled=true;Method=rld" "Vibrance;Vibrance;Enabled=true" "Edges;SharpenEdge;Enabled=true" "Microcontrast;SharpenMicro;Enabled=true" "CIECAM02;Color appearance;Enabled=true" "Impulse Noise Reduction;Impulse Denoising;Enabled=true" "Defringe;Defringing;Enabled=true" "Noise Reduction;Directional Pyramid Denoising;Enabled=true" "Tone Mapping;EPD;Enabled=true" "Shadows/Highlights;Shadows & Highlights;Enabled=true" "Contrast by Detail Levels;Directional Pyramid Equalizer;Enabled=true" "Raw Chromatic Aberration;RAW;CA=true")
    for i in "${!tools[@]}"; do
        IFS=";" read toolNameHuman tool key1 key2 key3 <<< "${tools[$i]}"
        i=$(printf "%02d\n" "$i")
        printf "%s\n" "[${tool}]" "$key1" "$key2" "$key3" > "${sidecarDir}/${i} - ${tool}.pp3"
        sidecarFinal+=("${i} - ${tool}.pp3;${toolNameHuman}")
    done
fi

printf "%s\n" "$(uname -srvmpio)" ""
hash cpufreq-info 2>/dev/null && { cpufreq-info -mo; printf "%s\n" ""; }

printf "%s\n" "RawTherapee executable: ${rtExeDir}/${rtExe}"

if [[ ! -f "${rtExeDir}/AboutThisBuild.txt" ]]; then
    printf "%s\n" "[Could not find ${rtExeDir}/AboutThisBuild.txt]" ""
else
    cat "${rtExeDir}/AboutThisBuild.txt"
fi

printf "%s\n" "Photo:   ${tmpDir}/${inFileName}"
for sidecar in "${sidecarFinal[@]}"; do
    if [[ $testAllTools -eq 1 ]]; then
        IFS=";" read sidecar toolNameHuman <<< "${sidecar}"
    fi
    printf "%s\n" "Sidecar: ${sidecarDir}${sidecar}"
done
echo

declare -A avgTable
unset benchmark total sidecar sorted

# Unfudge numbers to make sed/PE possible without spaghetti.
export LC_ALL=C

for s in "${!sidecarFinal[@]}"; do
    IFS=";" read sidecar toolNameHuman <<< "${sidecarFinal[s]}"
    unset benchmark
    for (( i=1; i<=${runs}; i++ )); do
        runTime="$( { time "${rtExeDir}/${rtExe}" -o /dev/null/ -p "${sidecarDir}${sidecar}" -t -Y -c "${tmpDir}/${inFileName}"; } 2>&1 | grep ^real; )"
        #   runTime=real 0m4.751s
        runTime=${runTime#*[[:blank:]]}
        #   runTime=0m4.751s
        minOnly=${runTime%m*}
        secOnly=${runTime#*m}; secOnly=${secOnly%s*}
        t="$( printf "%s\n" "scale=3; $secOnly+$minOnly*60" | bc )"
        #   t=4.751
        ##  t="$(( $RANDOM %20 )).$(( $RANDOM %999 ))"
        #   benchmark stores time array of each run, gets reset after each PP3
        benchmark+=("$t")
        #   total stores time array of each run, doesn't get reset, adds up total afterwards
        total+=("$t")
        i="$(printf "%02d\n" "$i")"
        if [[ $testAllTools -eq 1 ]]; then
            printf "%*b" "-50" "Benchmark ${i} \"${toolNameHuman}\"" "7" "${benchmark[$i - 1]}" "" "\n" | sed 's/  /../g'
        else
            printf "%*b" "-50" "Benchmark ${i} \"${sidecar##*/}\"" "7" "${benchmark[$i - 1]}" "" "\n" | sed 's/  /../g'
        fi
    done

    avg=$( { printf "%s" "scale=3; ("; IFS="+"; printf "%s" "${benchmark[*]}"; printf "%s\n" ") / ${#benchmark[@]}"; } | bc );
    if [[ $testAllTools -eq 1 ]]; then
        printf "%*b" "-50" "Benchmark \"${toolNameHuman}\" average" "7" "${avg}" "" "\n\n" | sed 's/  /../g'
        avgTable+=(["${toolNameHuman}"]="$avg")
    else
        printf "%*b" "-50" "Benchmark \"${sidecar##*/}\" average" "7" "${avg}" "" "\n\n" | sed 's/  /../g'
        avgTable+=(["${sidecar}"]="$avg")
    fi
done

printf "%*b" "-50" "Benchmark total" "7" "$(IFS=+; bc -l <<< "${total[*]}")" "" "\n\n" | sed 's/  /../g'

# Associative arrays don't return in alphanumerical order, must be sorted manually
IFS=$'\n' sorted=($(sort <<<"${!avgTable[*]}"));

printf "%s\n" "Average times for each set:"
for x in "${sorted[@]}"; do
    printf "%*b" "-50" "${x}" "7" "${avgTable[$x]}" "" "\n" | sed 's/  /../g'
done