typed-builderでインスタンスを作成したらどれだけ遅くなるか Rustで構造体を作成するとき、フィールドの初期化にはいくつかの方法があります。 その中の一つがtyped-builderというクレートを使う方法です。
typed-builderとは
typed-builderは構造体にTypedBuilderというderiveマクロを適用することで、コンパイル時にチェックされるビルダーを生成します。 このビルダーは、構造体のフィールドと同じ名前のセッターを持ち、好きな順番で呼び出すことができます。また、必須フィールドやオプショナルフィールドも自動的に判断されます。 さらに、fromトレイトが実装されていれば、型変換も自動的に行われます。
typed-builderは便利な機能を提供してくれますが、その分パフォーマンスに影響はないのでしょうか? 今回は、typed-builderを使った場合と普通に構造体リテラルを使った場合との速度比較を行ってみました。
実装について
まず、以下のようなFooとBarという二つの構造体を定義しました。 FooはTypedBuilderマクロを適用していますが、Barは普通の構造体です。
use typed_builder::TypedBuilder; // A struct with some fields #[derive(TypedBuilder)] struct Foo { // Required field a: String, // Optional field b: Option<i32>, }</i32> struct Bar{ a: String, b: Option<i32>, }</i32>
次に、以下のコードでそれぞれ10000回インスタンス化してみました。 Fooはビルダー経由でインスタンス化しましたが、Barは直接インスタンス化しました。
use std::time::Instant; fn main(){ let start = Instant::now(); for i in 0…10000{ let foo = Foo::builder().a(“Hello”.to_string()).b(None).build(); } println!(“Time elapsed in typed_builder is: {:?}”, start.elapsed()); let start = Instant::now(); for i in 0..10000{ let bar = Bar{ a: "Hello".to_string(), b: None, }; } println!("Time elapsed in struct is: {:?}", start.elapsed()); }
実行結果は以下のようになりました。
Time elapsed in typed_builder is: 1.778265ms
Time elapsed in struct is: 1.687295ms
この結果から分かるように、typed-builderを使った場合とそうでない場合では速度差はほとんどありませんでした。
まとめ
typed-builderは便利な機能を提供しながらもパフォーマンス面では問題ないことが分かりました。 もちろんこれは一例ですし、他の条件や環境では異なる結果になる可能性もあります。
しかし少なくとも私たちは安心してtyped-builderを使えることが分かりました
コメントを残す