serialbench 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/benchmark.yml +13 -5
- data/.github/workflows/docker.yml +35 -9
- data/.github/workflows/rake.yml +15 -0
- data/Gemfile +2 -1
- data/README.adoc +267 -1129
- data/Rakefile +0 -55
- data/config/benchmarks/full.yml +29 -0
- data/config/benchmarks/short.yml +26 -0
- data/config/environments/asdf-ruby-3.2.yml +8 -0
- data/config/environments/asdf-ruby-3.3.yml +8 -0
- data/config/environments/docker-ruby-3.0.yml +9 -0
- data/config/environments/docker-ruby-3.1.yml +9 -0
- data/config/environments/docker-ruby-3.2.yml +9 -0
- data/config/environments/docker-ruby-3.3.yml +9 -0
- data/config/environments/docker-ruby-3.4.yml +9 -0
- data/docker/Dockerfile.alpine +33 -0
- data/docker/{Dockerfile.benchmark → Dockerfile.ubuntu} +4 -3
- data/docker/README.md +2 -2
- data/exe/serialbench +1 -1
- data/lib/serialbench/benchmark_runner.rb +261 -423
- data/lib/serialbench/cli/base_cli.rb +51 -0
- data/lib/serialbench/cli/benchmark_cli.rb +380 -0
- data/lib/serialbench/cli/environment_cli.rb +181 -0
- data/lib/serialbench/cli/resultset_cli.rb +215 -0
- data/lib/serialbench/cli/ruby_build_cli.rb +238 -0
- data/lib/serialbench/cli.rb +58 -601
- data/lib/serialbench/config_manager.rb +140 -0
- data/lib/serialbench/models/benchmark_config.rb +63 -0
- data/lib/serialbench/models/benchmark_result.rb +45 -0
- data/lib/serialbench/models/environment_config.rb +71 -0
- data/lib/serialbench/models/platform.rb +59 -0
- data/lib/serialbench/models/result.rb +53 -0
- data/lib/serialbench/models/result_set.rb +71 -0
- data/lib/serialbench/models/result_store.rb +108 -0
- data/lib/serialbench/models.rb +54 -0
- data/lib/serialbench/ruby_build_manager.rb +153 -0
- data/lib/serialbench/runners/asdf_runner.rb +296 -0
- data/lib/serialbench/runners/base.rb +32 -0
- data/lib/serialbench/runners/docker_runner.rb +142 -0
- data/lib/serialbench/serializers/base_serializer.rb +8 -16
- data/lib/serialbench/serializers/json/base_json_serializer.rb +4 -4
- data/lib/serialbench/serializers/json/json_serializer.rb +0 -2
- data/lib/serialbench/serializers/json/oj_serializer.rb +0 -2
- data/lib/serialbench/serializers/json/yajl_serializer.rb +0 -2
- data/lib/serialbench/serializers/toml/base_toml_serializer.rb +5 -3
- data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +0 -2
- data/lib/serialbench/serializers/toml/tomlib_serializer.rb +0 -2
- data/lib/serialbench/serializers/toml/tomlrb_serializer.rb +56 -0
- data/lib/serialbench/serializers/xml/base_xml_serializer.rb +4 -9
- data/lib/serialbench/serializers/xml/libxml_serializer.rb +0 -2
- data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +0 -2
- data/lib/serialbench/serializers/xml/oga_serializer.rb +0 -2
- data/lib/serialbench/serializers/xml/ox_serializer.rb +0 -2
- data/lib/serialbench/serializers/xml/rexml_serializer.rb +0 -2
- data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +5 -1
- data/lib/serialbench/serializers/yaml/syck_serializer.rb +59 -22
- data/lib/serialbench/serializers.rb +23 -6
- data/lib/serialbench/site_generator.rb +105 -0
- data/lib/serialbench/templates/assets/css/benchmark_report.css +535 -0
- data/lib/serialbench/templates/assets/css/format_based.css +526 -0
- data/lib/serialbench/templates/assets/css/themes.css +588 -0
- data/lib/serialbench/templates/assets/js/chart_helpers.js +381 -0
- data/lib/serialbench/templates/assets/js/dashboard.js +796 -0
- data/lib/serialbench/templates/assets/js/navigation.js +142 -0
- data/lib/serialbench/templates/base.liquid +49 -0
- data/lib/serialbench/templates/format_based.liquid +279 -0
- data/lib/serialbench/templates/partials/chart_section.liquid +4 -0
- data/lib/serialbench/version.rb +1 -1
- data/lib/serialbench.rb +2 -31
- data/serialbench.gemspec +4 -1
- metadata +86 -16
- data/config/ci.yml +0 -22
- data/config/full.yml +0 -30
- data/docker/run-benchmarks.sh +0 -356
- data/lib/serialbench/chart_generator.rb +0 -821
- data/lib/serialbench/result_formatter.rb +0 -182
- data/lib/serialbench/result_merger.rb +0 -1201
- data/lib/serialbench/serializers/xml/base_parser.rb +0 -69
- data/lib/serialbench/serializers/xml/libxml_parser.rb +0 -98
- data/lib/serialbench/serializers/xml/nokogiri_parser.rb +0 -111
- data/lib/serialbench/serializers/xml/oga_parser.rb +0 -85
- data/lib/serialbench/serializers/xml/ox_parser.rb +0 -64
- data/lib/serialbench/serializers/xml/rexml_parser.rb +0 -129
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serialbench
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ribose
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2025-06-
|
11
|
+
date: 2025-06-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: benchmark-ips
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: lutaml-model
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: memory_profiler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,7 +81,7 @@ dependencies:
|
|
67
81
|
- !ruby/object:Gem::Version
|
68
82
|
version: '0'
|
69
83
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
84
|
+
name: liquid
|
71
85
|
requirement: !ruby/object:Gem::Requirement
|
72
86
|
requirements:
|
73
87
|
- - ">="
|
@@ -136,6 +150,20 @@ dependencies:
|
|
136
150
|
- - ">="
|
137
151
|
- !ruby/object:Gem::Version
|
138
152
|
version: '0'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rexml
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - ">="
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0'
|
160
|
+
type: :runtime
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - ">="
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
139
167
|
- !ruby/object:Gem::Dependency
|
140
168
|
name: oj
|
141
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -220,6 +248,20 @@ dependencies:
|
|
220
248
|
- - ">="
|
221
249
|
- !ruby/object:Gem::Version
|
222
250
|
version: '0'
|
251
|
+
- !ruby/object:Gem::Dependency
|
252
|
+
name: tomlrb
|
253
|
+
requirement: !ruby/object:Gem::Requirement
|
254
|
+
requirements:
|
255
|
+
- - ">="
|
256
|
+
- !ruby/object:Gem::Version
|
257
|
+
version: '0'
|
258
|
+
type: :runtime
|
259
|
+
prerelease: false
|
260
|
+
version_requirements: !ruby/object:Gem::Requirement
|
261
|
+
requirements:
|
262
|
+
- - ">="
|
263
|
+
- !ruby/object:Gem::Version
|
264
|
+
version: '0'
|
223
265
|
description: A benchmarking suite for comparing performance of various serialization
|
224
266
|
libraries in Ruby, including XML, JSON, and TOML parsers/generators.
|
225
267
|
email:
|
@@ -232,24 +274,47 @@ files:
|
|
232
274
|
- ".github/workflows/benchmark.yml"
|
233
275
|
- ".github/workflows/ci.yml"
|
234
276
|
- ".github/workflows/docker.yml"
|
277
|
+
- ".github/workflows/rake.yml"
|
235
278
|
- ".github/workflows/release.yml"
|
236
279
|
- ".rspec"
|
237
280
|
- Gemfile
|
238
281
|
- README.adoc
|
239
282
|
- Rakefile
|
240
|
-
- config/
|
241
|
-
- config/
|
242
|
-
-
|
283
|
+
- config/benchmarks/full.yml
|
284
|
+
- config/benchmarks/short.yml
|
285
|
+
- config/environments/asdf-ruby-3.2.yml
|
286
|
+
- config/environments/asdf-ruby-3.3.yml
|
287
|
+
- config/environments/docker-ruby-3.0.yml
|
288
|
+
- config/environments/docker-ruby-3.1.yml
|
289
|
+
- config/environments/docker-ruby-3.2.yml
|
290
|
+
- config/environments/docker-ruby-3.3.yml
|
291
|
+
- config/environments/docker-ruby-3.4.yml
|
292
|
+
- docker/Dockerfile.alpine
|
293
|
+
- docker/Dockerfile.ubuntu
|
243
294
|
- docker/README.md
|
244
|
-
- docker/run-benchmarks.sh
|
245
295
|
- exe/serialbench
|
246
296
|
- lib/serialbench.rb
|
247
297
|
- lib/serialbench/benchmark_runner.rb
|
248
|
-
- lib/serialbench/chart_generator.rb
|
249
298
|
- lib/serialbench/cli.rb
|
299
|
+
- lib/serialbench/cli/base_cli.rb
|
300
|
+
- lib/serialbench/cli/benchmark_cli.rb
|
301
|
+
- lib/serialbench/cli/environment_cli.rb
|
302
|
+
- lib/serialbench/cli/resultset_cli.rb
|
303
|
+
- lib/serialbench/cli/ruby_build_cli.rb
|
304
|
+
- lib/serialbench/config_manager.rb
|
250
305
|
- lib/serialbench/memory_profiler.rb
|
251
|
-
- lib/serialbench/
|
252
|
-
- lib/serialbench/
|
306
|
+
- lib/serialbench/models.rb
|
307
|
+
- lib/serialbench/models/benchmark_config.rb
|
308
|
+
- lib/serialbench/models/benchmark_result.rb
|
309
|
+
- lib/serialbench/models/environment_config.rb
|
310
|
+
- lib/serialbench/models/platform.rb
|
311
|
+
- lib/serialbench/models/result.rb
|
312
|
+
- lib/serialbench/models/result_set.rb
|
313
|
+
- lib/serialbench/models/result_store.rb
|
314
|
+
- lib/serialbench/ruby_build_manager.rb
|
315
|
+
- lib/serialbench/runners/asdf_runner.rb
|
316
|
+
- lib/serialbench/runners/base.rb
|
317
|
+
- lib/serialbench/runners/docker_runner.rb
|
253
318
|
- lib/serialbench/serializers.rb
|
254
319
|
- lib/serialbench/serializers/base_serializer.rb
|
255
320
|
- lib/serialbench/serializers/json/base_json_serializer.rb
|
@@ -260,21 +325,26 @@ files:
|
|
260
325
|
- lib/serialbench/serializers/toml/base_toml_serializer.rb
|
261
326
|
- lib/serialbench/serializers/toml/toml_rb_serializer.rb
|
262
327
|
- lib/serialbench/serializers/toml/tomlib_serializer.rb
|
263
|
-
- lib/serialbench/serializers/
|
328
|
+
- lib/serialbench/serializers/toml/tomlrb_serializer.rb
|
264
329
|
- lib/serialbench/serializers/xml/base_xml_serializer.rb
|
265
|
-
- lib/serialbench/serializers/xml/libxml_parser.rb
|
266
330
|
- lib/serialbench/serializers/xml/libxml_serializer.rb
|
267
|
-
- lib/serialbench/serializers/xml/nokogiri_parser.rb
|
268
331
|
- lib/serialbench/serializers/xml/nokogiri_serializer.rb
|
269
|
-
- lib/serialbench/serializers/xml/oga_parser.rb
|
270
332
|
- lib/serialbench/serializers/xml/oga_serializer.rb
|
271
|
-
- lib/serialbench/serializers/xml/ox_parser.rb
|
272
333
|
- lib/serialbench/serializers/xml/ox_serializer.rb
|
273
|
-
- lib/serialbench/serializers/xml/rexml_parser.rb
|
274
334
|
- lib/serialbench/serializers/xml/rexml_serializer.rb
|
275
335
|
- lib/serialbench/serializers/yaml/base_yaml_serializer.rb
|
276
336
|
- lib/serialbench/serializers/yaml/psych_serializer.rb
|
277
337
|
- lib/serialbench/serializers/yaml/syck_serializer.rb
|
338
|
+
- lib/serialbench/site_generator.rb
|
339
|
+
- lib/serialbench/templates/assets/css/benchmark_report.css
|
340
|
+
- lib/serialbench/templates/assets/css/format_based.css
|
341
|
+
- lib/serialbench/templates/assets/css/themes.css
|
342
|
+
- lib/serialbench/templates/assets/js/chart_helpers.js
|
343
|
+
- lib/serialbench/templates/assets/js/dashboard.js
|
344
|
+
- lib/serialbench/templates/assets/js/navigation.js
|
345
|
+
- lib/serialbench/templates/base.liquid
|
346
|
+
- lib/serialbench/templates/format_based.liquid
|
347
|
+
- lib/serialbench/templates/partials/chart_section.liquid
|
278
348
|
- lib/serialbench/version.rb
|
279
349
|
- serialbench.gemspec
|
280
350
|
homepage: https://github.com/metanorma/serialbench
|
data/config/ci.yml
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# Configuration for CI/GitHub Actions - Memory-safe settings
|
2
|
-
# Only runs small data sizes to avoid memory constraints
|
3
|
-
|
4
|
-
data_sizes:
|
5
|
-
- small
|
6
|
-
|
7
|
-
formats:
|
8
|
-
- xml
|
9
|
-
- json
|
10
|
-
- yaml
|
11
|
-
- toml
|
12
|
-
|
13
|
-
iterations:
|
14
|
-
small: 20
|
15
|
-
medium: 5
|
16
|
-
large: 2
|
17
|
-
|
18
|
-
# Disable memory profiling in CI to reduce memory usage
|
19
|
-
memory_profiling: false
|
20
|
-
|
21
|
-
# Reduce warmup iterations for faster CI
|
22
|
-
warmup_iterations: 2
|
data/config/full.yml
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# Configuration for comprehensive benchmarks - Full testing with all data sizes
|
2
|
-
# Used by Docker script for complete performance analysis
|
3
|
-
|
4
|
-
data_sizes:
|
5
|
-
- small
|
6
|
-
- medium
|
7
|
-
- large
|
8
|
-
|
9
|
-
formats:
|
10
|
-
- xml
|
11
|
-
- json
|
12
|
-
- yaml
|
13
|
-
- toml
|
14
|
-
|
15
|
-
iterations:
|
16
|
-
small: 20
|
17
|
-
medium: 5
|
18
|
-
large: 2
|
19
|
-
|
20
|
-
# Enable memory profiling for comprehensive analysis
|
21
|
-
memory_profiling: true
|
22
|
-
|
23
|
-
# Standard warmup iterations
|
24
|
-
warmup_iterations: 3
|
25
|
-
|
26
|
-
# Enable streaming benchmarks where supported
|
27
|
-
streaming_benchmarks: true
|
28
|
-
|
29
|
-
# Generate detailed reports
|
30
|
-
detailed_reports: true
|
data/docker/run-benchmarks.sh
DELETED
@@ -1,356 +0,0 @@
|
|
1
|
-
#!/bin/bash
|
2
|
-
|
3
|
-
# Serialbench Docker Multi-Ruby Version Benchmark Runner
|
4
|
-
# Runs comprehensive benchmarks across multiple Ruby versions using Docker
|
5
|
-
|
6
|
-
set -e
|
7
|
-
|
8
|
-
# Configuration
|
9
|
-
RUBY_VERSIONS=("3.0" "3.1" "3.2" "3.3" "3.4")
|
10
|
-
OUTPUT_DIR="docker-results"
|
11
|
-
CONFIG_FILE="config/full.yml"
|
12
|
-
DOCKERFILE="docker/Dockerfile.benchmark"
|
13
|
-
FORCE_REBUILD=false
|
14
|
-
|
15
|
-
# Colors for output
|
16
|
-
RED='\033[0;31m'
|
17
|
-
GREEN='\033[0;32m'
|
18
|
-
YELLOW='\033[1;33m'
|
19
|
-
BLUE='\033[0;34m'
|
20
|
-
NC='\033[0m' # No Color
|
21
|
-
|
22
|
-
# Helper functions
|
23
|
-
log_info() {
|
24
|
-
echo -e "${BLUE}[INFO]${NC} $1"
|
25
|
-
}
|
26
|
-
|
27
|
-
log_success() {
|
28
|
-
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
29
|
-
}
|
30
|
-
|
31
|
-
log_warning() {
|
32
|
-
echo -e "${YELLOW}[WARNING]${NC} $1"
|
33
|
-
}
|
34
|
-
|
35
|
-
log_error() {
|
36
|
-
echo -e "${RED}[ERROR]${NC} $1"
|
37
|
-
}
|
38
|
-
|
39
|
-
# Show usage information
|
40
|
-
show_usage() {
|
41
|
-
echo "Usage: $0 [OPTIONS]"
|
42
|
-
echo
|
43
|
-
echo "Run comprehensive benchmarks across multiple Ruby versions using Docker"
|
44
|
-
echo
|
45
|
-
echo "OPTIONS:"
|
46
|
-
echo " --force-rebuild, -f Force rebuild of Docker images even if they exist"
|
47
|
-
echo " --help, -h Show this help message"
|
48
|
-
echo
|
49
|
-
echo "EXAMPLES:"
|
50
|
-
echo " $0 Run benchmarks (skip building existing images)"
|
51
|
-
echo " $0 --force-rebuild Run benchmarks and rebuild all images"
|
52
|
-
echo " $0 -f Same as --force-rebuild"
|
53
|
-
echo
|
54
|
-
}
|
55
|
-
|
56
|
-
# Parse command line arguments
|
57
|
-
parse_arguments() {
|
58
|
-
while [[ $# -gt 0 ]]; do
|
59
|
-
case $1 in
|
60
|
-
--force-rebuild|-f)
|
61
|
-
FORCE_REBUILD=true
|
62
|
-
log_info "Force rebuild enabled - will rebuild all Docker images"
|
63
|
-
shift
|
64
|
-
;;
|
65
|
-
--help|-h)
|
66
|
-
show_usage
|
67
|
-
exit 0
|
68
|
-
;;
|
69
|
-
*)
|
70
|
-
log_error "Unknown option: $1"
|
71
|
-
show_usage
|
72
|
-
exit 1
|
73
|
-
;;
|
74
|
-
esac
|
75
|
-
done
|
76
|
-
}
|
77
|
-
|
78
|
-
# Check if Docker is available
|
79
|
-
check_docker() {
|
80
|
-
if ! command -v docker &> /dev/null; then
|
81
|
-
log_error "Docker is not installed or not in PATH"
|
82
|
-
exit 1
|
83
|
-
fi
|
84
|
-
|
85
|
-
if ! docker info &> /dev/null; then
|
86
|
-
log_error "Docker daemon is not running"
|
87
|
-
exit 1
|
88
|
-
fi
|
89
|
-
|
90
|
-
log_success "Docker is available"
|
91
|
-
}
|
92
|
-
|
93
|
-
# Clean up previous results
|
94
|
-
cleanup_results() {
|
95
|
-
if [ -d "$OUTPUT_DIR" ]; then
|
96
|
-
log_info "Cleaning up previous results in $OUTPUT_DIR"
|
97
|
-
rm -rf "$OUTPUT_DIR"
|
98
|
-
fi
|
99
|
-
mkdir -p "$OUTPUT_DIR"
|
100
|
-
}
|
101
|
-
|
102
|
-
# Build Docker image for specific Ruby version
|
103
|
-
build_image() {
|
104
|
-
local ruby_version=$1
|
105
|
-
local image_name="serialbench:ruby-${ruby_version}"
|
106
|
-
|
107
|
-
# Check if image already exists (unless force rebuild is enabled)
|
108
|
-
if [ "$FORCE_REBUILD" = false ] && docker image inspect "${image_name}" >/dev/null 2>&1; then
|
109
|
-
log_success "Image ${image_name} already exists, skipping build"
|
110
|
-
return 0
|
111
|
-
fi
|
112
|
-
|
113
|
-
if [ "$FORCE_REBUILD" = true ] && docker image inspect "${image_name}" >/dev/null 2>&1; then
|
114
|
-
log_info "Force rebuild enabled, removing existing image ${image_name}..."
|
115
|
-
docker rmi "${image_name}" >/dev/null 2>&1 || true
|
116
|
-
fi
|
117
|
-
|
118
|
-
log_info "Building Docker image for Ruby ${ruby_version}..."
|
119
|
-
|
120
|
-
if docker build \
|
121
|
-
--build-arg RUBY_VERSION="${ruby_version}" \
|
122
|
-
-t "${image_name}" \
|
123
|
-
-f "${DOCKERFILE}" \
|
124
|
-
. > "${OUTPUT_DIR}/build-ruby-${ruby_version}.log" 2>&1; then
|
125
|
-
log_success "Built image ${image_name}"
|
126
|
-
return 0
|
127
|
-
else
|
128
|
-
log_error "Failed to build image for Ruby ${ruby_version}"
|
129
|
-
log_error "Check ${OUTPUT_DIR}/build-ruby-${ruby_version}.log for details"
|
130
|
-
return 1
|
131
|
-
fi
|
132
|
-
}
|
133
|
-
|
134
|
-
# Run benchmarks for specific Ruby version
|
135
|
-
run_benchmark() {
|
136
|
-
local ruby_version=$1
|
137
|
-
local image_name="serialbench:ruby-${ruby_version}"
|
138
|
-
local container_name="serialbench-ruby-${ruby_version}"
|
139
|
-
local result_dir="${OUTPUT_DIR}/ruby-${ruby_version}"
|
140
|
-
|
141
|
-
log_info "Running benchmarks for Ruby ${ruby_version}..."
|
142
|
-
|
143
|
-
# Create result directory
|
144
|
-
mkdir -p "${result_dir}"
|
145
|
-
|
146
|
-
# Run container with benchmark
|
147
|
-
if docker run \
|
148
|
-
--name "${container_name}" \
|
149
|
-
--rm \
|
150
|
-
-v "$(pwd)/${result_dir}:/app/results" \
|
151
|
-
"${image_name}" \
|
152
|
-
> "${result_dir}/benchmark.log" 2>&1; then
|
153
|
-
log_success "Completed benchmarks for Ruby ${ruby_version}"
|
154
|
-
return 0
|
155
|
-
else
|
156
|
-
log_error "Failed to run benchmarks for Ruby ${ruby_version}"
|
157
|
-
log_error "Check ${result_dir}/benchmark.log for details"
|
158
|
-
return 1
|
159
|
-
fi
|
160
|
-
}
|
161
|
-
|
162
|
-
# Merge results from all Ruby versions
|
163
|
-
merge_results() {
|
164
|
-
log_info "Merging results from all Ruby versions..."
|
165
|
-
|
166
|
-
local input_dirs=""
|
167
|
-
for version in "${RUBY_VERSIONS[@]}"; do
|
168
|
-
local result_dir="${OUTPUT_DIR}/ruby-${version}"
|
169
|
-
if [ -d "${result_dir}" ] && [ -f "${result_dir}/data/results.json" ]; then
|
170
|
-
input_dirs="${input_dirs} ${result_dir}"
|
171
|
-
else
|
172
|
-
log_warning "No results found for Ruby ${version}"
|
173
|
-
fi
|
174
|
-
done
|
175
|
-
|
176
|
-
if [ -n "$input_dirs" ]; then
|
177
|
-
if bundle exec serialbench merge_results ${input_dirs} "${OUTPUT_DIR}/merged"; then
|
178
|
-
log_success "Results merged successfully"
|
179
|
-
else
|
180
|
-
log_error "Failed to merge results"
|
181
|
-
return 1
|
182
|
-
fi
|
183
|
-
else
|
184
|
-
log_error "No valid results to merge"
|
185
|
-
return 1
|
186
|
-
fi
|
187
|
-
}
|
188
|
-
|
189
|
-
# Generate GitHub Pages
|
190
|
-
generate_github_pages() {
|
191
|
-
log_info "Generating GitHub Pages..."
|
192
|
-
|
193
|
-
local input_dirs=""
|
194
|
-
for version in "${RUBY_VERSIONS[@]}"; do
|
195
|
-
local result_dir="${OUTPUT_DIR}/ruby-${version}"
|
196
|
-
if [ -d "${result_dir}" ] && [ -f "${result_dir}/data/results.json" ]; then
|
197
|
-
input_dirs="${input_dirs} ${result_dir}"
|
198
|
-
fi
|
199
|
-
done
|
200
|
-
|
201
|
-
if [ -n "$input_dirs" ]; then
|
202
|
-
if bundle exec serialbench github_pages ${input_dirs} "${OUTPUT_DIR}/docs"; then
|
203
|
-
log_success "GitHub Pages generated successfully"
|
204
|
-
log_info "Open ${OUTPUT_DIR}/docs/index.html to view results"
|
205
|
-
else
|
206
|
-
log_error "Failed to generate GitHub Pages"
|
207
|
-
return 1
|
208
|
-
fi
|
209
|
-
else
|
210
|
-
log_error "No valid results for GitHub Pages generation"
|
211
|
-
return 1
|
212
|
-
fi
|
213
|
-
}
|
214
|
-
|
215
|
-
# Build all Docker images (fail fast)
|
216
|
-
build_all_images() {
|
217
|
-
local failed_builds=()
|
218
|
-
|
219
|
-
for version in "${RUBY_VERSIONS[@]}"; do
|
220
|
-
if ! build_image "${version}"; then
|
221
|
-
failed_builds+=("${version}")
|
222
|
-
fi
|
223
|
-
done
|
224
|
-
|
225
|
-
if [ ${#failed_builds[@]} -gt 0 ]; then
|
226
|
-
log_error "Failed to build images for Ruby versions: ${failed_builds[*]}"
|
227
|
-
log_error "Aborting benchmark run due to build failures"
|
228
|
-
exit 1
|
229
|
-
fi
|
230
|
-
|
231
|
-
log_success "All Docker images built successfully"
|
232
|
-
}
|
233
|
-
|
234
|
-
# Run benchmarks on all built images
|
235
|
-
run_all_benchmarks() {
|
236
|
-
local successful_runs=0
|
237
|
-
local failed_runs=()
|
238
|
-
|
239
|
-
for version in "${RUBY_VERSIONS[@]}"; do
|
240
|
-
if run_benchmark "${version}"; then
|
241
|
-
((successful_runs++))
|
242
|
-
else
|
243
|
-
failed_runs+=("${version}")
|
244
|
-
log_warning "Benchmark failed for Ruby ${version}"
|
245
|
-
fi
|
246
|
-
done
|
247
|
-
|
248
|
-
log_info "Benchmark runs completed: ${successful_runs}/${#RUBY_VERSIONS[@]} successful"
|
249
|
-
|
250
|
-
if [ ${#failed_runs[@]} -gt 0 ]; then
|
251
|
-
log_warning "Failed benchmark runs for Ruby versions: ${failed_runs[*]}"
|
252
|
-
fi
|
253
|
-
|
254
|
-
# Store results for processing phase
|
255
|
-
echo "${successful_runs}" > "${OUTPUT_DIR}/.successful_runs"
|
256
|
-
}
|
257
|
-
|
258
|
-
# Process results (fail if no successful runs)
|
259
|
-
process_results() {
|
260
|
-
local successful_runs
|
261
|
-
if [ -f "${OUTPUT_DIR}/.successful_runs" ]; then
|
262
|
-
successful_runs=$(cat "${OUTPUT_DIR}/.successful_runs")
|
263
|
-
else
|
264
|
-
successful_runs=0
|
265
|
-
fi
|
266
|
-
|
267
|
-
if [ "${successful_runs}" -eq 0 ]; then
|
268
|
-
log_error "No successful benchmark runs to process"
|
269
|
-
exit 1
|
270
|
-
fi
|
271
|
-
|
272
|
-
log_info "Processing ${successful_runs} successful benchmark results..."
|
273
|
-
|
274
|
-
if ! merge_results; then
|
275
|
-
log_error "Failed to merge results"
|
276
|
-
exit 1
|
277
|
-
fi
|
278
|
-
|
279
|
-
if ! generate_github_pages; then
|
280
|
-
log_error "Failed to generate GitHub Pages"
|
281
|
-
exit 1
|
282
|
-
fi
|
283
|
-
|
284
|
-
log_success "Results processed successfully"
|
285
|
-
}
|
286
|
-
|
287
|
-
# Print summary
|
288
|
-
print_summary() {
|
289
|
-
echo
|
290
|
-
echo "=========================================="
|
291
|
-
echo "Serialbench Docker Benchmark Summary"
|
292
|
-
echo "=========================================="
|
293
|
-
echo
|
294
|
-
|
295
|
-
for version in "${RUBY_VERSIONS[@]}"; do
|
296
|
-
local result_dir="${OUTPUT_DIR}/ruby-${version}"
|
297
|
-
if [ -f "${result_dir}/data/results.json" ]; then
|
298
|
-
echo "✅ Ruby ${version}: Completed"
|
299
|
-
else
|
300
|
-
echo "❌ Ruby ${version}: Failed"
|
301
|
-
fi
|
302
|
-
done
|
303
|
-
|
304
|
-
echo
|
305
|
-
if [ -f "${OUTPUT_DIR}/merged/merged_results.json" ]; then
|
306
|
-
echo "📊 Merged results: ${OUTPUT_DIR}/merged/merged_results.json"
|
307
|
-
fi
|
308
|
-
|
309
|
-
if [ -f "${OUTPUT_DIR}/docs/index.html" ]; then
|
310
|
-
echo "🌐 GitHub Pages: ${OUTPUT_DIR}/docs/index.html"
|
311
|
-
echo
|
312
|
-
echo "To view results, open: file://$(pwd)/${OUTPUT_DIR}/docs/index.html"
|
313
|
-
fi
|
314
|
-
|
315
|
-
echo
|
316
|
-
}
|
317
|
-
|
318
|
-
# Main execution
|
319
|
-
main() {
|
320
|
-
# Parse command line arguments first
|
321
|
-
parse_arguments "$@"
|
322
|
-
|
323
|
-
echo "=========================================="
|
324
|
-
echo "Serialbench Docker Multi-Ruby Benchmarks"
|
325
|
-
echo "=========================================="
|
326
|
-
echo
|
327
|
-
|
328
|
-
# Check prerequisites
|
329
|
-
check_docker
|
330
|
-
|
331
|
-
# Clean up
|
332
|
-
cleanup_results
|
333
|
-
|
334
|
-
# Phase 1: Build all images (fail fast)
|
335
|
-
echo
|
336
|
-
log_info "Phase 1: Building all Docker images..."
|
337
|
-
build_all_images
|
338
|
-
|
339
|
-
# Phase 2: Run all benchmarks
|
340
|
-
echo
|
341
|
-
log_info "Phase 2: Running benchmarks on all images..."
|
342
|
-
run_all_benchmarks
|
343
|
-
|
344
|
-
# Phase 3: Process results (fail if no successful runs)
|
345
|
-
echo
|
346
|
-
log_info "Phase 3: Processing results..."
|
347
|
-
process_results
|
348
|
-
|
349
|
-
# Print summary
|
350
|
-
print_summary
|
351
|
-
|
352
|
-
log_success "Docker benchmark run completed!"
|
353
|
-
}
|
354
|
-
|
355
|
-
# Run main function
|
356
|
-
main "$@"
|