Skip to content

Commit b6d9981

Browse files
authored
Merge pull request #213 from Shopify/emily/memory-bench
Memory comparisons between Prism and Sorbet
2 parents 1ddd437 + 143d06d commit b6d9981

File tree

8 files changed

+214
-3
lines changed

8 files changed

+214
-3
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
Command being timed: "bazel-bin/main/sorbet --parser=prism --stop-after=parser ../../Shopify/shopify"
2+
User time (seconds): 308.82
3+
System time (seconds): 10.04
4+
Percent of CPU this job got: 113%
5+
Elapsed (wall clock) time (h:mm:ss or m:ss): 4:40.27
6+
Average shared text size (kbytes): 0
7+
Average unshared data size (kbytes): 0
8+
Average stack size (kbytes): 0
9+
Average total size (kbytes): 0
10+
Maximum resident set size (kbytes): 881064
11+
Average resident set size (kbytes): 0
12+
Major (requiring I/O) page faults: 0
13+
Minor (reclaiming a frame) page faults: 226461
14+
Voluntary context switches: 14702
15+
Involuntary context switches: 80406
16+
Swaps: 0
17+
File system inputs: 0
18+
File system outputs: 0
19+
Socket messages sent: 0
20+
Socket messages received: 0
21+
Signals delivered: 0
22+
Page size (bytes): 16384
23+
Exit status: 0
24+
25+
Command exited with non-zero status 100
26+
Command being timed: "bazel-bin/main/sorbet --parser=sorbet --stop-after=parser ../../Shopify/shopify"
27+
User time (seconds): 476.12
28+
System time (seconds): 9.49
29+
Percent of CPU this job got: 160%
30+
Elapsed (wall clock) time (h:mm:ss or m:ss): 5:02.08
31+
Average shared text size (kbytes): 0
32+
Average unshared data size (kbytes): 0
33+
Average stack size (kbytes): 0
34+
Average total size (kbytes): 0
35+
Maximum resident set size (kbytes): 1355112
36+
Average resident set size (kbytes): 0
37+
Major (requiring I/O) page faults: 0
38+
Minor (reclaiming a frame) page faults: 343679
39+
Voluntary context switches: 231
40+
Involuntary context switches: 77417
41+
Swaps: 0
42+
File system inputs: 0
43+
File system outputs: 0
44+
Socket messages sent: 0
45+
Socket messages received: 0
46+
Signals delivered: 0
47+
Page size (bytes): 16384
48+
Exit status: 100
49+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
Command being timed: "bazel-bin/main/sorbet --parser=prism --stop-after=parser ../yjit-bench/benchmarks"
2+
User time (seconds): 1.41
3+
System time (seconds): 0.11
4+
Percent of CPU this job got: 115%
5+
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.31
6+
Average shared text size (kbytes): 0
7+
Average unshared data size (kbytes): 0
8+
Average stack size (kbytes): 0
9+
Average total size (kbytes): 0
10+
Maximum resident set size (kbytes): 137440
11+
Average resident set size (kbytes): 0
12+
Major (requiring I/O) page faults: 24
13+
Minor (reclaiming a frame) page faults: 38722
14+
Voluntary context switches: 406
15+
Involuntary context switches: 2968
16+
Swaps: 0
17+
File system inputs: 0
18+
File system outputs: 0
19+
Socket messages sent: 0
20+
Socket messages received: 0
21+
Signals delivered: 0
22+
Page size (bytes): 16384
23+
Exit status: 0
24+
25+
Command being timed: "bazel-bin/main/sorbet --parser=sorbet --stop-after=parser ../yjit-bench/benchmarks"
26+
User time (seconds): 4.07
27+
System time (seconds): 0.08
28+
Percent of CPU this job got: 198%
29+
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.09
30+
Average shared text size (kbytes): 0
31+
Average unshared data size (kbytes): 0
32+
Average stack size (kbytes): 0
33+
Average total size (kbytes): 0
34+
Maximum resident set size (kbytes): 197452
35+
Average resident set size (kbytes): 0
36+
Major (requiring I/O) page faults: 0
37+
Minor (reclaiming a frame) page faults: 51716
38+
Voluntary context switches: 0
39+
Involuntary context switches: 1299
40+
Swaps: 0
41+
File system inputs: 0
42+
File system outputs: 0
43+
Socket messages sent: 0
44+
Socket messages received: 0
45+
Signals delivered: 0
46+
Page size (bytes): 16384
47+
Exit status: 0
48+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
Command exited with non-zero status 100
2+
Command being timed: "bazel-bin/main/sorbet --parser=prism test/prism_regression"
3+
User time (seconds): 1.07
4+
System time (seconds): 0.03
5+
Percent of CPU this job got: 117%
6+
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.93
7+
Average shared text size (kbytes): 0
8+
Average unshared data size (kbytes): 0
9+
Average stack size (kbytes): 0
10+
Average total size (kbytes): 0
11+
Maximum resident set size (kbytes): 64996
12+
Average resident set size (kbytes): 0
13+
Major (requiring I/O) page faults: 0
14+
Minor (reclaiming a frame) page faults: 18361
15+
Voluntary context switches: 0
16+
Involuntary context switches: 893
17+
Swaps: 0
18+
File system inputs: 0
19+
File system outputs: 0
20+
Socket messages sent: 0
21+
Socket messages received: 0
22+
Signals delivered: 0
23+
Page size (bytes): 16384
24+
Exit status: 100
25+
26+
Command exited with non-zero status 100
27+
Command being timed: "bazel-bin/main/sorbet --parser=sorbet test/prism_regression"
28+
User time (seconds): 1.06
29+
System time (seconds): 0.03
30+
Percent of CPU this job got: 119%
31+
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.91
32+
Average shared text size (kbytes): 0
33+
Average unshared data size (kbytes): 0
34+
Average stack size (kbytes): 0
35+
Average total size (kbytes): 0
36+
Maximum resident set size (kbytes): 65492
37+
Average resident set size (kbytes): 0
38+
Major (requiring I/O) page faults: 0
39+
Minor (reclaiming a frame) page faults: 18334
40+
Voluntary context switches: 0
41+
Involuntary context switches: 997
42+
Swaps: 0
43+
File system inputs: 0
44+
File system outputs: 0
45+
Socket messages sent: 0
46+
Socket messages received: 0
47+
Signals delivered: 0
48+
Page size (bytes): 16384
49+
Exit status: 100
50+
+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
#!/bin/bash
2+
3+
# This script runs memory comparisons for the Prism parser in the Sorbet type checker.
4+
# It assumes the presence of a few directories and tools:
5+
# - The yjit-bench directory, which contains the benchmarks for YJIT (https://github.com/Shopify/yjit-bench)
6+
# - The Shopify directory, which contains the Shopify codebase (https://github.com/Shopify/shopify)
7+
# - gtime, a command-line time and memory analysis tool (https://www.gnu.org/software/time/)
8+
9+
# ----- Setup -----
10+
11+
YJIT_BENCH_DIR="../yjit-bench"
12+
SHOPIFY_DIR="../../Shopify/shopify"
13+
export SORBET_SILENCE_DEV_MESSAGE=1
14+
15+
# Check if required directories exist
16+
for dir in "$YJIT_BENCH_DIR" "$SHOPIFY_DIR"; do
17+
if [ ! -d "$dir" ]; then
18+
echo "Please clone the required directories before running this script."
19+
exit 1
20+
fi
21+
done
22+
23+
# Check and install gtime if necessary
24+
if ! command -v gtime &> /dev/null; then
25+
echo "Installing gtime..."
26+
if [[ "$OSTYPE" == "darwin"* ]]; then
27+
brew install gnu-time
28+
else
29+
echo "Please install gtime: https://www.gnu.org/software/time/"
30+
exit 1
31+
fi
32+
fi
33+
34+
output_file_name="$(date '+%Y-%m-%d')-$(git rev-parse --short HEAD).txt"
35+
parsers=("prism" "sorbet")
36+
37+
# ----- Run Benchmarks -----
38+
39+
run_benchmark() {
40+
local title="$1"
41+
local output_dir="$2"
42+
local command="$3"
43+
44+
echo "#### $title ####"
45+
output_file="prism_benchmarks/memory/data/$output_dir/${output_file_name}"
46+
47+
for parser in "${parsers[@]}"; do
48+
gtime --verbose --output="$output_file" --append \
49+
bazel-bin/main/sorbet --parser=$parser $command &> /dev/null
50+
echo "" >> "$output_file"
51+
# Calculate peak memory usage:
52+
# - Search for lines that contain peak memory usage info
53+
# - Take the last one
54+
# - Extract the memory usage value
55+
# - Convert it to MB
56+
peak_memory=$(grep "Maximum resident set size (kbytes):" "$output_file" | tail -n 1 | awk '{print $6/1024 " MB"}')
57+
echo "-> Peak Memory Usage with $parser parser: $peak_memory"
58+
done
59+
echo ""
60+
}
61+
62+
run_benchmark "Memory Check 1: yjit-bench, parser only" "parser/yjit-bench" "--stop-after=parser $YJIT_BENCH_DIR/benchmarks"
63+
run_benchmark "Memory Check 2: shopify, parser only" "parser/shopify" "--stop-after=parser $SHOPIFY_DIR"
64+
run_benchmark "Memory Check 3: prism regression tests, whole pipeline" "pipeline" "test/prism_regression"

prism_benchmarks/run_prism_benchmarks.sh renamed to prism_benchmarks/time/run_benchmarks.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ echo "#### Benchmark 1: yjit-bench, parser only"
3434
# These benchmarks compare the performance of the Prism parser with the Sorbet parser without
3535
# any other parts of the type checker enabled.
3636
hyperfine \
37-
--warmup=10 --export-json="prism_benchmarks/data/parser/yjit-bench/$file_name" --parameter-list parser sorbet,prism \
37+
--warmup=10 --export-json="prism_benchmarks/time/data/parser/yjit-bench/$file_name" --parameter-list parser sorbet,prism \
3838
"bazel-bin/main/sorbet --parser={parser} --stop-after=parser ../yjit-bench/benchmarks"
3939

4040
echo "#### Benchmark 2: sorbet-test, parser only"
4141

4242
# Benchmark against sorbet tests to capture performance around parser errors
4343
# Pass the --ignore-failure flag to prevent hyperfine from exiting on parser errors
4444
hyperfine \
45-
--warmup=10 --export-json="prism_benchmarks/data/parser/sorbet-tests/$file_name" --parameter-list parser sorbet,prism \
45+
--warmup=10 --export-json="prism_benchmarks/time/data/parser/sorbet-tests/$file_name" --parameter-list parser sorbet,prism \
4646
"bazel-bin/main/sorbet --parser={parser} --stop-after=parser test/testdata" --ignore-failure
4747

4848
echo "#### Benchmark 3: prism regression tests, whole pipeline"
@@ -52,5 +52,5 @@ echo "#### Benchmark 3: prism regression tests, whole pipeline"
5252
# the Prism parser enabled and the Sorbet parser enabled. These benchmarks must be run on a
5353
# smaller set of files that only contain nodes supported by the Prism --> Sorbet translation layer.
5454
hyperfine \
55-
--warmup=10 --export-json="prism_benchmarks/data/pipeline/$file_name" --parameter-list parser sorbet,prism \
55+
--warmup=10 --export-json="prism_benchmarks/time/data/pipeline/$file_name" --parameter-list parser sorbet,prism \
5656
"bazel-bin/main/sorbet --parser={parser} test/prism_regression"

0 commit comments

Comments
 (0)