我正在编写高频交易软件。我正在尝试优化它。我发现每一秒我都会创建几千个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个。但我每秒多次创建相同的 Instrument 对象,如下所示:
new Instrument { GateId = 0, Ticker = "MSFT" }
即我有许多“MSFT”仪器实例,但我可以在 HashSet/HashMap 或任何地方使用它们,这要归功于覆盖Equals
和GetHashCode
方法。
Instrument
但现在我认为在运行时拥有 10 或 100 个“MSFT”对象(它们彼此相等)是否有意义。
所以我想创建这样的东西:
interface InstrumentFactory {
public Instrument GetInstrument(int GateId, string Ticker);
}
每次我需要一些乐器时,我只想问问 InstrumentFactory。InstrumentFactory 将在内部将我的 100 个仪器存储在 HashSet 中,并且只会返回缓存的副本。此外,我现在可以删除Equals
和GetHashCode
方法,因为Instrument
每个 gateId + 股票代码对都有一个。
问题:
- 采用新方法,我的性能会有显着提升吗?
- 你对新设计有什么看法?当我经常需要相同的对象时,最好使用
factory
而不是每次使用重写的 Equals 和 GetHashCode 方法创建新对象?