現在、オブジェクトのメソッドを 1,000,000 回以上呼び出しているコードがあります。現在、このコード セクションの実行には約 2 分かかります。このメソッドには、実行時間の長いコード部分を含むロックも含まれているため、単純な並列実行では実行時間を短縮することはできません。
class Rule
{
private readonly Jint.Engine _rule;
private readonly object _ruleLock;
public Rule(Jint.Engine rule)
{
this._rule = rule;
this._ruleLock = new object();
}
public void InvokeRule(object source, object target)
{
lock (_ruleLock)
{
_rule.Invoke("rule", source, target);
}
}
}
ただし、内部のコードは単なる計算でステートフルではないため、同じルール コードでこのオブジェクトの複数のインスタンスを作成できます。ただし、複数のインスタンスを生成すると、Jint.Engine.Execute() の実行にも比較的長い時間がかかるため、時間への影響も大きくなります。
同じルールに対して複数のインスタンスが作成される場合は、インスタンスが 1 つだけ使用されるようにしたいと考えています。
これに似たものを作成する方法はありますか:
var rulesOfSameKind = new List<Rule>{
new Rule(new Jint.Engine().Execute(commonJSText)),
new Rule(new Jint.Engine().Execute(commonJSText))
}
return rules.OfSameKind.First(rule => rule.IsNotRunning).InvokeRule(source, target);
私が何を意味するのかを説明するのは少し難しいですが、基本的には、スレッドがロックされているか実行されているかを確認し、次のスレッドを試して、最初のスレッドから値を返して実行できるようにする方法を探しています。