単刀直入にentryを作るコードを書くとこうです。.build();要点を解説すると以下です。総合して、以下のコードになります。詰まってしまうらしくエラーになります。busyのエラーだったんですがなんでなんでしょうね。今回は返り値には興味がないので返り値が成功かどうかはみずにそのまま消費します。計算できて丁度よさそうです。}}これでIOリクエストを提出できました。次はIOリクエストの完了待ちです。残ってる分のリクエストを順次消費していきます。計算していますがそもそもキューの長さが2048なので最大で2048までしか返ってきませんがまあ、気にしなくてよいでしょう。完了するまで待ちます。ベンチマーク高速なIO処理を目指して書いたのでベンチマークを取ってみましょう。雑に処理の開始と終了の時間の差をとります。標準ライブラリを使った実装をstd、io_uringを使った実装をuringとします。4486............。stdの方が倍以上速いという結果になりました。コマンドによるとuringの方が使っているCPU時間は短いです。0swapsキューの待ちでも発生したんですかねぇ?io_uringの高速化ちょっとこのままだと収まりが悪いのでio_uringを高速化してみます。ポイントは2つあって、ファイルfdの事前登録とバッファの事前登録です。カーネルのことはよく分からないんですがfdをカーネルに渡してそれをカーネル側であれこれしてもらうのは時間がかかるらしいです。そこでカーネルに事前に使う予定のfdを事前に渡しておけばその時間を短縮できるらしいです。1つがバッファの事前登録です。これは分かりやすいですね。度にRustのメモリ領域からカーネル内にデータをコピーして使っています。これは無駄なので事前にデータ提出に使うバッファをユーザランドとカーネルランドで共有しておけばコピーの手間が省けます。これにはカーネルと共有できるメモリを確保したり共有メモリ専用のIOリクエストを使ったりの作業が必要になります。ファイルの事前登録これは単純ですね。submitter.register_files(&[file.as_raw_fd()])?;バッファの事前登録これはちょっと厄介です。ANONYMOUSなメモリを確保します。