I want to share a real story from our financial services company about choosing Rust vs Go, complete with actual numbers and one decision we regretted.
The Context
We’re a major financial services company with 40+ engineers. Last year, our cloud bill hit k/month and we identified a problem: 3 microservices were consuming 80% of our compute budget. These services handled high-frequency trading calculations, real-time fraud detection, and payment processing—all CPU and memory intensive.
The Decision: Rewrite in Rust
We chose Rust for these reasons:
- Memory usage was our primary bottleneck
- Security audit requirements (financial services = heavily regulated)
- Performance predictability (GC pauses in Go were causing issues)
The Implementation
- Timeline: 6 months
- Team: 3 dedicated engineers (2 senior, 1 mid-level)
- Original language: Go
- Migration approach: Service by service, with parallel running during validation
The Results
After migration:
High-frequency trading service:
- Memory usage: Down 65% (12GB → 4GB)
- Latency P99: Improved 40% (45ms → 27ms)
- Monthly cost: k → k
Fraud detection service:
- Memory usage: Down 58% (8GB → 3.5GB)
- Throughput: Up 35%
- Monthly cost: k → k
Payment processing service:
- Memory usage: Down 48% (6GB → 3GB)
- Latency P99: Improved 22%
- Monthly cost: k → k
Total savings: k per month in cloud costs.
But Here’s What They Don’t Tell You
Feature velocity on these three services dropped 40%. Tasks that took 2 days in Go now take 3-4 days in Rust. Why?
- Borrowing and lifetimes: Fighting the compiler takes time, especially for mid-level engineers
- Ecosystem gaps: Some libraries we needed didn’t have Rust equivalents, had to write wrappers
- Hiring challenge: Finding Rust engineers takes 2-3x longer than Go engineers
- Code review slowdown: Fewer engineers comfortable reviewing Rust PRs
The One We Regretted
Payment processing service—we shouldn’t have rewritten it in Rust. Yes, we saved money, but the real bottleneck wasn’t CPU or memory, it was network I/O to our bank APIs. The performance improvement was minimal compared to the development velocity hit.
We should have kept it in Go and invested in better caching or a CDN. The ROI wasn’t there.
The Framework We Should Have Used
Ask yourself:
- What’s the actual bottleneck? CPU/memory = consider Rust. I/O bound = stay with Go.
- What’s more expensive: cloud costs or engineering time? In our case, for 2 of the 3 services, cloud costs won. For the third, engineering time should have won.
- What’s the hiring pipeline? If you can’t hire or train Rust engineers, it doesn’t matter how much money you save.
- What’s the opportunity cost? Those 6 months of rewriting = 6 months not building new features.
The Lesson
Rust isn’t always the answer, even when performance matters. Calculate the real break-even point:
- Engineering time cost: 3 engineers × 6 months × k salary = k
- Cloud savings: k/month
- Break-even: 2.5 months
But that doesn’t account for ongoing velocity loss. We’re still living with slower development on those services.
When We’d Choose Rust Again
- Security-critical components with clear performance bottlenecks
- Long-running services where optimization pays off over years
- When we have Rust expertise in-house already
When We’d Choose Go
- I/O-bound services (which is most web services)
- Rapid prototyping and MVP development
- When team velocity matters more than compute efficiency
Question for the Community
How do you calculate the ROI of performance optimization vs development velocity? What’s your framework for making this trade-off?