Rustで高速化
std::collections::HashMapはHashDos対策のため遅い。HashDos対策が不要な場合はhashbrownを使うと速い。
[profile.release]
lto = true
panic = 'abort'
codegen-units = 1
とすると速いバイナリが生成されやすいが、コンパイルが遅くなるなどの弊害もある。
prefetchなどは std::intrinsicsの下にある。(要nightly)
自前でスレッドを立ち上げる場合、std::threadよりcrossbeam::threadの方が扱いやすい。
スレッド間でデータを受け渡すには std::sync::mpscのchannelやsync_channelを使うとよい。(借用で十分な場合もあるが)
split_at_mutを使うと可変借用を分割できる。
安定である必要がない場合sortよりsort_unstableの方が速い。
(本当はsort_stable
とsort
という名前の方が良かったのではないかと思うが、安定でないソートを後から加えたためこういう命名になっているのだと思われる。)
インラインアセンブラを使いたい場合はasm!
を使う。(要nightly)
AVXとかを使いたい場合はcore::arch::x86_64が使える。(stableで使えるものとnightlyが必要なもの両方ある)
ポータブルなSIMDは、昔はstdsimdという名前だったが、portable-simdで開発されている。
(再びstableに入るのはいつになるんだろう)
1.59で安定化した
C, C++同様にperfでプロファイルが取れる。
インライン展開を抑制したときは #[inline(never)]
を、積極的にしてほしいときは#[inline]
, #[inline(always)]
をつけるとよい。
高速な乱数が欲しいときは
などを使うとよいstdのよりparking_lot
のMutexとかを使う方が速そう