首页 文章

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

提问于
浏览
35

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

这是一个例子:

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)(我也尝试了每晚的类似结果) .

更新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 versions:

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

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

Rust versions:

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

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

OCaml versions:

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

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

Haskell versions:

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

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

Python versions:

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

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

摘要(ram用法):

|------------|----------|----------|----------|----------|----------|
|            |     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运行 massif--stacks=yes 选项 .

C version:

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

(3.141 KB)

Rust version:

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

(8.602 KB)

什么能解释Rust中堆块分配和页面分配之间的巨大差异?

2 回答

  • 14

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

    您可以通过使用 -C prefer-dynamic 选项进行编译来克服此问题 .

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

  • 1

    This article对该主题进行了非常好的讨论 . 一些最大和最常见的罪魁祸首是默认调试版本(在您的情况下不相关),默认情况下静态包含库 .

相关问题