mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-26 08:18:18 +00:00
46557cddd1
Signed-off-by: Muhammed Hussain Karimi <info@karimi.dev>
266 lines
7.7 KiB
Bash
Executable File
266 lines
7.7 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
# Copyright 2024 RustFS Team
|
||
#
|
||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
# you may not use this file except in compliance with the License.
|
||
# You may obtain a copy of the License at
|
||
#
|
||
# http://www.apache.org/licenses/LICENSE-2.0
|
||
#
|
||
# Unless required by applicable law or agreed to in writing, software
|
||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
# See the License for the specific language governing permissions and
|
||
# limitations under the License.
|
||
|
||
|
||
# Reed-Solomon SIMD performance benchmark script
|
||
# Run erasure-coding benchmarks using the high-performance SIMD implementation
|
||
|
||
set -e
|
||
|
||
# ANSI color codes
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
PURPLE='\033[0;35m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Print colored messages
|
||
print_info() {
|
||
echo -e "${BLUE}ℹ️ $1${NC}"
|
||
}
|
||
|
||
print_success() {
|
||
echo -e "${GREEN}✅ $1${NC}"
|
||
}
|
||
|
||
print_warning() {
|
||
echo -e "${YELLOW}⚠️ $1${NC}"
|
||
}
|
||
|
||
print_error() {
|
||
echo -e "${RED}❌ $1${NC}"
|
||
}
|
||
|
||
# Validate system requirements
|
||
check_requirements() {
|
||
print_info "Checking system requirements..."
|
||
|
||
# Check for Rust
|
||
if ! command -v cargo &> /dev/null; then
|
||
print_error "Cargo not found; install Rust first"
|
||
exit 1
|
||
fi
|
||
|
||
# Check criterion support
|
||
if ! cargo --list | grep -q "bench"; then
|
||
print_error "Benchmark support missing; use a Rust toolchain with criterion support"
|
||
exit 1
|
||
fi
|
||
|
||
print_success "System requirements satisfied"
|
||
}
|
||
|
||
# Remove previous benchmark artifacts
|
||
cleanup() {
|
||
print_info "Cleaning previous benchmark artifacts..."
|
||
rm -rf target/criterion
|
||
print_success "Cleanup complete"
|
||
}
|
||
|
||
# Run SIMD-only benchmarks
|
||
run_simd_benchmark() {
|
||
print_info "🎯 Starting SIMD-only benchmark run..."
|
||
echo "================================================"
|
||
|
||
cargo bench --bench comparison_benchmark \
|
||
-- --save-baseline simd_baseline
|
||
|
||
print_success "SIMD-only benchmarks completed"
|
||
}
|
||
|
||
# Run the full benchmark suite
|
||
run_full_benchmark() {
|
||
print_info "🚀 Starting full benchmark suite..."
|
||
echo "================================================"
|
||
|
||
# Execute detailed benchmarks
|
||
cargo bench --bench erasure_benchmark
|
||
|
||
print_success "Full benchmark suite finished"
|
||
}
|
||
|
||
# Run performance tests
|
||
run_performance_test() {
|
||
print_info "📊 Starting performance tests..."
|
||
echo "================================================"
|
||
|
||
print_info "Step 1: running encoding benchmarks..."
|
||
cargo bench --bench comparison_benchmark \
|
||
-- encode --save-baseline encode_baseline
|
||
|
||
print_info "Step 2: running decoding benchmarks..."
|
||
cargo bench --bench comparison_benchmark \
|
||
-- decode --save-baseline decode_baseline
|
||
|
||
print_success "Performance tests completed"
|
||
}
|
||
|
||
# Run large dataset tests
|
||
run_large_data_test() {
|
||
print_info "🗂️ Starting large-dataset tests..."
|
||
echo "================================================"
|
||
|
||
cargo bench --bench erasure_benchmark \
|
||
-- large_data --save-baseline large_data_baseline
|
||
|
||
print_success "Large-dataset tests completed"
|
||
}
|
||
|
||
# Generate comparison report
|
||
generate_comparison_report() {
|
||
print_info "📊 Generating performance report..."
|
||
|
||
if [ -d "target/criterion" ]; then
|
||
print_info "Benchmark results saved under target/criterion/"
|
||
print_info "Open target/criterion/report/index.html for the HTML report"
|
||
|
||
# If Python is available, start a simple HTTP server to browse the report
|
||
if command -v python3 &> /dev/null; then
|
||
print_info "Run the following command to serve the report locally:"
|
||
echo " cd target/criterion && python3 -m http.server 8080"
|
||
echo " Then open http://localhost:8080/report/index.html"
|
||
fi
|
||
else
|
||
print_warning "Benchmark result directory not found"
|
||
fi
|
||
}
|
||
|
||
# Quick test mode
|
||
run_quick_test() {
|
||
print_info "🏃 Running quick performance test..."
|
||
|
||
print_info "Testing SIMD encoding performance..."
|
||
cargo bench --bench comparison_benchmark \
|
||
-- encode --quick
|
||
|
||
print_info "Testing SIMD decoding performance..."
|
||
cargo bench --bench comparison_benchmark \
|
||
-- decode --quick
|
||
|
||
print_success "Quick test complete"
|
||
}
|
||
|
||
# Display help
|
||
show_help() {
|
||
echo "Reed-Solomon SIMD performance benchmark script"
|
||
echo ""
|
||
echo "Modes:"
|
||
echo " 🎯 simd High-performance reed-solomon-simd implementation"
|
||
echo ""
|
||
echo "Usage:"
|
||
echo " $0 [command]"
|
||
echo ""
|
||
echo "Commands:"
|
||
echo " quick Run the quick performance test"
|
||
echo " full Run the full benchmark suite"
|
||
echo " performance Run detailed performance tests"
|
||
echo " simd Run the SIMD-only tests"
|
||
echo " large Run large-dataset tests"
|
||
echo " clean Remove previous results"
|
||
echo " help Show this help message"
|
||
echo ""
|
||
echo "Examples:"
|
||
echo " $0 quick # Quick performance test"
|
||
echo " $0 performance # Detailed performance test"
|
||
echo " $0 full # Full benchmark suite"
|
||
echo " $0 simd # SIMD-only benchmark"
|
||
echo " $0 large # Large-dataset benchmark"
|
||
echo ""
|
||
echo "Features:"
|
||
echo " - Uses the high-performance reed-solomon-simd implementation"
|
||
echo " - Caches encoder/decoder instances"
|
||
echo " - Optimized memory management and thread safety"
|
||
echo " - Cross-platform SIMD instruction support"
|
||
}
|
||
|
||
# Show benchmark configuration
|
||
show_test_info() {
|
||
print_info "📋 Benchmark configuration:"
|
||
echo " - Working directory: $(pwd)"
|
||
echo " - Rust version: $(rustc --version)"
|
||
echo " - Cargo version: $(cargo --version)"
|
||
echo " - CPU architecture: $(uname -m)"
|
||
echo " - Operating system: $(uname -s)"
|
||
|
||
# Inspect CPU capabilities
|
||
if [ -f "/proc/cpuinfo" ]; then
|
||
echo " - CPU model: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs)"
|
||
if grep -q "avx2" /proc/cpuinfo; then
|
||
echo " - SIMD support: AVX2 ✅ (using advanced SIMD optimizations)"
|
||
elif grep -q "sse4" /proc/cpuinfo; then
|
||
echo " - SIMD support: SSE4 ✅ (using SIMD optimizations)"
|
||
else
|
||
echo " - SIMD support: baseline features"
|
||
fi
|
||
fi
|
||
|
||
echo " - Implementation: reed-solomon-simd (SIMD-optimized)"
|
||
echo " - Highlights: instance caching, thread safety, cross-platform SIMD"
|
||
echo ""
|
||
}
|
||
|
||
# Main entry point
|
||
main() {
|
||
print_info "🧪 Reed-Solomon SIMD benchmark suite"
|
||
echo "================================================"
|
||
|
||
check_requirements
|
||
show_test_info
|
||
|
||
case "${1:-help}" in
|
||
"quick")
|
||
run_quick_test
|
||
generate_comparison_report
|
||
;;
|
||
"full")
|
||
cleanup
|
||
run_full_benchmark
|
||
generate_comparison_report
|
||
;;
|
||
"performance")
|
||
cleanup
|
||
run_performance_test
|
||
generate_comparison_report
|
||
;;
|
||
"simd")
|
||
cleanup
|
||
run_simd_benchmark
|
||
generate_comparison_report
|
||
;;
|
||
"large")
|
||
cleanup
|
||
run_large_data_test
|
||
generate_comparison_report
|
||
;;
|
||
"clean")
|
||
cleanup
|
||
;;
|
||
"help"|"--help"|"-h")
|
||
show_help
|
||
;;
|
||
*)
|
||
print_error "Unknown command: $1"
|
||
echo ""
|
||
show_help
|
||
exit 1
|
||
;;
|
||
esac
|
||
|
||
print_success "✨ Benchmark run completed!"
|
||
}
|
||
|
||
# Launch script
|
||
main "$@" |