this post was submitted on 23 Jan 2025
6 points (80.0% liked)

Rust

6244 readers
16 users here now

Welcome to the Rust community! This is a place to discuss about the Rust programming language.

Wormhole

[email protected]

Credits

  • The icon is a modified version of the official rust logo (changing the colors to a gradient and black background)

founded 2 years ago
MODERATORS
 

I shaved off 10 MiB from my binary in 2 hours!

I made a program using Macroquad, then I built it in release mode, the binary was 63 MiB in size.

So I used cargo vendor to have a better look at Macroquad and one of its dependencies, glam.

I then started to delete code, like, lots and lots of code(about 30_000 lines of code); none of it affected my main project, some of it became 'dead_code' just by removing the pub keyword.

The result is that my project was unaffected and the binary went down to 52 MiB.

Is there a way to automate removal of unneeded elements from dependencies? This is potentially huge.

EDIT: I FIGURED IT OUT!!!

My mistake was measuring the size of "target/release", I discovered that that folder contains many "unnecessary" files, like "deps", which greatly bloat the folder'r size, the actual size of my binary is 864K.

I am so relieved.

you are viewing a single comment's thread
view the rest of the comments
[–] KillTheMule 7 points 1 day ago (3 children)

Actually, dead code eliminination should do the trick, if you're compiling a binary at least (same for a library I think, but there could be re-exports there). Did you compile in release mode?

[–] [email protected] 2 points 1 day ago* (last edited 1 day ago) (1 children)

To expand: Just configure whatever profile you're using (dev, release, ...) to have link time optimization (lto) enabled:

[profile.release]
lto = "fat"

Reference

[–] [email protected] 1 points 1 day ago* (last edited 1 day ago)

This really doesn't seem to do the trick, the binary's still at 63MiB.

Also "fat" and true are identical.

Edit: I'm not sure I replied to the right person, ignore this.

[–] [email protected] 1 points 1 day ago (1 children)

The compiler doesn't consider it to be dead code since it's marked pub.

[–] KillTheMule 3 points 1 day ago (1 children)

Sure, but isn't this in a dependency? Can't be reached when only importing your crate anyways? And if you're building a binary, I don't think this could really considered exported, is what I mean :)

[–] [email protected] 1 points 1 day ago

Yes that's exactly what I want. The compiler should stop considering it accessible.

[–] [email protected] 1 points 1 day ago

I don't recall what the default behavior is with the linker, but it might also benefit from at least thin LTO.