2012-10-26 73 views
1

我創建了一個C#控制檯應用程序,該應用程序使用隨機創建的字符串連續創建文本文件。時間(以分鐘爲單位)作爲應用程序的輸入,並運行該分鐘數以生成連續的文本文件。據我所知,生成的數據量取決於處理器的速度和其他配置。我的機器能夠在1分鐘內以文本格式生成總共25 MB的數據。在C#中以特定速度生成隨機文本文件

現在,我的問題是,如果作爲應用程序的另一個輸入通過我的代碼提供,我可以控制每分鐘生成的數據的速率嗎?

任何幫助將非常感激。

回答

1
var start = DateTime.Now; 
int bytesSaved=0; 
double desiredSpeed = (25*1024*1024)/60; 

while(true) 
{ 
    int latency = bytesSaved/(DateTime.Now-start).TotalSeconds - desiredSpeed; 
    if(latency>0) 
    {   
     Thread.Sleep(100); 
     continue; 
    } 

    bytesSaved +=SaveDataChunk(latency);  

} 
+0

這有錯誤的類型,不會編譯。 – 2012-10-26 22:11:08

+0

我只是在這裏輸入它沒有測試,應該給一個方向 – Anri

+0

非常感謝。我修改了代碼,以便及時計算延遲並將其傳遞給thread.sleep方法,該方法允許我精確地在所需的毫秒級內休眠。謝謝你的幫助。 –

0

是的。你可以做兩件事中的一件。如果你想控制數據的MB,那麼讓用戶傳入一個int值,用來控制寫入文件的字符串的長度。另一種選擇是使用睡眠。您可以讓用戶傳入睡眠值,然後您可以在每次寫入之間休息這段時間。

+0

感謝您的回答。第一個選項是輸入。睡眠時間不會作爲輸入。文本文件每行中的字符串長度都是特定的格式。它不能被改變或控制。我必須控制字符串寫入文件的速率。 –

+0

那麼使用睡眠是正確的方法。 – evanmcdonnal

2

如果你只能在一分鐘內生成25MB,並且它只是隨機字符串,那麼你還有別的想法 - 你應該能夠輕鬆地做到一分之一以上。

但是就控制而言,只有這樣我才能想到的是手動讓計時器繼續運行,並跟蹤您寫了多少時間,以自動計算您的速率如果有必要,那麼一旦你計算出你的速度有多快,你就會適當地睡覺,而不是你想要的速度。

這不會是完美的,但你應該能夠做出最好的猜測,並根據過去的表現不斷調整你的睡眠時間。

+0

感謝喬的答案。問題是我不知道它將運行在哪個機器/配置上,所以我無法對性能做出最佳猜測。這將是另一個根據機器配置製作性能決策引擎的繁瑣工作。 –

+0

@ sridam.g然後,這個答案完全是*所需要的:**「自動計算你的速度 - 然後適當地睡覺」**。也就是說,設定了「目標速率」,並且程序通過等待(在繁忙的循環或定時器中)酌情按照時間表盡最大努力。這與遊戲限制FPS的方式類似,比如60 /秒。請注意,算法*不知道機器配置 - 只知道*已經花了多少時間寫入前一個輸出。 – 2012-10-26 22:06:03

+0

你必須自己計算表現,不要假設任何事情。例如,在您的循環中,經過100次左右的迭代後,查看已經過了多長時間。假設100次迭代需要1秒鐘,但您希望在一分鐘內看到1,000次迭代。那麼你的方式太快了,需要在59秒內將剩餘時間減少到900次迭代。在下一百次迭代中睡眠50ms,然後看看你在哪裏。保持每n次迭代節流。 –

0

您可以設置一個計時器並每N秒創建一個文件。