serialbench 0.1.1 → 0.1.3

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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/benchmark.yml +273 -220
  3. data/.github/workflows/rake.yml +26 -0
  4. data/.github/workflows/windows-debug.yml +171 -0
  5. data/.gitignore +32 -0
  6. data/.rubocop.yml +1 -0
  7. data/.rubocop_todo.yml +274 -0
  8. data/Gemfile +14 -1
  9. data/README.adoc +292 -1118
  10. data/Rakefile +0 -55
  11. data/config/benchmarks/full.yml +29 -0
  12. data/config/benchmarks/short.yml +26 -0
  13. data/config/environments/asdf-ruby-3.2.yml +8 -0
  14. data/config/environments/asdf-ruby-3.3.yml +8 -0
  15. data/config/environments/docker-ruby-3.0.yml +9 -0
  16. data/config/environments/docker-ruby-3.1.yml +9 -0
  17. data/config/environments/docker-ruby-3.2.yml +9 -0
  18. data/config/environments/docker-ruby-3.3.yml +9 -0
  19. data/config/environments/docker-ruby-3.4.yml +9 -0
  20. data/data/schemas/result.yml +29 -0
  21. data/docker/Dockerfile.alpine +33 -0
  22. data/docker/{Dockerfile.benchmark → Dockerfile.ubuntu} +4 -3
  23. data/docker/README.md +2 -2
  24. data/docs/PLATFORM_VALIDATION_FIX.md +79 -0
  25. data/docs/SYCK_YAML_FIX.md +91 -0
  26. data/docs/WEBSITE_COMPLETION_PLAN.md +440 -0
  27. data/docs/WINDOWS_LIBXML_FIX.md +136 -0
  28. data/docs/WINDOWS_SETUP.md +122 -0
  29. data/exe/serialbench +1 -1
  30. data/lib/serialbench/benchmark_runner.rb +261 -423
  31. data/lib/serialbench/cli/base_cli.rb +51 -0
  32. data/lib/serialbench/cli/benchmark_cli.rb +453 -0
  33. data/lib/serialbench/cli/environment_cli.rb +181 -0
  34. data/lib/serialbench/cli/resultset_cli.rb +261 -0
  35. data/lib/serialbench/cli/ruby_build_cli.rb +225 -0
  36. data/lib/serialbench/cli/validate_cli.rb +88 -0
  37. data/lib/serialbench/cli.rb +61 -600
  38. data/lib/serialbench/config_manager.rb +129 -0
  39. data/lib/serialbench/models/benchmark_config.rb +75 -0
  40. data/lib/serialbench/models/benchmark_result.rb +81 -0
  41. data/lib/serialbench/models/environment_config.rb +72 -0
  42. data/lib/serialbench/models/platform.rb +111 -0
  43. data/lib/serialbench/models/result.rb +80 -0
  44. data/lib/serialbench/models/result_set.rb +79 -0
  45. data/lib/serialbench/models/result_store.rb +108 -0
  46. data/lib/serialbench/models.rb +54 -0
  47. data/lib/serialbench/ruby_build_manager.rb +149 -0
  48. data/lib/serialbench/runners/asdf_runner.rb +296 -0
  49. data/lib/serialbench/runners/base.rb +32 -0
  50. data/lib/serialbench/runners/docker_runner.rb +140 -0
  51. data/lib/serialbench/runners/local_runner.rb +71 -0
  52. data/lib/serialbench/serializers/base_serializer.rb +9 -17
  53. data/lib/serialbench/serializers/json/base_json_serializer.rb +4 -4
  54. data/lib/serialbench/serializers/json/json_serializer.rb +0 -2
  55. data/lib/serialbench/serializers/json/oj_serializer.rb +0 -2
  56. data/lib/serialbench/serializers/json/rapidjson_serializer.rb +1 -1
  57. data/lib/serialbench/serializers/json/yajl_serializer.rb +0 -2
  58. data/lib/serialbench/serializers/toml/base_toml_serializer.rb +5 -5
  59. data/lib/serialbench/serializers/toml/toml_rb_serializer.rb +1 -3
  60. data/lib/serialbench/serializers/toml/tomlib_serializer.rb +1 -3
  61. data/lib/serialbench/serializers/toml/tomlrb_serializer.rb +56 -0
  62. data/lib/serialbench/serializers/xml/base_xml_serializer.rb +4 -9
  63. data/lib/serialbench/serializers/xml/libxml_serializer.rb +4 -10
  64. data/lib/serialbench/serializers/xml/nokogiri_serializer.rb +2 -4
  65. data/lib/serialbench/serializers/xml/oga_serializer.rb +4 -10
  66. data/lib/serialbench/serializers/xml/ox_serializer.rb +2 -4
  67. data/lib/serialbench/serializers/xml/rexml_serializer.rb +3 -5
  68. data/lib/serialbench/serializers/yaml/base_yaml_serializer.rb +5 -1
  69. data/lib/serialbench/serializers/yaml/psych_serializer.rb +1 -1
  70. data/lib/serialbench/serializers/yaml/syck_serializer.rb +60 -23
  71. data/lib/serialbench/serializers.rb +23 -6
  72. data/lib/serialbench/site_generator.rb +283 -0
  73. data/lib/serialbench/templates/assets/css/benchmark_report.css +535 -0
  74. data/lib/serialbench/templates/assets/css/format_based.css +474 -0
  75. data/lib/serialbench/templates/assets/css/themes.css +589 -0
  76. data/lib/serialbench/templates/assets/js/chart_helpers.js +411 -0
  77. data/lib/serialbench/templates/assets/js/dashboard.js +795 -0
  78. data/lib/serialbench/templates/assets/js/navigation.js +142 -0
  79. data/lib/serialbench/templates/base.liquid +49 -0
  80. data/lib/serialbench/templates/format_based.liquid +507 -0
  81. data/lib/serialbench/templates/partials/chart_section.liquid +4 -0
  82. data/lib/serialbench/version.rb +1 -1
  83. data/lib/serialbench/yaml_validator.rb +36 -0
  84. data/lib/serialbench.rb +2 -31
  85. data/serialbench.gemspec +15 -3
  86. metadata +106 -25
  87. data/.github/workflows/ci.yml +0 -74
  88. data/.github/workflows/docker.yml +0 -246
  89. data/config/ci.yml +0 -22
  90. data/config/full.yml +0 -30
  91. data/docker/run-benchmarks.sh +0 -356
  92. data/lib/serialbench/chart_generator.rb +0 -821
  93. data/lib/serialbench/result_formatter.rb +0 -182
  94. data/lib/serialbench/result_merger.rb +0 -1201
  95. data/lib/serialbench/serializers/xml/base_parser.rb +0 -69
  96. data/lib/serialbench/serializers/xml/libxml_parser.rb +0 -98
  97. data/lib/serialbench/serializers/xml/nokogiri_parser.rb +0 -111
  98. data/lib/serialbench/serializers/xml/oga_parser.rb +0 -85
  99. data/lib/serialbench/serializers/xml/ox_parser.rb +0 -64
  100. data/lib/serialbench/serializers/xml/rexml_parser.rb +0 -129
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 "$@"