私は HFT 取引ソフトウェアを書いています。私はそれを最適化しようとしています。私は、毎秒数千のInstrument
オブジェクトを作成していることに気付きました。このクラスのソース コードは次のとおりです。
public class Instrument
{
public int GateId { get; set; }
public string Ticker { get; set; }
public override string ToString()
{
return "GateID: " + GateId + " Ticker: " + Ticker + '.';
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
Instrument instrument = obj as Instrument;
if (instrument == null)
{
return false;
}
return (GateId.Equals(instrument.GateId)) && (Ticker.Equals(instrument.Ticker));
}
public override int GetHashCode()
{
int hash = 13;
hash = (hash * 7) + GateId;
hash = (hash * 7) + Ticker.GetHashCode();
return hash;
}
}
インストゥルメントの実際の数はかなり限られています。全部で100くらいです。しかし、次のように、1 秒間に何度も同じ Instrument オブジェクトを常に作成しています。
new Instrument { GateId = 0, Ticker = "MSFT" }
つまり、「MSFT」Instrument のインスタンスが多数ありますが、HashSet/HashMap またはオーバーライドEquals
されたGetHashCode
メソッドのおかげでどこでも使用できます。
Instrument
しかし、実行時に10個または100個の「MSFT」オブジェクト(互いに等しい)を持つことが理にかなっていると思います。
だから私はそのようなものを作成したい:
interface InstrumentFactory {
public Instrument GetInstrument(int GateId, string Ticker);
}
楽器が必要になるたびに、InstrumentFactory に尋ねたいと思います。InstrumentFactory は私の 100 個の楽器を HashSet に内部的に保存し、キャッシュされたコピーを返します。また、gateId + ティッカーのペアごとに正確に 1 つあるためEquals
、andGetHashCode
メソッドを削除できるようになりました。Instrument
質問:
- 新しいアプローチを使用すると、パフォーマンスが大幅に向上しますか?
- 新しいデザインについてどう思いますか?頻繁に同じオブジェクトが必要な場合
factory
、オーバーライドされた Equals および GetHashCode メソッドで毎回新しいオブジェクトを作成する代わりに使用する方が良いですか?