Home Backend Quick Guide
On this page 42
TL;DR - Which Backend Should I Use
The Answer: USE BOTH
# Development (fast iteration)
ion build --backend=native
# Production (max performance)
ion build --backend=llvm -O2
No code changes needed. Just a compiler flag.
The Numbers
Build Speed
Compiling 1000-line program:
Native: 2 seconds ← Fast!
LLVM -O2: 6 seconds ← 3x slower, but acceptable
Runtime Performance
Running that program:
Native: 100 ms ← Baseline
LLVM -O2: 40 ms ← 2.5x faster!
Binary Size
Output binary:
Native: 200 KB ← Baseline
LLVM -O2: 180 KB ← 10% smaller!
LLVM -Oz: 120 KB ← 40% smaller!
Simple Comparison Table
| Feature | Native | LLVM -O2 | Winner |
|---|---|---|---|
| Compile Speed | 2s | 6s | 🏆 Native (3x faster) |
| Runtime Speed | 100ms | 40ms | 🏆 LLVM (2.5x faster) |
| Binary Size | 200KB | 180KB | 🏆 LLVM (10% smaller) |
| Memory Usage | 50MB | 200MB | 🏆 Native (4x less) |
| Simplicity | Simple | Complex | 🏆 Native |
| Optimizations | Basic | Advanced | 🏆 LLVM |
What This Means in Practice
Development Workflow
Morning:
# Make changes to code
ion build --backend=native # 2 seconds
ion run # Test it
# Repeat 50 times → saves 3 minutes vs LLVM
Before commit:
# Final check
ion build --backend=llvm -O2 # 6 seconds
ion test # Verify performance
Production Deploy
# One-time build for production
ion build --backend=llvm -O3 # Takes 15 seconds
# → Runs 2-4x faster for weeks/months/years
# → Completely worth the extra 13 seconds
Real Impact on Your Codebase
Code Changes Required: ZERO
Your Home code stays exactly the same:
// Your code - works with BOTH backends!
fn fibonacci(n: i64): i64 {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// Native: Straightforward recursion
// LLVM: Might optimize, inline, or memoize
Project Structure: NO CHANGES
your-project/
├── src/
│ └── main.home ← Same code
├── tests/
│ └── test.home ← Same tests
├── ion.toml ← Just add backend config
└── README.md
Add to ion.toml:
[build]
dev-backend = "native"
release-backend = "llvm"
That's it!
Binary Size Impact
Example: Simple HTTP Server
Function: Serve HTTP requests
Native Backend:
├── Binary size: 2.5 MB
├── Startup: 50ms
└── Requests/sec: 10,000
LLVM -O2:
├── Binary size: 2.2 MB (-12% smaller!)
├── Startup: 45ms
└── Requests/sec: 20,000 (2x faster!)
LLVM -Oz (size optimized):
├── Binary size: 1.5 MB (-40% smaller!)
├── Startup: 42ms
└── Requests/sec: 15,000 (1.5x faster)
For distribution:
- Smaller downloads
- Less disk space
- Faster startup
- Better performance
It's a win-win!
Cost Analysis
Scenario: Web Application
Server costs:
Native backend:
- Handles 1,000 requests/sec
- Need 4 servers @ $100/month
- Total: $400/month
LLVM backend:
- Handles 2,000 requests/sec (2x faster)
- Need 2 servers @ $100/month
- Total: $200/month
Savings: $200/month = $2,400/year
Build time cost:
Extra compile time: 15 seconds per deploy
Deploys per month: 20
Extra time: 5 minutes/month
Your time value: $100/hour
Cost: $8/month
ROI: Save $200/month, spend $8/month
Net gain: $192/month = $2,304/year
LLVM pays for itself 25x over!
When Each Backend Wins
Native Backend Wins
✅ Development iteration
- Change code, rebuild 50+ times/day
- 2s vs 6s = 3 mins saved per cycle
- 2.5 hours saved per day
✅ Quick scripts
- Run once, don't care about performance
- Just want it to work NOW
✅ Testing
- Run tests 100+ times
- Fast feedback loop critical
✅ Learning/Teaching
- Predictable output
- Easy to understand generated code
LLVM Backend Wins
✅ Production deployments
- Build once, run for months
- 2-4x performance gain
- 10% smaller binaries
✅ Performance-critical code
- Games (need 60+ FPS)
- Servers (handle more requests)
- Scientific computing (process data faster)
✅ Distribution to users
- Smaller downloads
- Faster execution
- Better user experience
✅ Cost optimization
- Need fewer servers
- Lower cloud bills
- Better resource utilization
Recommended Workflow
Option 1: Simple (Recommended for Most)
# Always develop with native
alias dev='ion build --backend=native && home run'
# Deploy with LLVM
alias ship='ion build --backend=llvm -O2'
Option 2: Automatic (ion.toml)
[build]
# Automatically use native for dev
dev-backend = "native"
# Automatically use LLVM for release
release-backend = "llvm"
release-optimize = "2"
Then just:
ion dev # Uses native
ion release # Uses LLVM -O2
Option 3: Mixed Mode (Advanced)
# Develop most code with native
ion build --backend=native
# Performance-critical modules with LLVM
ion build src/hot_path.home --backend=llvm -O3
# Link together
ion link -o myapp
Common Questions
Q: Will LLVM break my code
A: No. LLVM is more aggressive but correct. If it breaks, it's a bug we need to fix.
Q: Should I commit binaries
A: No. Commit code, let CI build with both backends.
Q: Can I mix backends in one project
A: Yes! (Advanced) Compile hot paths with LLVM, rest with native.
Q: What about compile time in CI
A: Use native for tests, LLVM for releases:
test:
home build --backend=native
home test
release:
home build --backend=llvm -O2
home package
Q: Is the performance gain real
A: Yes! We measured 2.45x faster control flow, 1.63x faster loops in real benchmarks.
Q: What if I want maximum performance
A: Use LLVM -O3:
ion build --backend=llvm -O3 --lto
# Might take 5x longer to compile
# But runs 3-4x faster
Migration Path
Week 1: Keep Everything The Same
- Continue using native backend
- No changes needed
- Establish baseline
Week 2: Try LLVM for Releases
# Keep dev workflow
ion build --backend=native
# Try LLVM for release builds
ion build --backend=llvm -O2 --release
Week 3: Benchmark
# Compare performance
./benchmark-native
./benchmark-llvm
# Check binary sizes
ls -lh binary-native binary-llvm
Week 4: Switch Production
# If benchmarks look good, use LLVM for production
ion build --backend=llvm -O2
ion deploy
Ongoing: Best of Both Worlds
# Daily work: native (fast)
# Releases: LLVM (performant)
# Everyone's happy
Bottom Line
The Verdict
Use BOTH backends:
- Native for development (3x faster builds)
- LLVM for production (2x faster execution, smaller binaries)
The Impact
On your codebase:
- Zero changes needed
- Just a compiler flag
- Works with existing code
On binary size:
- LLVM -O2: 10% smaller
- LLVM -Oz: 40% smaller
- Not larger!
On performance:
- 1.7-2.5x faster on average
- Up to 10x faster for specific code
- Measurably better
On development:
- 3x slower builds (6s vs 2s)
- But only for production builds
- Dev stays fast with native
The Recommendation
# This is the sweet spot
dev: native # Fast iteration
release: llvm -O2 # Great performance, good size
You get:
- ✅ Fast development (native)
- ✅ Fast runtime (LLVM)
- ✅ Small binaries (LLVM)
- ✅ No code changes
- ✅ Best of both worlds
Worth it?
Absolutely! 2-4x performance gain for 3x longer builds (that only happen once per deploy) is a no-brainer.
Action Items
Today:
- Keep using native for development
- Try one LLVM build:
ion build --backend=llvm -O2 - Compare the binaries
This week:
- Update
ion.tomlwith backend configs - Run benchmarks comparing both
- Update CI to use LLVM for releases
Going forward:
- Native for all dev work
- LLVM for all production deployments
- Enjoy the best of both worlds!
Remember: No code changes needed. It's just a compiler flag. Use both strategically!