1

私は Zig Lang を初めて使用し、Big Int Fibonacci の既存の実装を探していましたが、役に立ちませんでした。

そのため、Zig Lang のソース コード、具体的にはBig Int Source & Big Int Testsを調べて、Big Int 機能の使用方法を見つけ、目的のソリューションを導き出しました。

これは、学習前に言語の速度を測定しようとする際に、私が従う伝統のようなものです。私がやったように: Big Int Fibonacci Benchmark for Go & Rust . (注: これらの言語のソリューションを作成する必要はありませんでした!)

さて、あなたの親切な閲覧のために、Zigでの私の実装は次のとおりです。

const std = @import("std");
const Managed = std.math.big.int.Managed;

pub fn main() anyerror!void {
    // var arena = std.heap.ArenaAllocator.init(std.heap.c_allocator);
    // defer arena.deinit();
    // const allocator = arena.allocator();

    const allocator = std.heap.c_allocator;

    var a = try Managed.initSet(allocator, 0);
    defer a.deinit();
    var b = try Managed.initSet(allocator, 1);
    defer b.deinit();
    var i: u128 = 0;

    while (i < 50000) : (i += 1) {
        var c = try Managed.init(allocator);

        try c.add(a.toConst(), b.toConst());

        a = b;
        b = try c.clone();

        c.deinit();
    }

    const as = try a.toString(allocator, 10, std.fmt.Case.lower);
    defer allocator.free(as);
    std.log.info("Fib: {s}", .{as});
}

この数を 500,000 に増やそうとすると、メモリ使用量が 10 GB を超えます。

n = のメモリリークなしでプログラムを実行したい

    50,000 (Runs fine, with Arena & General Purpose Alloc!)
   500,000 (Mem Leak)
 1,000,000 (Mem Leak)
 5,000,000 (Mem Leak)
10,000,000 (Mem Leak)

プロセスを高速化するためにほとんどのアロケータ を試したところpage_allocator, ArenaAllocator, GeneralPurposeAllocator、 に到達しましたc_allocator。メモリリークをプラグインする方法については、私には手がかりがありません!

PS ZigLang と ZigLearn のドキュメントをざっと読んで、この点に到達しました。私は言語全体を把握していません。じゃあ、お手柔らかにお願いします!

アプリのビルドに使用した PPS コマンド:

zig build-exe ./src/main.zig -O ReleaseFast --strip -lc

システム情報: Mac Mini 2020、ベースバリアント。

4

2 に答える 2