我有一個應該是「QoSed」 DLL方法 - 這種方法應該被稱爲最大每秒100次:最好的方式來算多少次每秒的方法被稱爲
private static extern int ExecTrans(int connectionId);
,才使用此方法在程序中的一個地方,所以這個地方可以。 我需要爲每個connectionId
單獨使用「qos counter」。所以ExecTrans(1)
和ExecTrans(2)
應該去不同的計數器。
在第一次迭代中,我想要計算方法調用的頻率(每個connectionId
)。即我想要「現場統計」。有兩種方法:
- 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.
現在我不在乎使用哪個這些方法,但我會選擇一個產生更少的「開銷」。我希望qos儘可能減少「額外工作」,因爲它每隔0.1 ms就對交易軟件敏感。
對於第一種方法,我認爲我可以使用類似的東西(pseude碼,可能stats
和curStats
應線程安全):
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];
......
}
至於第二種方法....是它可能做一個集合,其中對象的生活只有一秒鐘和一秒鐘後消失?然後每次我將下一個對象添加到集合,除非集合包含100個對象。
您認爲如何?我不熟悉C#庫文件,所以可能我錯過了一些有用的分類,可能你可以建議另一種方法。
我猜想在達到極限時應該怎麼做會有些困惑。放下新的工作物品?丟棄舊作品(如果它們不是內聯的)?介紹一個暫停? – 2011-12-09 17:50:41
介紹一個暫停 – javapowered
然後也許增加一個螺旋鎖計數高於100重新檢查。 –