我正在编写一个简单函数的基准测试。
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 有更好的解决方案吗?
std.mem.doNotOptimizeAway
:
std.mem.doNotOptimizeAway(f());
@declareSideEffect
内置函数取代:
_ = @declareSideEffect(f());