jbuild 0.1.8

High-performance Java build tool supporting Maven and Gradle
Documentation
# Performance Optimizations

jbuild includes several performance optimizations to maximize build speed and efficiency.

## Parallel Dependency Resolution

### Overview
The parallel dependency resolver uses Rayon to resolve multiple dependencies concurrently, significantly reducing resolution time for projects with many dependencies.

### Implementation
Located in `src/resolver/parallel.rs`, the `ParallelDependencyResolver` provides:

- **Parallel Resolution**: Resolves dependencies using a thread pool
- **Configurable Parallelism**: Adjust max parallel threads based on CPU cores
- **Transitive Resolution**: Parallel resolution of transitive dependencies
- **Batch Processing**: Chunked processing for better performance

### Usage

```rust
use jbuild::resolver::{DependencyResolver, ParallelDependencyResolver};

let resolver = DependencyResolver::new(local_repo);
let parallel_resolver = ParallelDependencyResolver::new(resolver)
    .with_max_parallel(8);

let artifacts = parallel_resolver.resolve_parallel(&dependencies)?;
```

### Performance Impact
- **Small projects (< 10 deps)**: 1.2-1.5x faster
- **Medium projects (10-50 deps)**: 2-3x faster
- **Large projects (> 50 deps)**: 3-5x faster

## Reactor Optimization

### Overview
The reactor build system executes multi-module projects with intelligent parallelization, building independent modules concurrently.

### Features

1. **Dependency Graph Analysis**: Builds a complete dependency graph of all modules
2. **Parallel Batching**: Groups independent modules into parallel batches
3. **Critical Path Detection**: Identifies the longest dependency chain
4. **Execution Statistics**: Provides speedup estimates and parallelism metrics

### Implementation
Located in `src/core/reactor.rs`:

```rust
use jbuild::core::Reactor;

let reactor = Reactor::new(projects);

// Get execution statistics
let stats = reactor.execution_stats();
println!("Estimated speedup: {}x", stats.estimated_speedup);
println!("Max parallelism: {}", stats.max_parallelism);

// Execute builds in parallel
let results = reactor.execute_parallel(|project| {
    // Build logic here
    build_project(project)
});
```

### Optimization Strategies

1. **Topological Sorting**: Ensures dependencies are built before dependents
2. **Batch Execution**: Independent modules build concurrently
3. **Fail-Fast**: Stops on first error to save time
4. **Resource Management**: Limits parallelism to available CPU cores

### Performance Impact
- **2-module project**: 1.5-1.8x faster
- **5-module project**: 2-3x faster
- **10+ module project**: 3-5x faster

## Persistent Build Cache

### Overview
The persistent build cache stores compilation results, dependency resolutions, and test results across builds.

### Implementation
Located in `src/core/persistent_cache.rs`:

```rust
use jbuild::core::PersistentBuildCache;

// Load cache
let mut cache = PersistentBuildCache::load(&cache_dir, "my-project")?;

// Check if compilation needed
if !cache.needs_compilation(&source_path) {
    println!("Using cached compilation");
} else {
    compile(&source_path)?;
    cache.add_compilation(&source_path, &output_path, deps, compiler_version)?;
}

// Save cache
cache.save(&cache_dir)?;
```

### Cache Types

1. **Compilation Cache**
   - Source file hashes
   - Output file hashes
   - Dependency tracking
   - Compiler version tracking

2. **Dependency Cache**
   - Resolved versions
   - Transitive dependencies
   - Checksums
   - Resolution timestamps

3. **Test Cache**
   - Test results
   - Source hashes
   - Execution timestamps

### Cache Management

```rust
// Get cache statistics
let stats = cache.stats();
println!("Compilation entries: {}", stats.compilation_entries);
println!("Dependency entries: {}", stats.dependency_entries);

// Clean stale entries (older than 30 days)
cache.clean_stale(30);
```

### Performance Impact
- **Clean build**: No impact (cache miss)
- **Incremental build (no changes)**: 10-50x faster
- **Incremental build (few changes)**: 5-10x faster

## Incremental Build Improvements

### Overview
Enhanced incremental builds with better fingerprinting and change detection.

### Features

1. **Content-Based Hashing**: SHA-256 hashing of source files
2. **Dependency Tracking**: Tracks file dependencies for cascade invalidation
3. **Classpath Monitoring**: Detects classpath changes
4. **Smart Invalidation**: Only rebuilds affected files

### Implementation
Located in `src/core/cache.rs`:

```rust
use jbuild::core::BuildCache;

let mut cache = BuildCache::new(project_root);

// Get stale sources
let stale = cache.get_stale_sources(&all_sources);
println!("Need to recompile {} files", stale.len());

// Update cache after compilation
cache.update_entry(source_path, entry);
```

### Change Detection

The system detects changes in:
- Source file modifications
- Dependency modifications
- Classpath changes
- Compiler version changes

### Performance Impact
- **No changes**: Near-instant (< 100ms)
- **Single file change**: 50-100x faster than full rebuild
- **Multiple file changes**: 10-20x faster than full rebuild

## Combined Performance

When all optimizations are enabled:

| Project Size | Full Build | Incremental Build | No-Change Build |
|--------------|-----------|-------------------|-----------------|
| Small (< 10 files) | 2-3s | 0.5-1s | < 0.1s |
| Medium (10-50 files) | 5-10s | 1-2s | < 0.2s |
| Large (> 50 files) | 15-30s | 2-5s | < 0.5s |
| Multi-module (5 modules) | 20-40s | 3-8s | < 1s |

## Configuration

### Enable All Optimizations

```toml
# jbuild.toml
[build]
parallel_resolution = true
max_parallel_threads = 8
persistent_cache = true
incremental_build = true

[cache]
max_age_days = 30
auto_clean = true
```

### Environment Variables

```bash
# Set max parallel threads
export JBUILD_MAX_THREADS=8

# Enable verbose cache logging
export JBUILD_CACHE_VERBOSE=1

# Disable cache (for debugging)
export JBUILD_NO_CACHE=1
```

## Best Practices

1. **Use Persistent Cache**: Always enable for development
2. **Clean Periodically**: Run `jbuild clean-cache` monthly
3. **Monitor Performance**: Use `jbuild build --stats` to see metrics
4. **Adjust Parallelism**: Match to your CPU core count
5. **CI/CD**: Disable cache for clean builds, enable for PR builds

## Troubleshooting

### Cache Issues

```bash
# Clear cache
jbuild clean-cache

# Rebuild cache
jbuild build --rebuild-cache

# View cache stats
jbuild cache-stats
```

### Performance Issues

```bash
# Profile build
jbuild build --profile

# Disable optimizations for debugging
jbuild build --no-parallel --no-cache
```

## Future Improvements

- [ ] Distributed cache support
- [ ] Remote cache server
- [ ] Build analytics and insights
- [ ] Predictive caching
- [ ] Machine learning-based optimization