以下のソリューションごとに、131072 (128*1024) 回の反復を (1 つのスレッドで) 実行します。VS2010 パフォーマンス アシスタントでは、次の結果が得られます。
- 読み取り専用 MethodInvoker: 5664.53 (+0%)
- 新しい MethodInvoker: 5828.31 (+2.89%)
- MethodInvoker の関数キャスト: 5857.07 (+3.40%)
- 読み取り専用アクション: 6467.33 (+14.17%)
- 新しいアクション: 6829.07 (+20.56%)
反復ごとに新しいアクションを呼び出す
private void SetVisibleByNewAction()
{
if (InvokeRequired)
{
Invoke(new Action(SetVisibleByNewAction));
}
else
{
Visible = true;
}
}
読み取り専用の組み込みコンストラクターの呼び出し、反復ごとのアクション
// private readonly Action _actionSetVisibleByAction
// _actionSetVisibleByAction= SetVisibleByAction;
private void SetVisibleByAction()
{
if (InvokeRequired)
{
Invoke(_actionSetVisibleByAction);
}
else
{
Visible = true;
}
}
反復ごとに新しいMethodInvokerを呼び出します。
private void SetVisibleByNewMethodInvoker()
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(SetVisibleByNewMethodInvoker));
}
else
{
Visible = true;
}
}
各反復で読み取り専用の組み込みコンストラクターMethodInvokerを呼び出す
// private readonly MethodInvoker _methodInvokerSetVisibleByMethodInvoker
// _methodInvokerSetVisibleByMethodInvoker = SetVisibleByMethodInvoker;
private void SetVisibleByMethodInvoker()
{
if (InvokeRequired)
{
Invoke(_methodInvokerSetVisibleByMethodInvoker);
}
else
{
Visible = true;
}
}
各反復でMethodInvokerにキャストされた関数への呼び出し
private void SetVisibleByDelegate()
{
if (InvokeRequired)
{
Invoke((MethodInvoker) SetVisibleByDelegate);
}
else
{
Visible = true;
}
}
「新しいアクション」ソリューションの呼び出しの例:
private void ButtonNewActionOnClick(object sender, EventArgs e)
{
new Thread(TestNewAction).Start();
}
private void TestNewAction()
{
var watch = Stopwatch.StartNew();
for (var i = 0; i < COUNT; i++)
{
SetVisibleByNewAction();
}
watch.Stop();
Append("New Action: " + watch.ElapsedMilliseconds + "ms");
}