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.

Describe the component

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++

LanguageUsed for
RustWhere memory safety matters. Rust prevents use-after-free and data races at compile time.
GoFor 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. 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. 2 Benchmark

    A benchmark measures today’s performance. This shows whether the target value is achievable.

  3. 3 Rewrite

    The component is rebuilt with the same external interfaces.

  4. 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)

Describe the component