mam metodę DLL, który powinien być „QoSed” - metoda ta powinna być nazywana maksymalną 100 razy na sekundę .:najlepszym sposobem, aby policzyć, ile razy w ciągu sekundy metoda nazywa
private static extern int ExecTrans(int connectionId);
Metoda ta używana tylko w jednym miejscu w programie, więc jest ok do tego miejsca. Potrzebuję osobnego "licznika qos" dla każdego connectionId
. Tak więc ExecTrans(1)
i ExecTrans(2)
powinny iść do różnych liczników.
Na początku mojej iteracji chciałbym policzyć jak często metoda jest wywoływana (dla każdego connectionId
). To znaczy. Chcę mieć "statystyki na żywo". Istnieją dwa podejścia:
- allow to exceed limitiation for a short period. for example allow "100 transaction from 0 to 1 second, 100 transaction from 1 to 2 seconds and 200 transactions from 0.5 to 1.5 second".
- at any second interval transactions should not exceed 100.
Na razie nie obchodzi mnie, która z tych metod do wykorzystania, ale chciałbym wybrać jedną tworząc mniej „narzut”. Chcę qos dodać jako mniej "dodatkową pracę", ponieważ jest to oprogramowanie handlowe wrażliwe na każde 0,1 ms.
Jak za pierwszym podejściu myślę, że mogę używać coś takiego (pseude kodu, prawdopodobnie stats
i curStats
należy thread-safe):
private int[] stats // statistic to display to user
private int[] curStats; // statistic currently collection
OnOneSecondElapsed(object source, ElapsedEventArgs args) {
foreach (conId : connIds) {
stats[conId] = curStats[conId];
curStats[conId] = 0;
}
}
myMethod {
......
ExecTrans(conId);
++curStats[conId];
......
}
Co do drugiego podejścia jest to .... czy można stworzyć kolekcję, w której przedmioty żyją dokładnie przez jedną sekundę, a po chwili znikają? Za każdym razem dodam następny obiekt do kolekcji, chyba że kolekcja zawiera 100 obiektów.
Co myślisz? Nie jestem zaznajomiony z plikami biblioteki C#, więc prawdopodobnie brakuje mi niektórych przydatnych klas, prawdopodobnie możesz zaproponować inne podejście.
Sądzę, że istnieje pewne zamieszanie związane z tym, co należy zrobić po przekroczeniu limitu. Upuść nowe elementy pracy? Upuść stare elementy pracy (jeśli nie występują w sieci)? Wprowadzić przerwę? –
wprowadzenie pauzy – javapowered
Następnie może dodać spinlock, gdy liczba jest wyższa niż 100, aby ponownie sprawdzić. –