Autor Beitrag
flotschie
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 11.07.09 13:10 
Hallo,

ich habe ein StreamEvent, das ein paar tausendmal pro Sekunde getriggered wird (Kursdaten von einer Börse). Ich will nur die prozentuelle Veränderung zum letzten Börsekurs berechnen. Dafür muss ich das richtige Instrument aus einer Hashtable per Key finden und dann die Veränderung ausrechnen:


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
private double abw;
void TPBrief_Brief(int SymbolNr, float NewPrice, float Volume, DateTime Time)
        {
            abw = (((InstrumentObject)os[SymbolNr]).LastPrice - NewPrice) / (((InstrumentObject)os[SymbolNr]).LastPrice/ 100);
            if (abw >= 1.5) {//do whatever}
            // rest of code
        }


Ich habe dazu mehrere Fragen:

1. Soweit ich mich informiert habe, ist ein Dictionary etwas schneller als der (alte) Hashtable - ist das richtig?
2. Kann man die Berechnung der prozentuellen Veränderung optimieren?
3. Was ist mit dieser Variante:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
void TPBrief_Brief(int SymbolNr, float NewPrice, float Volume, DateTime Time)
        {
            IntrumentObject io = ((InstrumentObject)os[SymbolNr]);
            abw = (io.LastPrice - NewPrice) / (io.LastPrice/ 100);
            if (abw >= 1.5) {//do whatever}
            // rest of code
        }


Ist die schneller als oben gezeigte?

Jeder Kommentar ist willkommen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 11.07.09 13:38 
user profile iconflotschie hat folgendes geschrieben Zum zitierten Posting springen:
ich habe ein StreamEvent, das ein paar tausendmal pro Sekunde getriggered wird (Kursdaten von einer Börse).
Wahrscheinlich über das Internet? Dann ist es vollkommen wurst, was du auf dem Client anstellst, den Bottleneck wird wohl immer das Netzwerk darstellen. Zerbrich dir also nicht den Kopf über Performance, sondern nimm einfach den kürzesten, lesbarsten, elegantesten Code :) . In diesem Sinne gibt es auch keinen Grund, eine untypisierte Hashtable einzusetzen.

_________________
>λ=
Thorsten83
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 191
Erhaltene Danke: 1



BeitragVerfasst: Sa 11.07.09 13:41 
Hey,

letztendlich sind ja beides indirekte Adressierungen, und im Cache ist der Wert nach dem ersten Zugriff sowieso...

Wenn, dann würde ich das aber auch so machen:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
void TPBrief_Brief(int SymbolNr, float NewPrice, float Volume, DateTime Time)
        {
            float lastPrice = ((InstrumentObject)os[SymbolNr]).lastPrice;
            abw = (lastPrice - NewPrice) / (lastPrice/ 100);
            if (abw >= 1.5) {//do whatever}
            // rest of code
        }

Dann kann der Wert halt direkt in einem Register vogehalten werden, die Frage ist aber wie ja schon gesagt, ob das wirklich der Flaschenhals ist?
flotschie Threadstarter
Hält's aus hier
Beiträge: 8



BeitragVerfasst: Sa 11.07.09 15:04 
Danke für die Antworten - ihr habt vollkommen recht. Ich hab mal mehrere Varianten durchgetestet, selbst für 1.000.000 triggers braucht der code nur ca. 500 ms. Der Flaschenhals ist definitiv woanders - nur wo? Mein Problem ist nämlich folgendes:

Gebe ich zu viele Instrumente in den Stream, dann bricht mir irgendwann mal der Stream ab. Das heisst, es werden keine Events mehr getriggert. Es kommen darüber auch keine Exceptions. Ich habe schon probiert die Priority des DataProvider Client Prozesses raufzusetzen, bringt aber auch nichts. Ich hab das Gefühl das es sich irgendwo staut. Früher hab ich dieses Problem dadurch lösen können, dass ich die GUI des DataProvider Clients gestartet habe. Auf einmal wurden wieder Events geliefert. Doch das will ich nicht mehr machen bzw. da muss es doch noch andere Lösungen geben.

Ich habe auch rausgefunden, dass es mit der CPU Performance zusammen hängt. Auf älteren Systemen passieren diese 'Stream-Abbrüche' viel öfters und bei weniger Instrumenten.

An welcher Schraube muss ich da drehen, um hier Verbesserungen zu erzielen? An den Netzwerkeinstellungen? Aber wo?