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.
Files changed (84) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/benchmark.yml +13 -5
  3. data/.github/workflows/docker.yml +35 -9
  4. data/.github/workflows/rake.yml +15 -0
  5. data/Gemfile +2 -1
  6. data/README.adoc +267 -1129
  7. data/Rakefile +0 -55
  8. data/config/benchmarks/full.yml +29 -0
  9. data/config/benchmarks/short.yml +26 -0
  10. data/config/environments/asdf-ruby-3.2.yml +8 -0
  11. data/config/environments/asdf-ruby-3.3.yml +8 -0
  12. data/config/environments/docker-ruby-3.0.yml +9 -0
  13. data/config/environments/docker-ruby-3.1.yml +9 -0
  14. data/config/environments/docker-ruby-3.2.yml +9 -0
  15. data/config/environments/docker-ruby-3.3.yml +9 -0
  16. data/config/environments/docker-ruby-3.4.yml +9 -0
  17. data/docker/Dockerfile.alpine +33 -0
  18. data/docker/{Dockerfile.benchmark → Dockerfile.ubuntu} +4 -3
  19. data/docker/README.md +2 -2
  20. data/exe/serialbench +1 -1
  21. data/lib/serialbench/benchmark_runner.rb +261 -423
  22. data/lib/serialbench/cli/base_cli.rb +51 -0
  23. data/lib/serialbench/cli/benchmark_cli.rb +380 -0
  24. data/lib/serialbench/cli/environment_cli.rb +181 -0
  25. data/lib/serialbench/cli/resultset_cli.rb +215 -0
  26. data/lib/serialbench/cli/ruby_build_cli.rb +238 -0
  27. data/lib/serialbench/cli.rb +58 -601
  28. data/lib/serialbench/config_manager.rb +140 -0
  29. data/lib/serialbench/models/benchmark_config.rb +63 -0
  30. data/lib/serialbench/models/benchmark_result.rb +45 -0
  31. data/lib/serialbench/models/environment_config.rb +71 -0
  32. data/lib/serialbench/models/platform.rb +59 -0
  33. data/lib/serialbench/models/result.rb +53 -0
  34. data/lib/serialbench/models/result_set.rb +71 -0
  35. data/lib/serialbench/models/result_store.rb +108 -0
  36. data/lib/serialbench/models.rb +54 -0
  37. data/lib/serialbench/ruby_build_manager.rb +153 -0
  38. data/lib/serialbench/runners/asdf_runner.rb +296 -0
  39. data/lib/serialbench/runners/base.rb +32 -0
  40. data/lib/serialbench/runners/docker_runner.rb +142 -0
  41. data/lib/serialbench/serializers/base_serializer.rb +8 -16
  42. data/lib/serialbench/serializers/json/base_json_serializer.rb +4 -4
  43. data/lib/serialbench/serializers/json/json_serializer.rb +0 -2
  44. data/lib/serialbench/serializers/json/oj_serializer.rb +0 -2
  45. data/lib/serialbench/serializers/json/yajl_serializer.rb +0 -2
  46. data/lib/serialbench/serializers/toml/base_toml_serializer.rb +5 -3
  47. data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +0 -2
  48. data/lib/serialbench/serializers/toml/tomlib_serializer.rb +0 -2
  49. data/lib/serialbench/serializers/toml/tomlrb_serializer.rb +56 -0
  50. data/lib/serialbench/serializers/xml/base_xml_serializer.rb +4 -9
  51. data/lib/serialbench/serializers/xml/libxml_serializer.rb +0 -2
  52. data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +0 -2
  53. data/lib/serialbench/serializers/xml/oga_serializer.rb +0 -2
  54. data/lib/serialbench/serializers/xml/ox_serializer.rb +0 -2
  55. data/lib/serialbench/serializers/xml/rexml_serializer.rb +0 -2
  56. data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +5 -1
  57. data/lib/serialbench/serializers/yaml/syck_serializer.rb +59 -22
  58. data/lib/serialbench/serializers.rb +23 -6
  59. data/lib/serialbench/site_generator.rb +105 -0
  60. data/lib/serialbench/templates/assets/css/benchmark_report.css +535 -0
  61. data/lib/serialbench/templates/assets/css/format_based.css +526 -0
  62. data/lib/serialbench/templates/assets/css/themes.css +588 -0
  63. data/lib/serialbench/templates/assets/js/chart_helpers.js +381 -0
  64. data/lib/serialbench/templates/assets/js/dashboard.js +796 -0
  65. data/lib/serialbench/templates/assets/js/navigation.js +142 -0
  66. data/lib/serialbench/templates/base.liquid +49 -0
  67. data/lib/serialbench/templates/format_based.liquid +279 -0
  68. data/lib/serialbench/templates/partials/chart_section.liquid +4 -0
  69. data/lib/serialbench/version.rb +1 -1
  70. data/lib/serialbench.rb +2 -31
  71. data/serialbench.gemspec +4 -1
  72. metadata +86 -16
  73. data/config/ci.yml +0 -22
  74. data/config/full.yml +0 -30
  75. data/docker/run-benchmarks.sh +0 -356
  76. data/lib/serialbench/chart_generator.rb +0 -821
  77. data/lib/serialbench/result_formatter.rb +0 -182
  78. data/lib/serialbench/result_merger.rb +0 -1201
  79. data/lib/serialbench/serializers/xml/base_parser.rb +0 -69
  80. data/lib/serialbench/serializers/xml/libxml_parser.rb +0 -98
  81. data/lib/serialbench/serializers/xml/nokogiri_parser.rb +0 -111
  82. data/lib/serialbench/serializers/xml/oga_parser.rb +0 -85
  83. data/lib/serialbench/serializers/xml/ox_parser.rb +0 -64
  84. 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.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-07 00:00:00.000000000 Z
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: rexml
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/ci.yml
241
- - config/full.yml
242
- - docker/Dockerfile.benchmark
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/result_formatter.rb
252
- - lib/serialbench/result_merger.rb
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/xml/base_parser.rb
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
@@ -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 "$@"