Optimization 如果我优化尺寸(z)而不是速度(3),我会改变什么速度增益?

Optimization 如果我优化尺寸(z)而不是速度(3),我会改变什么速度增益?,optimization,rust,compilation,llvm,rust-cargo,Optimization,Rust,Compilation,Llvm,Rust Cargo,我读了两本书: 我不明白的是,如果我使用: [profile.release] opt-level = "z" 而不是: [profile.release] opt-level = 3 今天opt level=3是运行速度opt level部分的最佳设置,对吗 如果我改为使用opt-level=z,我会降低运行时性能,对吗 我对构建/编译速度不感兴趣。这很复杂 事实上,编译器优化管道主要基于启发式 许多优化都是确定的,比如强度降低,但是许多重型提升机(比如内联)都是基于一组启发式的 当然,启

我读了两本书:

我不明白的是,如果我使用:

[profile.release]
opt-level = "z"
而不是:

[profile.release]
opt-level = 3
今天opt level=3是运行速度opt level部分的最佳设置,对吗

如果我改为使用opt-level=z,我会降低运行时性能,对吗

我对构建/编译速度不感兴趣。

这很复杂

事实上,编译器优化管道主要基于启发式

许多优化都是确定的,比如强度降低,但是许多重型提升机(比如内联)都是基于一组启发式的

当然,启发法并非凭空而来。编译器开发人员根据被认为具有代表性的程序样本对它们进行了仔细的调优,并根据客户报告对它们进行了润色

尽管如此,在一天结束时,它们仍然是启发式的,因此一些程序使用-Oz比使用-O3更快,因为使用了不同的启发式集。

这很复杂

事实上,编译器优化管道主要基于启发式

许多优化都是确定的,比如强度降低,但是许多重型提升机(比如内联)都是基于一组启发式的

当然,启发法并非凭空而来。编译器开发人员根据被认为具有代表性的程序样本对它们进行了仔细的调优,并根据客户报告对它们进行了润色


尽管如此,在一天结束时,它们仍然是启发式的,因此一些程序使用-Oz比使用-O3更快,因为使用了不同的启发式集。

如果选择z,您并没有牺牲所有的优化,但由于需要较小的二进制文件,您可能会失去一些优化。唯一正确的答案是在两种设置下使用数据在系统上评测代码。然后你就会知道哪个更快。如果您没有办法分析应用程序的性能变化,此时性能可能不是主要问题。请注意,更多优化的边际效用会在更高级别上下降。从-O2到-O3通常不会像从-O1到-O2那样提高性能,甚至可能是一种倒退。传统的观点认为-O2、-Oz和-O3大致都是一样好的,你需要分析以确定哪一种最适合你的计划。不寻常的是-O3会比-O2慢,但它的速度可能不足以让额外的编译时间变得值得,您并没有牺牲所有的优化,但由于需要较小的二进制文件,您可能会失去一些优化。唯一正确的答案是在两种设置下使用数据在系统上评测代码。然后你就会知道哪个更快。如果您没有办法分析应用程序的性能变化,此时性能可能不是主要问题。请注意,更多优化的边际效用会在更高级别上下降。从-O2到-O3通常不会像从-O1到-O2那样提高性能,甚至可能是一种倒退。传统的观点认为-O2、-Oz和-O3大致都是一样好的,你需要分析以确定哪一种最适合你的计划。不寻常的是-O3将比-O2慢,但它可能没有足够的速度使额外的编译时间变得值得。