1

次のような式を持つパーサジェネレータを作成しました。

a = f:"foo" "bar" { /* your code here */ }

これは、流行の後、次のようなコードを生成します。

r0 = this.ReturnHelper<string>(cursor, cursor, () => /* your code here */);

fユーザーは値を返すなどの式を指定したり、中括弧のセットを追加してメソッドを記述したりできるため、これは完璧です。ここまでは順調ですね。

今、私はこのようなアサーションも許可します:

a = w:word !{ w == "disallowed" }

これは、現在、次のようなものにコンパイルされます。

var w = this.ParseWord(...).Value;

...

if (!( w == "disallowed" ))
{
    r2 = new ParseResult<string>(cursor, cursor, string.Empty);
}

ReturnHelperが提供するのと同じmethod-bodyオプションをアサーションでサポートするようにしたいのですbool AssertionHelper(Func<bool> assertion)が、述語を呼び出すだけのメソッドを使用するのは非効率的です。

それnew Func<bool>(() => /* your code here */)()がうまくいくと思っていましたが、それが最も効率的かどうかはわかりません。

何か案は?

編集

どう((Func<bool>)(() => /* code */))()ですか?それは割り当てを回避しますか? いいえ、上記のバージョンと同じILを生成します。

4

1 に答える 1

1

なぜFunc<bool>明示的に言及する必要があるのか​​は明らかではありません。なぜだけではないのですか?

this.AssertionHelper<string>(cursor, cursor, () => !( w == "disallowed" ))

?パラメータのない単一の式であり、タイプがであると仮定すると、それでbool問題ありません。

パラメータが必要な場合は、次のようwに変更してください。

this.AssertionHelper<string>(cursor, cursor, w => !( w == "disallowed" ))

C#コンパイラのMS実装は、これを呼び出すたびに新しいデリゲートインスタンスを作成することを回避すると思いますが、実際には重要ですか?アプリケーションのプロファイルを作成して、これが実際にパフォーマンスに大きな打撃を与えているかどうかを確認しましたか?もしそうなら、それは問題ありません-そして、デリゲートのマイクロ最適化が違いを生む可能性があるいくつかのケースに関するいくつかの興味深いデータを確かに見まし-しかし、それが実際の問題であることがわかるまで、私はそれについて心配しません。

于 2012-08-30T06:08:07.117 に答える