私は、米国の「大きな株式市場」で開発者として働いています。私たちが非常に高速に動作する理由の 1 つは、初期化後 (市場での 1 日が始まる前) にヒープの割り当て/割り当て解除を行わないことです。この手法は取引所に固有のものではなく、ほとんどのリアルタイム システムでも一般的です。
まず第一に、リストが拡大または縮小するときにヒープ割り当てを必要としないため、リンクされたリストは配列ベースのリストよりも優先されます。取引所の複数のアプリケーションで連結リストを使用しています。
- 1 つのアプリケーションは、初期化中にすべてのオブジェクトをプール (リンクされたリスト) に事前に割り当てることです。したがって、新しいオブジェクトが必要なときはいつでも、リストの先頭を削除できます。
- 別のアプリケーションが注文処理中です。すべての Order オブジェクトは、リンクされたリスト エントリ インターフェイスを実装します (前と次の参照があります)。そのため、顧客から注文を受け取ると、プールから Order オブジェクトを削除し、「処理する」リストに入れることができます。すべての Order オブジェクトは Linked List エントリを実装しているため、リスト内の任意のポイントに追加することは、前および次の参照を設定するのと同じくらい簡単です。
私の頭の上の例:
Interface IMultiListEntry {
public IMultiListEntry getPrev(MultiList list);
public void setPrev(MultiList list, IMultiListEntry entry);
public IMultiListEntry getNext(MultiList list);
public void setNext(MultiList list, IMultiListEntry entry);
}
Class MultiListEntry implements IMultiListEntry {
private MultiListEntry[] prev = new MultiListEntry[MultiList.MAX_LISTS];
private MultiListEntry[] next = new MultiListEntry[MultiList.MAX_LISTS];
public MultiListEntry getPrev(MultiList list) {
return prev[list.number];
}
public void setPrev(MultiList list, IMultiListEntry entry) {
prev[list.number] = entry;
}
public IMultiListEntry getNext(MultiList list) {
return next[list.number];
}
public void setNext(MultiList list, IMultiListEntry entry) {
next[list.number] = entry;
}
}
Class MultiList {
private static int MAX_LISTS = 3;
private static int LISTS = 0;
public final int number = LISTS++;
private IMultiListEntry head = null;
private IMultiListEntry tail = null;
public IMultiListEntry getHead() {
return head;
}
public void add(IMultiListEntry entry) {
if (head==null) {
head = entry;
} else {
entry.setPrevious(this, tail);
tail.setNext(this, entry);
}
tail = entry;
}
public IMultiListEntry getPrev(IMultiListEntry entry) {
return entry.getPrev(this);
}
public IMultiListEntry getNext(IMultiListEntry entry) {
return entry.getNext(this);
}
}
あとは、MultiListEntry を拡張するか、IMultiListEntry を実装して、インターフェイス メソッドを MultiListEntry オブジェクトへの内部参照に委譲するだけです。