Rustへ移植
C#で細かいツールを作ってたので、Rustに移植していく作業中。
仕事の合間にやってるので、なかなか進まない。
Rust独自の所有権エラー出まくり。
処理速度が遅い
いくつかのツールを移植したんだけど、1個だけ、妙に遅い事に気づいた。
ファイルサーバの特定フォルダ配下の更新情報を出力するツール。
4か所のフォルダ配下のファイル一覧を取得して、前回保存した一覧との差分を出力している。
差分処理はそこそこ早いんだけど、ファイル一覧取得が遅い。
C#ツールでは、23秒だが、Rustツールでは、62秒。
圧倒的に、遅い。
おかしい、C#と比べるとRustの方が速いはずなんだが。
所有権エラー回避のためのコードで、遅くなってる理由な気がする。
外部クレート使用
取り敢えず自作コードのファイル一覧部分のみ抜き出して、計測すると8秒くらいかかる、遅い。
walkdirクレートを使用してみると、4秒になった。早い。
jwalkクレートを使用していると、1秒になった。めっちゃ早い。
何故か遅くなる
これで問題解決~、とファイル一覧の部分をjwalkに変更してみると、103秒。
はぁ?
何で、遅くなる。
ファイル一覧以外の処理は、一緒なので、ファイル一覧が遅いの?
いや、そんなはずはない。
うー、分からん。
ファイル一覧以外のコードで、ヒープ確保している箇所を回避するように修正してみる。
Rustっぽい改修だ。
本来そうするべきなんだろうが、エラー回避のために、じゃんじゃんヒープ使ってる無能コード。
それでも、74秒。
何故、元の自作コードより遅くなるのだ。
ファイル一覧部分は、8秒から1秒になったはずなのに。
その他のコードは、同じなのに、何故だぁぁぁ。
敗北
結局、原因が分からず、そっと元の自作コードに戻しておいた。
そういえば、Rust製ripgrepは、最高速と言われていたけど、
ファイルサーバに対して使うと、agより遅かったんだよなぁ。
Windows上で、Windowsファイルサーバへのアクセスが遅いのかな?
Rustのメモリ確保は、Cより遅いという話だし(セキュリティ機能重視のため)、ループ内でヒープ確保しまくりだと、指数関数的に遅くなるのかも。
きっと、Rustの機能を使いこなせてないからだろうなぁ。
Cowとか使えると早くなるかもしれないけど、良く分からんので、手を出してない。
参照を使いこなしてないので、ライフタイムも使ってない。
参照使って、ヒープ確保処理を減らさないと、速度出ない気がする。
もう少し、Rustの勉強が必要だ。