Şu anda doing more stuff with arrays'u arıyorum, ancak bu işlevlerin performansı bir şekilde Leaked<T>
dizininin önüne geçmesine izin verildiğinde daha iyi olabilir, sadece işlev bittiğinde onu açmak için. Bu, a) güvensizlik getirmeden ve b) catch_panic(_)
ayarını yapmadan sızıntı amplifikasyonu kullanmamıza izin verecektir. Bu bir şekilde Rust'ta mümkün mü? bir yineleyici bir jenerik dizi (bu tabii ki çalışmaz) oluşturarak ÖrneğinBir değerin önünü açmak ve açmak için bir yol var mı?
:
#[inline]
fn map_inner<I, S, F, T, N>(list: I, f: F) -> GenericArray<T, N>
where I: IntoIterator<Item=S>, F: Fn(&S) -> T, N: ArrayLength<T> {
unsafe {
// pre-leak the whole array, it's uninitialized anyway
let mut res : GenericArray<Leaked<T>, N> = std::mem::uninitialized();
let i = list.into_iter();
for r in res.iter_mut() {
// this could panic anytime
std::ptr::write(r, Leaked::new(f(i.next().unwrap())))
}
// transmuting un-leaks the array
std::mem::transmute::<GenericArray<Leaked<T>, N>,
GenericArray<T, N>>(res)
}
}
şunu belirtmek zorundayım ki biz ya T
büyüklüğüne veya türüne derleme zamanı erişimi olsaydı o Borçlarını (örneğin, Leaked<T>
gibi) borçlanmadan gizleyebilir, bu mükemmel şekilde yapılabilir.
Beklediğiniz performansın iyileştirilmesi nasıldır? Len'i arttırma değil mi? – malbarbo
Panikleri yakalayarak sızmayı önlemeye çalışırsam (şimdilik sadece beta/gece çalışıyor), bir Vec’e toplanmaktan yaklaşık% 45 daha fazla verim elde ediyorum. Ön sızıntı yaparak daha da iyi sonuçlar alabileceğimi düşünüyorum. – llogiq