gpt4 book ai didi

rust - 为什么 Rust 程序比 C、Haskell 和 OCaml 版本使用更多的内存?

转载 作者:行者123 更新时间:2023-11-29 07:40:24 32 4
gpt4 key购买 nike

我查看了 Rust 程序使用了多少 RAM(top 命令的 RES 列),我想知道为什么它们使用这么多内存。

这是一个例子:

use std::io;

fn main() {
println!("What's your name?");
let mut input = String::new();
io::stdin().read_line(&mut input).unwrap();
println!("Hello {}!", input);
}

我看到在输入内容之前使用了 6 MB 的内存。

下面是我编译和执行程序的方式:

cargo build --release
./target/release/main

等效的 C 程序:

#include <stdio.h>

int main(void) {
printf("What's your name?\n");
char input[100] = {0};
scanf("%s", input);
printf("Hello %s!\n", input);
return 0;
}

仅使用 0.6 MB。在这种情况下,Rust 程序使用了 10 倍多的内存。在其他情况下,我看到 Rust 程序使用了 5 倍多的内存。

我还测试了其他语言以进行比较。

OCaml 版本:

let () =
print_endline "What's your name?";
let line = read_line () in
print_string "Hello ";
print_endline line

使用 1 MB。

Haskell 版本:

main = do
putStrLn "What's your name?"
name <- getLine
putStrLn ("Hello " ++ name ++ "!")

使用 3 MB。

Python 版本:

print("What's your name?")
name = input()
print("Hello", name, "!")

使用 7 MB,几乎与 Rust 版本相同!

更新

我正在运行带有 Rust 1.3 的 Linux (ArchLinux)(我也尝试了 nightly 并得到了类似的结果)。

更新2

这是来自 htop 命令的更多数据:

VIRT    RES     SHR     MEM%    Command
15572 2936 804 0.1 ocaml
21728 2732 2528 0.1 haskell
22540 7480 4308 0.2 python
4056 668 600 0.0 c
24180 6164 1928 0.2 rust

更新3

我用 massif 做了更多测试以查看内存使用情况。

对于每个程序,我都运行了两次 massif,如下所示:

valgrind --tool=massif --time-unit=B ./program
valgrind --tool=massif --pages-as-heap=yes --time-unit=B ./program

以下是所有程序的结果(如 ms_print 所示):

C 版本:

https://framabin.org/?dd243f8ec99155bc#Af5cPrcHnz3DsWiOStfwgW8Qq6BTVhogz/46L+sMuSs=

https://framabin.org/?261b9366c3749469#1ztDBkgVly9CanrrWWrJdh3yBFL5PEIW3OI5OLnze/Q=

Rust 版本:

https://framabin.org/?0f1bac1c750e97bf#AXwlFYYPHeazq9LfsTOpRBaUTTkb1NfN9ExPorDJud0=

https://framabin.org/?c24b21b01af36782#OLFWdwLjVG2t7eoLqLFhe0Pp8Q8pA2S/oq4jdRRWPzI=

OCaml 版本:

https://framabin.org/?060f05bea318109c#/OJQ8reHCU3CzzJ5NCOCLOYJQFnA1VgxqAIVjgQWX9I=

https://framabin.org/?8ff1ffb6d03cb37a#GN8bq3Wrm6tNWaINIhMAr4ieltLtOPjuZ4Ynof9bV4w=

Haskell 版本:

https://framabin.org/?b204bd978b8c1fd8#DyQH862AM8NEPTKlzEcZgoapPaZLdlF9W3dRn47K5yU=

https://framabin.org/?ac1aa89fcaeb782c#TQ+uAiqerjHuuEEIhehVitjm63nc3wu5wfivAeBH5uI=

Python 版本:

https://framabin.org/?197e8b90df5373ec#aOi0+tEj32Na5jW66Kl97q2lsjSZ2x7Cwl/pOt0lYIM=

https://framabin.org/?397efa22484e3992#1ylOrmjKaA9Hg7gw7H7rKGM0MyxuvKwPNN1J/jLEMrk=

总结(内存使用):

|------------|----------|----------|----------|----------|----------|
| | C | Haskell | OCaml | Rust | Python |
|------------|----------|----------|----------|----------|----------|
| First run | 1 B | 63.12 KB | 5.993 MB | 816 B | 1.321 MB |
|------------|----------|----------|----------|----------|----------|
| Second run | 6.031 MB | 24.20 MB | 17.14 MB | 25.60 MB | 27.43 MB |
|------------|----------|----------|----------|----------|----------|

第一次运行没有--pages-as-heap=yes参数。

我还为 C 和 Rust 使用 --stacks=yes 选项运行了 massif

C 版本:

https://framabin.org/?b3009d198ccfdee1#HxR6LPPAzt15K+wIFdaqlfSJjBrJvhV2ZHWdElg3ezc=

(3.141 KB)

Rust 版本:

https://framabin.org/?b446d8d76c279007#tHnGiOnRstTA2krhz6cgfvTjI+FclcZS3rqyZvquWdQ=

(8.602 KB)

是什么解释了 Rust 中堆 block 分配和页面分配之间如此巨大的差异?

最佳答案

因为标准库是静态链接的。

您可以通过使用 -C prefer-dynamic 选项进行编译来解决这个问题。

至于静态链接标准库的原因:它增加了可执行的可移植性(即:不需要在目标系统中安装标准库)。

关于rust - 为什么 Rust 程序比 C、Haskell 和 OCaml 版本使用更多的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762102/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com