Wednesday, 4 March 2020

Rust Memory Optimization

Posted on 17:11 by Mordiadi

One of my goals this year is to learn new things that take more than a few weeks to learn. I've been learning Rust. One of the claims I saw is that Rust's borrow mechanics allow it to optimize better than C++ does. I wanted to see this in action so I ran some simple examples through godbolt. Here's some C++ code that reads from array A and writes to array B:

int test(const int* A, int* B, int i) {     int x = A[i];     B[i] = x+1;     int y = A[i];     return x+y; } 

This C++ code compiles to assembly, with -O2:

movsx   rdx, edx lea     rcx, [rdi+rdx*4] mov     eax, DWORD PTR [rcx] lea     edi, [rax+1] mov     DWORD PTR [rsi+rdx*4], edi add     eax, DWORD PTR [rcx] ret 

Note that it is loading DWORD PTR [rcx] twice and loading DWORD PTR [rsi+…] once. That means it's accessing A[i]'s memory twice and B[i] once. It knows that A hasn't changed and it knows i hasn't changed but it doesn't know that A[i] hasn't changed. It's possible that A and B overlap. That means it has to load A[i] twice, even though it's marked const.

Here's the Rust version:

pub fn test(A: &[i32], B: &mut [i32], i: usize) -> i32 {     let x = A[i];     B[i] = x+1;     let y = A[i];     return x+y; } 

and the output (some parts omitted):

push    rax mov     eax, DWORD PTR [rdi + 4*r8]lea     ecx, [rax + 1] mov     DWORD PTR [rdx + 4*r8], ecx add     eax, eax pop     rcx ret 

This code has only two DWORD PTR accesses. It knows that A is a shared reference (so there are no other writers), and B is a mutable reference (so there are no other readers). That means it can conclude that A and B can't overlap. Once it's read A[i] from memory it doesn't have to read it again. Cool!

C (but not C++) has the restrict keyword for this. You can tell the C compiler "trust me, these don't overlap", but C doesn't check. Rust checks this at compile time.

So far I'm enjoying learning Rust. It has many of the things I wanted in a language since the mid-1990s. I don't know if I'll actually use it for a real project, but that's not my goal right now. My goal is to learn some new things that challenge my brain, and Rust is doing that for me.

No Response to "Rust Memory Optimization"

Leave A Reply

BTC

Doge

LTC

BCH

DASH

Tokens

SAMPAI JUMPA LAGI

SEMOGA ANDA MEMPEROLEH SESUATU YANG BERGUNA