我需要检查我的Windows应用程序,看看它在磁盘速度较慢的系统上是如何工作的。我怎么能有一个Windows不缓存内容的模拟慢速磁盘,这样我就可以重复测试了?
更新:我有很多代码访问磁盘,无法创建新的类来模拟慢速磁盘,部分代码是第三方&没有可访问的源代码。
更新2:我也需要降低Directory.GetFiles()的速度。
您可以在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-带宽限制
我认为MS和VMWare虚拟化工具提供了类似的功能。
如果您有源代码,您可以编写一个模拟磁盘行为的类,并用对类的调用替换所有磁盘读/写代码。
您需要缓存应用程序完成的请求,并在一段延迟后执行它们。
如果你无法访问代码,你希望找到一个模拟慢速磁盘的驱动程序。。。如果存在这样的事情。
感谢Sergey的回答,但在某些情况下,这可能需要更少的代码和装饰器-只需从所需的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);
}
}