问题描述
我注意到Rust迭代器在某种程度上类似于SQL查询。由于我不熟悉sql也不对其进行优化(尽管我确实确实对查询进行了大量优化),Rust或任何其他语言是否有办法优化迭代样式过滤器的编译时间?例如,
struct City {
population: u64,name: String,}
fn heavy_computation_criteria(population: u64) -> bool {
unimplemented!();
}
fn main() {
let cities = vec![ ... ];
let matches = cities
.iter()
.filter(|city| heavy_computation_criteria(city.population))
.filter(|city| city.population > 1000)
.map(|city| city.name);
}
类似于类似的东西
SELECT name FROM cities WHERE population > 1000 AND cities.heavy_computation_criteria(cities.population)
我想sql将首先通过填充而不是繁重的计算标准进行过滤。铁锈有这样的优化方法吗?
解决方法
我认为在某种程度上-是的。您可以想象,迭代器结构具有一个用于存储过滤器的字段,并且仅在栅栏点上(在您的示例中为map()
上),它会计算过滤器。
由于过滤器是Rust中的闭包,因此语言运行时无法在编译之前对其进行评估。但是它可以进行一些启发式操作,例如,想到什么,在一个(很少)元素上评估每个存储的过滤器,以计算其成本。然后可以将它们从低成本重新排列为高成本。
请记住,我不知道这种方法是否可以提高速度。