C being barebones does not mean it is faster. Because it has such weak typing and gives a huge amount of programmer freedom, compilers have to do a lot of work to be able to understand a C program well enough to optimise it.
Rust, on the other hand, requires the programmer to give the compiler more information about what they're doing.
A very simple example:
void foobar(struct foo *f)
{
f->a += 2;
foo();
f->a += 2;
bar();
f->a += 2;
}
Because C pointer types are so barebones, the compiler can't tell whether foo() and bar() can modify f->a just from looking at the above code. So it will always have to load and store that for each += operation.
Rust on the other hand has two kinds of reference, rather than pointers:
fn foobar(f : &mut foo) {
f.a += 2;
foo();
f.a += 2;
bar();
f.a += 2;
}
This is more high-level. But it's good for performance! Rust has a rule that you can only have one mutable reference to a struct at one time. Therefore, foo() and bar() can't be modifying f.a and it can simplify this to `f.a += 6;`.
(You can see it in action for yourself here: https://godbolt.org/z/hWs67P. Sadly, Rust doesn't do this by default due to problems with LLVM, but eventually it can.)