gpt4 book ai didi

nim-lang - Nim 在内存效率低下是否与 Java 相似?

转载 作者:行者123 更新时间:2023-12-01 23:27:35 30 4
gpt4 key购买 nike

在 64 位 Java 中,每个对象实例往往包含一个 192-bit header , 包含

  • 类指针,
  • 标志和
  • 锁(每个 64 位)。

  • 这可能会导致小对象的大量内存开销。

    尼姆的情况是否类似?用两种语言类似地编写的大型应用程序(运行时的大小可以忽略不计)会使用大约相同数量的内存吗?

    更新 :

    我进行了一些实验,其中我构建了一个带有 100M float64 的朴素单向链表。元素并对其进行多次迭代。

    Java实际上是在使用 减少 25% 根据 htop,内存比 Nim .

    完整的 Nim 代码:
    type Node = ref object
    data : float64
    next : Node

    echo "Running"

    proc create(n : int): Node =
    var
    tmp = Node(data: 0, next: nil)

    for i in 1..<n:
    tmp = Node(data: i.float64, next: tmp)

    return tmp


    proc sum(x: Node): float64 =
    var
    tmp: float64 = 0
    y = x

    while true:
    tmp += y.data
    y = y.next

    if y.isNil:
    return tmp


    proc sums(x: Node, n: int): float64 =
    var tmp: float64 = 0

    for i in 0..<n:
    tmp += sum(x) / n.float64

    return tmp

    let x = create(1000 * 1000 * 100)

    echo "Created"

    echo sums(x, 100)

    echo "Finished"

    这使用 3.1GB,每个 Node 为 269 位,而 Java 每个 Node 使用 203 位在非常相似的代码中。这小于 192bit 头 + 128bit 结构。我猜测某种 JIT 优化使 Java 使用更少的内存运行。

    完整的Java代码:
    Node.java
    public class Node {
    double data = 0;
    Node next = null;
    }
    SListTest.java
    public class SListTest {

    static Node create(int n) {
    Node tmp = new Node();

    for(int i = 1; i < n; ++i) {
    Node p = new Node();
    p.data = i;
    p.next = tmp;
    tmp = p;
    }

    return tmp;
    }

    static double sum(Node x) {
    double tmp = 0;

    while(x != null) {
    tmp += x.data;
    x = x.next;
    }

    return tmp;
    }

    static double sums(Node x, int n) {
    double tmp = 0;

    for(int i = 0; i < n; ++i)
    tmp += sum(x);

    return tmp / n;
    }

    public static void echo(String s) {
    System.out.println(s);
    System.out.flush();
    }

    public static void main(String[] args) {
    echo("Started");
    Node p = create(1000 * 1000 * 100);
    echo("Created");
    double tmp = sums(p, 100);
    System.out.printf("%f\n", tmp);
    echo("Finished");
    }

    }

    最佳答案

    在 Nim 中,您还可以将对象放入堆栈,因此不需要垃圾收集,并且只占用与对象中成员一样多的空间。当将自动分配的对象放在堆上时,存在一些垃圾收集内存开销,但对象本身仍然保持其成员的大小(当然还有填充)。

    关于nim-lang - Nim 在内存效率低下是否与 Java 相似?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54040850/

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