【问题标题】:How to simulate slow and no-read-cache disk drive如何模拟慢速和无读缓存磁盘驱动器
【发布时间】:2013-07-28 03:53:30
【问题描述】:

我需要检查我的 Windows 应用程序,看看它在磁盘速度较慢的系统上是如何工作的。 我怎样才能有一个 Windows 不缓存它的内容的模拟慢速磁盘,以便我可以重复我的测试?

更新:我有很多访问磁盘的代码,无法创建新的类来模拟慢速磁盘,部分代码是第三方的,没有可访问的源代码。

更新 2:我也需要降低 Directory.GetFiles() 的速度。

【问题讨论】:

    标签: .net wpf windows disk


    【解决方案1】:

    您可以在 Stream 上创建慢速 decorator,这将延迟执行一些(或全部)操作:

    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);
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用虚拟机并限制磁盘访问...这里有一些关于如何在 Virtualbox 5.8 中执行此操作的提示。限制磁盘映像的带宽https://www.virtualbox.org/manual/ch05.html#storage-bandwidth-limit

      我认为 MS 和 VMWare 虚拟化工具提供了类似的功能。

      【讨论】:

        【解决方案3】:

        如果您有源代码,您可以编写一个模拟磁盘行为的类,并将所有磁盘读/写代码替换为对您的类的调用。

        您需要缓存应用程序完成的请求,并在延迟后执行。

        如果您无法访问代码,您希望找到一个模拟慢速磁盘的驱动程序...如果存在这种情况。

        【讨论】:

          【解决方案4】:

          感谢 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);
                  }
              }
          

          【讨论】:

          • 这与其他答案没有什么不同,您只是实现了一个不同的基类。
          猜你喜欢
          • 2017-01-27
          • 2014-08-28
          • 1970-01-01
          • 2013-09-07
          • 2010-11-03
          • 1970-01-01
          • 2010-12-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多