我需要檢查我的Windows應用程序,並瞭解它如何在具有慢磁盤的系統上運行。 我怎樣纔能有一個模擬緩慢的磁盤,Windows不緩存它的內容,所以我可以重複我的測試?如何模擬緩存和不讀緩存磁盤驅動器
更新:我有很多代碼訪問磁盤,無法創建新類以模擬慢速光盤,部分代碼是第三方&,沒有可訪問的源代碼。
更新2:我也需要減慢Directory.GetFiles()的速度。
我需要檢查我的Windows應用程序,並瞭解它如何在具有慢磁盤的系統上運行。 我怎樣纔能有一個模擬緩慢的磁盤,Windows不緩存它的內容,所以我可以重複我的測試?如何模擬緩存和不讀緩存磁盤驅動器
更新:我有很多代碼訪問磁盤,無法創建新類以模擬慢速光盤,部分代碼是第三方&,沒有可訪問的源代碼。
更新2:我也需要減慢Directory.GetFiles()的速度。
如果您確實有源代碼,您可以編寫一個模擬磁盤行爲的類,並將所有磁盤讀/寫代碼替換爲對您的類的調用。
您需要緩存由應用程序完成的請求,並在延遲後執行它們。
如果您無法訪問代碼,那麼您希望找到一個模擬慢速磁盤的驅動程序......如果存在這種情況。
你可以慢decorator在Stream這將做部分(或全部)操作與延遲創建:
public class SlowStream : Stream
{
private Stream _stream;
private TimeSpan _delay;
public SlowStream(Stream stream, TimeSpan delay)
{
_stream = stream;
_delay = delay;
}
// implementation
}
在實現流會員,你應該直接委派一些操作,以裝飾流
public override bool CanRead
{
get { return _stream.CanRead; }
}
public override void Flush()
{
_stream.Flush();
}
public override void Close()
{
_stream.Close();
}
但是要延遲其他操作,你想慢一點:
public void Wait()
{
Thread.Sleep(_delay);
}
public override int Read(byte[] buffer, int offset, int count)
{
Wait();
return _stream.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
Wait();
_stream.Write(buffer, offset, count);
}
用法:
using(var stream = File.Open(fileName, FileMode.Open))
{
var slowStream = new SlowStream(stream, TimeSpan.FromSeconds(1));
var reader = new StreamReader(slowStream);
string line;
while((line = reader.ReadLine()) != null)
Console.WriteLine(line);
}
你可以使用一個虛擬機和油門磁盤訪問......這裏是關於如何在VirtualBox中5.8做一些提示。限制磁盤映像的帶寬https://www.virtualbox.org/manual/ch05.html#storage-bandwidth-limit
我認爲MS和VMWare虛擬化工具提供了類似的功能。
謝謝謝爾蓋的回答,但是在某些情況下,它可能會用較少的代碼和沒有裝飾器來完成 - 只需從所需的Stream對象繼承並延遲覆蓋Read方法。這裏是樣本類,它足以滿足我在類似情況下的需求:
public class SlowStream : MemoryStream
{
private readonly TimeSpan _delay;
public SlowStream(byte[] buffer, TimeSpan delay)
: base(buffer)
{
_delay = delay;
}
public override int Read(byte[] buffer, int offset, int count)
{
Thread.Sleep(_delay);
return base.Read(buffer, offset, count);
}
}