Rust · Go · C++
The bottleneck gets rebuilt. The rest stays as it is.
We rebuild the slow or unsafe component in Rust, Go or C++, with source code and a measurement against the agreed target value.
EXAMPLE
Before and after
BEFORE
Parser in C++
Reads data packets from measuring devices. Fast, but prone to memory errors such as buffer overflows and use-after-free.
YOUR INPUT
Code and target value
The existing code, sample inputs and a target value for processing time.
AFTER
The same parser in Rust
Same interface, same agreed behaviour, with memory access checked by the Rust compiler. Processing time is measured against the target value.
Illustrative example of a possible project.
ALREADY DELIVERED · FROM OUR PARTNER NETWORK
An Aspirits web platform runs in production on Kubernetes with multi-zone PostgreSQL and is load-tested with k6 and 500 virtual users.
When a rewrite pays off
- A known component misses its targets under load.
- Memory use grows with the amount of data.
- C or C++ code should become memory-safe.
- A service needs to handle significantly more requests or devices.
The component must be clearly isolable.
Rust, Go or C++
| Language | Used for |
|---|---|
| Rust | Where memory safety matters. Rust prevents use-after-free and data races at compile time. |
| Go | For services with high concurrency, such as APIs and data pipelines. |
| C++ | Where existing C++ code is optimised or the environment requires C++. |
Four steps to the new component
1 Tests
If suitable tests are missing, we clarify beforehand which checks the migration requires and agree their scope. The agreed checks establish the baseline against which the changes are assessed.
2 Benchmark
A benchmark measures today’s performance. This shows whether the target value is achievable.
3 Rewrite
The component is rebuilt with the same external interfaces.
4 Comparison
Old and new code run with the same inputs. Acceptance is given when the agreed behaviour and the target value are reached.
Also separately, for example
Optimise a component
Without changing language, up to the agreed target value.
New high-load service
For example for data from many devices at once, tested with a load test.
Tool or library
For the command line or for embedding, with the agreed tests.
Tests and benchmark
Automated tests for existing code and a benchmark of today’s performance.
New software modules and interfaces: Software & Interfaces →
Frequently asked questions
- Is migrating from C++ to Rust worthwhile?
- If the code is security-critical and can be isolated, yes.
- How do you make sure the software works correctly after the migration?
- We define beforehand which behaviour must be preserved and which results are checked.
- What if there are no automated tests?
- Then we clarify beforehand which checks the migration requires and agree their scope.
- Which languages do you migrate from?
- Often from Python, C or C++. We check other source languages in advance.
- What if the target value is not achievable?
- The benchmark before work begins usually shows this. The target value is then adjusted before work starts.
- Can the new component be integrated into our existing software?
- In many cases, a new or reworked component can be integrated into existing software. We check this in advance.
How scope, testing and handover are handled: How we work →
Which component is slowing things down?
Tell us briefly which component it is and what it needs to achieve. I will get back to you within one business day.
Stephanie Escarciga · +49 15679 281048Mon–Fri, 7 a.m. to 6 p.m. (CET)