闲来无事,准备熟悉一下fft大数乘法,写一个快速计算fibonacci数列的rust小程序
然后……
self.f1.iter_mut()
.zip(self.f5.iter().zip(self.bf.iter()))
.take(self.len)
.for_each(|(r,(s,t))|
*r=*r**r+5.**s**s+2.**t // 这里出现了,python中的乘方算符`**`🤣
);
这样的代码写起来并不复杂,但我仍然有一些疑惑
首先,我能信任Rust的优化吗? 或者说,Rust会把这种到处iter然后解引用的算法改成SIMD指令吗? 如果开Rayon再次加速呢?
其次,我想知道,Rust一般是如何处理iter的语法
我知道有一些解引用的写法,比如for_each(|(r,(&s,&t))|*r=*r**r+5.*s*s+2.*t)
可以去掉不少乘方算符(嗯,**
🤣),但*r
是消不掉的,.pow(2)
大概可以消掉乘方算符,但我可以相信rust的优化能力,相信Rust一定能把r.pow(2)
优化成r*r
吗?
有时候我习惯于写.into_iter()
而不是.iter()
,有这个必要吗?
最后,这里到底应该使用迭代器,还是for循环呢? 使用for循环会不会带来额外的边界检查开销呢? 这里zip里面套zip会不会让编译器感到为难呢?
fft计算fibonacci的代码还在写,写完了我发上来。 写这个帖子主要是因为……不小心写出乘方算符实在有些搞笑
1
共 3 条评论, 1 页
评论区
写评论into_iter()
还有用的用iter()
或者iter_mut()