Skip to content

Commit f55c32d

Browse files
committed
Add new benchmark metric: number of instructions
1 parent da2c232 commit f55c32d

File tree

5 files changed

+61
-28
lines changed

5 files changed

+61
-28
lines changed

Dockerfile

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ ENV PHPIZE_DEPS \
2121
make \
2222
pkg-config \
2323
re2c \
24-
bison
24+
bison \
25+
valgrind
2526

2627
# persistent / runtime deps
2728
RUN set -eux; \
@@ -102,6 +103,8 @@ RUN set -eux; \
102103
\
103104
# make sure invalid --configure-flags are fatal errors instead of just warnings
104105
--enable-option-checking=fatal \
106+
# --enable-werror \ commenting out due to dynasm errors
107+
--disable-debug \
105108
--enable-mbstring \
106109
--with-mysqli=mysqlnd \
107110
# --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself)
@@ -119,6 +122,7 @@ RUN set -eux; \
119122
--with-libdir="lib/$debMultiarch" \
120123
\
121124
--enable-cgi \
125+
--with-valgrind \
122126
; \
123127
make -j "$(nproc)"; \
124128
find -type f -name '*.a' -delete; \

bin/benchmark.sh

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ EOF
125125
}
126126

127127
print_result_tsv_header () {
128-
printf "Test name\tTest warmup\tTest iterations\tTest requests\tPHP\tPHP Commit hash\tPHP Commit URL\tMin\tMax\tStd dev\tAverage\tAverage diff %%\tMedian\tMedian diff %%\tMemory usage\n" >> "$1.tsv"
128+
printf "Test name\tTest warmup\tTest iterations\tTest requests\tPHP\tPHP Commit hash\tPHP Commit URL\tMin\tMax\tStd dev\tAverage\tAverage diff %%\tMedian\tMedian diff %%\tInstruction count\n\tMemory usage\n" >> "$1.tsv"
129129
}
130130

131131
print_result_md_header () {
@@ -137,8 +137,8 @@ print_result_md_header () {
137137
cat << EOF >> "$1.md"
138138
### $TEST_NAME - $description (sec)
139139
140-
| PHP | Min | Max | Std dev | Average | Average diff % | Median | Median diff % | Memory |
141-
|-------------|-------------|-------------|--------------|------------|-----------------|------------|---------------|---------------|
140+
| PHP | Min | Max | Std dev | Average | Average diff % | Median | Median diff % | Instr count | Memory |
141+
|-------------|-------------|-------------|--------------|------------|-----------------|------------|---------------|---------------|---------------|
142142
EOF
143143
}
144144

@@ -148,7 +148,8 @@ print_result_value () {
148148
url="${PHP_REPO//.git/}/commit/$commit_hash"
149149

150150
results="$(cat "$1")"
151-
memory_result="$(cat "$2")"
151+
instruction_count="$(cat "$2")"
152+
memory_result="$(cat "$3")"
152153

153154
min="$(min "$results")"
154155
max="$(max "$results")"
@@ -165,14 +166,14 @@ print_result_value () {
165166
std_dev="$(std_deviation "$results")"
166167
memory_usage="$(echo "scale=3;${memory_result}/1024"|bc -l)"
167168

168-
printf "%s\t%d\t%d\t%d\t%s\t%s\t%s\t%.5f\t%.5f\t%.5f\t%.5f\t%.2f\t%.5f\t%.2f\t%.2f\n" \
169+
printf "%s\t%d\t%d\t%d\t%s\t%s\t%s\t%.5f\t%.5f\t%.5f\t%.5f\t%.2f\t%.5f\t%.2f\t%d\t%.2f\n" \
169170
"$TEST_NAME" "$TEST_WARMUP" "$TEST_ITERATIONS" "$TEST_REQUESTS" \
170171
"$PHP_NAME" "$commit_hash" "$url" \
171-
"$min" "$max" "$std_dev" "$average" "$average_diff" "$median" "$median_diff" "$memory_usage" >> "$3.tsv"
172+
"$min" "$max" "$std_dev" "$average" "$average_diff" "$median" "$median_diff" "$instruction_count" "$memory_usage" >> "$4.tsv"
172173

173-
if [ "$4" -eq "1" ]; then
174-
printf "|[%s]($url)|%.5f|%.5f|%.5f|%.5f|%.2f%%|%.5f|%.2f%%|%.2f MB|\n" \
175-
"$PHP_NAME" "$min" "$max" "$std_dev" "$average" "$average_diff" "$median" "$median_diff" "$memory_usage" >> "$3.md"
174+
if [ "$5" -eq "1" ]; then
175+
printf "|[%s]($url)|%.5f|%.5f|%.5f|%.5f|%.2f%%|%.5f|%.2f%%|%d|%.2f MB|\n" \
176+
"$PHP_NAME" "$min" "$max" "$std_dev" "$average" "$average_diff" "$median" "$median_diff" "$instruction_count" "$memory_usage" >> "$4.md"
176177
fi
177178
}
178179

@@ -209,13 +210,21 @@ run_cgi () {
209210
last_cpu="$((cpu_count-1))"
210211

211212
if [ "$1" = "quiet" ]; then
212-
taskset -c "$last_cpu" $php_source_path/sapi/cgi/php-cgi $opcache -T "$2,$3" "$PROJECT_ROOT/$4" > /dev/null
213+
taskset -c "$last_cpu" \
214+
$php_source_path/sapi/cgi/php-cgi $opcache -T "$2,$3" "$PROJECT_ROOT/$4" > /dev/null
213215
elif [ "$1" = "verbose" ]; then
214-
taskset -c "$last_cpu" $php_source_path/sapi/cgi/php-cgi $opcache -T "$2,$3" "$PROJECT_ROOT/$4"
216+
taskset -c "$last_cpu" \
217+
$php_source_path/sapi/cgi/php-cgi $opcache -T "$2,$3" "$PROJECT_ROOT/$4"
218+
elif [ "$1" = "instruction_count" ]; then
219+
taskset -c "$last_cpu" \
220+
valgrind --tool=callgrind --dump-instr=no -- \
221+
$php_source_path/sapi/cgi/php-cgi $opcache -q -T "$2,$3" "$PROJECT_ROOT/$4" > /dev/null
215222
elif [ "$1" = "memory" ]; then
216-
/usr/bin/time -v taskset -c "$last_cpu" $php_source_path/sapi/cgi/php-cgi $opcache -q -T "$2,$3" "$PROJECT_ROOT/$4" > /dev/null
223+
/usr/bin/time -v taskset -c "$last_cpu" \
224+
$php_source_path/sapi/cgi/php-cgi $opcache -q -T "$2,$3" "$PROJECT_ROOT/$4" > /dev/null
217225
else
218-
taskset -c "$last_cpu" $php_source_path/sapi/cgi/php-cgi $opcache -q -T "$2,$3" "$PROJECT_ROOT/$4"
226+
taskset -c "$last_cpu" \
227+
$php_source_path/sapi/cgi/php-cgi $opcache -q -T "$2,$3" "$PROJECT_ROOT/$4"
219228
fi
220229
elif [[ "$INFRA_RUNNER" == "docker" ]]; then
221230
if [[ "$INFRA_ENVIRONMENT" == "local" ]]; then
@@ -232,19 +241,31 @@ run_cgi () {
232241
fi
233242
}
234243

244+
format_instruction_count_log_file() {
245+
result="$(grep "== Collected : " "$1")"
246+
echo "$result" > "$1"
247+
sed -i".original" -E "s/==[0-9]+== Collected : //g" "$1"
248+
rm "$1.original"
249+
}
250+
251+
format_memory_log_file() {
252+
result="$(grep "Maximum resident set size" "$1")"
253+
echo "$result" > "$1"
254+
sed -i".original" "s/ Maximum resident set size (kbytes): //g" "$1"
255+
rm "$1.original"
256+
}
257+
235258
run_real_benchmark () {
236259
# Benchmark
237260
run_cgi "verbose" "0" "1" "$1" "$2" "$3"
261+
run_cgi "instruction_count" "10" "10" "$1" "$2" "$3" 2>&1 | tee -a "$instruction_count_log_file"
238262
run_cgi "memory" "$TEST_WARMUP" "$TEST_REQUESTS" "$1" "$2" "$3" 2>&1 | tee -a "$memory_log_file"
239263
for b in $(seq $TEST_ITERATIONS); do
240264
run_cgi "quiet" "$TEST_WARMUP" "$TEST_REQUESTS" "$1" "$2" "$3" 2>&1 | tee -a "$log_file"
241265
done
242266

243-
# Format memory log
244-
result="$(grep "Maximum resident set size" "$memory_log_file")"
245-
echo "$result" > "$memory_log_file"
246-
sed -i".original" "s/ Maximum resident set size (kbytes): //g" "$memory_log_file"
247-
rm "$memory_log_file.original"
267+
format_instruction_count_log_file "$instruction_count_log_file"
268+
format_memory_log_file "$memory_log_file"
248269

249270
# Format log
250271
sed -i".original" "/^[[:space:]]*$/d" "$log_file"
@@ -255,14 +276,12 @@ run_real_benchmark () {
255276

256277
run_micro_benchmark () {
257278
# Benchmark
279+
run_cgi "instruction_count" "2" "2" "$1" "" "" 2>&1 | tee -a "$instruction_count_log_file"
258280
run_cgi "memory" "0" "$TEST_WARMUP" "$1" "" "" 2>&1 | tee -a "$memory_log_file"
259281
run_cgi "normal" "$TEST_WARMUP" "$TEST_ITERATIONS" "$1" "" "" 2>&1 | tee -a "$log_file"
260282

261-
# Format memory log
262-
result="$(grep "Maximum resident set size" "$memory_log_file")"
263-
echo "$result" > "$memory_log_file"
264-
sed -i".original" "s/ Maximum resident set size (kbytes): //g" "$memory_log_file"
265-
rm "$memory_log_file.original"
283+
format_instruction_count_log_file "$instruction_count_log_file"
284+
format_memory_log_file "$memory_log_file"
266285

267286
# Format log
268287
results="$(grep "Total" "$log_file")"
@@ -329,6 +348,7 @@ run_benchmark () {
329348

330349
log_dir="$result_dir"
331350
log_file="$log_dir/${PHP_ID}.log"
351+
instruction_count_log_file="$log_dir/${PHP_ID}.instruction_count.log"
332352
memory_log_file="$log_dir/${PHP_ID}.memory.log"
333353
mkdir -p "$log_dir"
334354

@@ -338,8 +358,8 @@ run_benchmark () {
338358

339359
run_test
340360

341-
print_result_value "$log_file" "$memory_log_file" "$result_file" "1"
342-
print_result_value "$log_file" "$memory_log_file" "$final_result_file" "0"
361+
print_result_value "$log_file" "$instruction_count_log_file" "$memory_log_file" "$result_file" "1"
362+
print_result_value "$log_file" "$instruction_count_log_file" "$memory_log_file" "$final_result_file" "0"
343363
done
344364

345365
echo "" >> "$final_result_file.md"

build/container/php-cgi/run.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,12 @@ if [ "$1" = "quiet" ]; then
2525
php-cgi $opcache "-T$2" "/code/$3" > /dev/null
2626
elif [ "$1" = "verbose" ]; then
2727
php-cgi $opcache "-T$2" "/code/$3"
28+
elif [ "$1" = "instruction_count" ]; then
29+
valgrind --tool=callgrind --dump-instr=no -- \
30+
php-cgi $opcache "-T$2" "/code/$3" > /dev/null
2831
elif [ "$1" = "memory" ]; then
29-
/usr/bin/time -v php-cgi $opcache "-T$2" "/code/$3" > /dev/null
32+
/usr/bin/time -v \
33+
php-cgi $opcache "-T$2" "/code/$3" > /dev/null
3034
else
3135
php-cgi $opcache -q "-T$2" "/code/$3"
3236
fi

build/script/php_compile.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@ cd "$PHP_SOURCE_PATH"
2121

2222
opcache_option="--enable-opcache"
2323

24+
# --enable-werror \ commenting out due to dynasm errors
25+
2426
./configure \
2527
--with-config-file-path="$PHP_SOURCE_PATH" \
2628
--with-config-file-scan-dir="$PHP_SOURCE_PATH/conf.d" \
2729
--enable-option-checking=fatal \
30+
--disable-debug \
2831
--enable-mbstring \
2932
--with-mysqli=mysqlnd \
3033
--enable-mysqlnd \
@@ -35,7 +38,8 @@ opcache_option="--enable-opcache"
3538
$opcache_option \
3639
--with-openssl \
3740
--with-zlib \
38-
--enable-cgi
41+
--enable-cgi \
42+
--with-valgrind
3943

4044
make -j "$(nproc)"
4145

build/script/php_deps.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ sudo dnf install --allowerasing -y \
1414
pkg-config \
1515
re2c \
1616
bison \
17+
valgrind-devel \
1718
ca-certificates \
1819
xz \
1920
dirmngr \

0 commit comments

Comments
 (0)