對於任何有興趣查看我來自哪裏的人都可以參考第1部分,但這不是必需的。寫文件需要針對繁重的流量進行優化第2部分
write file need to optimised for heavy traffic
下面的代碼片段我寫捕捉從代理API的一些財務數據打勾。該代碼將運行沒有錯誤。我需要優化代碼,因爲在繁忙時間zf_TickEvent方法每秒會調用超過10000次。我使用一個內存流來保存數據,直到它達到一定的大小,然後我將它輸出到一個文本文件中。
代理API只有單線程。
void zf_TickEvent(object sender, ZenFire.TickEventArgs e)
{
outputString = string.Format("{0},{1},{2},{3},{4}\r\n",
e.TimeStamp.ToString(timeFmt),
e.Product.ToString(),
Enum.GetName(typeof(ZenFire.TickType), e.Type),
e.Price,
e.Volume);
fillBuffer(outputString);
}
public class memoryStreamClass
{
public static MemoryStream ms = new MemoryStream();
}
void fillBuffer(string outputString)
{
byte[] outputByte = Encoding.ASCII.GetBytes(outputString);
memoryStreamClass.ms.Write(outputByte, 0, outputByte.Length);
if (memoryStreamClass.ms.Length > 8192)
{
emptyBuffer(memoryStreamClass.ms);
memoryStreamClass.ms.SetLength(0);
memoryStreamClass.ms.Position = 0;
}
}
void emptyBuffer(MemoryStream ms)
{
FileStream outStream = new FileStream("c:\\test.txt", FileMode.Append);
ms.WriteTo(outStream);
outStream.Flush();
outStream.Close();
}
問:
任何建議,使這個更快?我會嘗試改變緩衝區的長度,但在代碼結構方面,這(幾乎)是最快的?
當MemoryStream的被填滿,我就清空該文件,會發生什麼樣的新的數據來了呢?當我清空我的第一個緩衝區時,是否需要實現第二個緩衝區來保存這些數據?或者說c#足夠聰明地搞清楚了嗎?
感謝您的任何意見
@ USR我想到過,多線程,但它是否將是太難爲別人是誰寫他們的第一個程序? –
是的,可能:)如果你不使用多線程,你所能做的就是優化代碼並嘗試使用緩衝區大小。 – usr
任何有興趣的人請參閱我的問題的第3部分 –