7

がパフォーマンスを消費する操作boost::getboost::variantあるかどうかを誰かが知っていますか

現在、パフォーマンスが重要な部分の古いコードをリファクタリングしています。ここでは、「バリアント化」が可能な各タイプと対応するコンテナによって実装されていましたenum

明らかに、これは高速ですが、醜いので、コードをリファクタリングして、もう 1 つの typeで動作するようにする必要がある場合は、コードの古い部分を取り除き、 に置き換えたいと考えていboost::variantます。

また、単純に「両方のバリアントをプロファイリングして比較する」ことはできません。このリファクタリングは面倒で、かなりの時間がかかるためです。

boost::get<x>したがって、ジェネリック型ディスパッチと比較して がどのように機能するかを誰かが知っている場合enum-basedは、この知識を共有していただければ幸いです。

(ドキュメントboost::variant<types>で説明されているように) カスタム ビジターを使用する別の方法があります。これは私の場合よりも高速でしょうか?boost::variantboost::get

ありがとうございました。

4

2 に答える 2

4

単純なテスト アプリケーションを作成して 2 つを比較することもできますが、それは運用環境である必要はありません。

私の同僚は最近、これと同様の問題を抱えていました。彼のシナリオでは、さまざまなタイプのオブジェクトがありましたが、彼は常に、自分が期待するタイプを事前に知っていました。また、彼のデータ構造は巨大だったので、メモリが問題でした。void *彼は と を使用して問題を解決しましたreinterpret_cast。これにより、ポリモーフィズムのメモリ オーバーヘッドが回避され、非常に高速になります。ただし、自分が何をしているのかを完全に確認する必要があります。そうしないと、物事が爆発します。

于 2010-10-22T13:17:28.190 に答える
3

コードを見ると、get<>の内部ビジター メカニズムを使用して実装されていboost::variantます。次に、ビジターのメカニズムはシーケンスに依存しmpl、段階的に実行されます。つまり、 n型バリアントでは最大nステップですが、ループ (再帰呼び出し) が存在します。ここでも、Space Cowboy が示唆するように、小規模なパフォーマンス テストが役立ちます。

于 2010-10-22T13:38:14.770 に答える