让编译器不优化_out

问题描述 投票:0回答:1

我正在编写一个简单函数的基准测试。

var timer = try std.time.Timer.start();
_ = f();
const elapsed = timer.read();

不幸的是,用占位符语法标记的值被优化掉了,所以

elapsed
等于零。为了解决这个问题,我使用了一个可怕的黑客:

comptime {
    asm (
        \\.global dummy;
        \\dummy:
        \\ret
    );
}
extern fn dummy(x: i32) void;

// ...
var timer = try std.time.Timer.start();
dummy(f());
const elapsed = timer.read();
/// ...

它按预期工作。然而,我对这样的解决方案肯定不满意。 Rust 中的类似代码将仅使用

black_box
内在函数,在 Nim 中将使用
used
pragma,而在 C 中,可以在声明结果变量时使用
volatile
来解决。

Zig 有更好的解决方案吗?

zig
1个回答
2
投票

使用

std.mem.doNotOptimizeAway

std.mem.doNotOptimizeAway(f());

未来将被

@declareSideEffect
内置函数取代:

_ = @declareSideEffect(f());
© www.soinside.com 2019 - 2024. All rights reserved.