计算硬盘吞吐量

2024-04-03

我的应用程序创建了一个 2GB 文件,需要选择系统上速度最快且有足够空间的驱动器。我尝试通过创建文件、设置长度,然后按顺序向其中写入数据来计算吞吐量,如下所示:

FileInfo file = null;
var drives = DriveInfo.GetDrives();
var stats = new List<DriveInfoStatistics>();

foreach (var drive in drives)
{
    do
    {
        file = new FileInfo(Path.Combine(drive.RootDirectory.FullName, Guid.NewGuid().ToString("D") + ".tmp"));
    }
    while (file.Exists);

    try
    {
        using (var stream = file.Open(FileMode.CreateNew, FileAccess.Write, FileShare.None))
        {
            var seconds = 10;
            var frameRate = 120F;
            var bytesWritten = 0L;
            var bytesPerPixel = 1;
            var watch = new Stopwatch();
            var videoSize = new Size(1328, 1048);
            var buffer = new byte [(int) (videoSize.Width * videoSize.Height * bytesPerPixel)];

            stream.SetLength((long) (videoSize.Width * videoSize.Height * bytesPerPixel * frameRate * seconds));

            watch.Restart();
            for (int i = 0; i < seconds; i++)
            {
                for (int j = 0; j < frameRate; j++)
                {
                    stream.Write(buffer, 0, buffer.Length);
                    bytesWritten += buffer.Length;
                }
            }
            watch.Stop();

            stats.Add(new DriveInfoStatistics(drive, bytesWritten / watch.Elapsed.TotalSeconds));
        }
    }
    catch
    {
    }
    finally
    {
        file.Refresh();
        if (file.Exists) { try { file.Delete(); } finally { file.Refresh(); } }
    }
}

if (stats.Count == 0)
{
    throw (new Exception("No suitable drives were found."));
}
else
{
    stats.Sort((x, y) => y.DataTransferRate.CompareTo(x.DataTransferRate));

    message
        = "The following drives are suitable candidates (best to worst):"
        + Environment.NewLine
        + Environment.NewLine
        + string.Join(Environment.NewLine, stats.ConvertAll<string>(s => (s.DriveInfo.RootDirectory.FullName.Substring(0, 2).ToUpper() + " " + ConversionUtilities.ToIsuBytesNotation(s.DataTransferRate) + "ps")))
        + Environment.NewLine
        + Environment.NewLine
        + "Test results may vary based on other applications accessing the drives."
        + Environment.NewLine
        + Environment.NewLine
        + "Try the test with the system configured as it would be in production."
        ;

    MessageBox.Show(message);
}

我得到的结果没有意义:

DESKTOP

D: 4.15 GBps // SSD.
F: 4.09 GBps // HDD (5200 RPM).
E: 4.06 GBps // HDD (7500 RPM).
C: 4.03 GBps // SSD.
H: 2.45 GBps // Ram Disk!!!
  • 首先,SSD和HDD距离太近。
  • 其次,速度比我想象的要快得多。
  • 第三,Ram Disk(使用 RAMDisk 创建)似乎具有最低的吞吐量。实际上,在写入实际视频数据时,Ram Disk 的性能远远优于其他磁盘。

LAPTOP

E: 981.24 MBps // Ram Disk.
C: 100.17 MBps // HDD (5200 RPM).
D: 055.94 MBps // HDD (5200 RPM).

在我的开发笔记本电脑上使用相同代码的结果更加可信。

上面的代码有问题吗?如果不是,您如何解释 SSD 的吞吐量为 4 GBps,而 Ram 磁盘的吞吐量最高为 2.5 GBps?

我知道影响吞吐量的因素有很多,而且基准测试软件非常复杂。然而,就我而言,以每秒 120 帧的速度写入 2GB 视频文件而不丢失帧至关重要,上面的代码应该向用户提供关于使用哪个驱动器来保存瞬态视频帧的快速而粗略的建议。这些帧随后经过后处理并转码成大小只有几兆字节的 MP4 视频。

最后,我尝试了上面的代码Contig.exe from Sysinternals以确保连续布局以获得更好的 HDD 性能。但是,我没有注意到性能差异,这表明该文件在开始时碎片不够(在创建时)。


如果程序将数据写入磁盘,会发生很多不同的事情:

首先,数据被写入 RAM 缓冲区,并且在数据传输到下一个阶段之前,写入程序方式会确认该操作。

然后数据被写入硬盘控制器,硬盘控制器可以进行自己的缓存。

然后数据被写入硬盘驱动器,硬盘驱动器又可以进行自己的缓存。

测量起来非常复杂real高级软件的吞吐量。

一种可能性:写入一个非常大的文件,预计该文件比操作系统/控制器/硬盘驱动器中的任何缓存都要大得多。这可以让您很好地估计持续写入率.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算硬盘吞吐量 的相关文章

随机推荐

  • 具有动态适配器的动态列表视图

    我想创建一个动态列表视图 它在滚动到初始列表末尾时添加动态元素 每次滚动位置到达上一个列表的末尾时 都应添加新项目 我怎样才能实现这个目标 谢谢 您需要添加一个滚动侦听器并覆盖onscroll
  • 在 LightningChartJs 中获取一系列的可见点

    存在一个函数LightningChartJs得到所有visible points来自图表中的线或点系列 如果我缩放图表 如果没有可用的可见点 我想显示一些内容 在某些情况下 我的数据会出现中断 现在我必须检查范围并过滤该范围内的所有点 但这
  • Spring 集成超时客户端

    我的 Spring 集成场景是 使用自定义协议发送数据的数十个生产者 大小和内容 我必须解码这个自定义协议 然后处理结果 所以我尝试了很多配置 目前最好的配置如下
  • 如何在不同身份下运行iisexpress应用程序池

    有没有办法以当前登录用户以外的不同身份运行 iisexpress 应用程序池 我目前正在使用 runas 命令解决这个问题 但我想知道 iisexpress 是否有内置的东西可以利用 看起来这应该是可能的 在 IIS Express 站点的
  • 如何在FabricJS中将旋转点位置更改为底部?

    How to change Rotating point position to the bottom see image below 这里是选择对象的配置控制点的链接指南 http fabricjs com fabric intro pa
  • 在 shell 脚本中执行 Vim 命令

    我正在编写一个 Bash 脚本 该脚本运行命令行程序 Gromacs 保存结果 修改输入文件 然后再次循环该过程 我正在尝试使用 Vim 修改输入文本文件 但在打开输入文件后 我无法找到从 sh 文件执行内部 Vim 命令的方法 例如 12
  • get_map 未传递 API 密钥(HTTP 状态为“403 禁止”)

    我一直在面临这个问题get map 功能 ggmap库 在 R 中 我的代码无需指定 API 密钥即可运行 例如source google 持续了几个月 然而 该代码在几周前停止工作 我了解到 Google 已强制要求 API 密钥 或者可
  • Linux C/C++ 在动态库中分配/释放内存

    我必须将我的应用程序分成几个逻辑模块 mainapp module1 so module2 so module3 so 等等 其中每个模块是一个 so库 将在运行时加载 每个模块共享相同的接口 并将返回一些数据数组 例如 int ptr m
  • 有没有一种方法可以在一行中从数组值设置对象键

    假设我有一个像这样的数组 const myArray HP QP PS 我想要一个对象 其键是myArray的值如 HP 0 QP 0 PS 0 有没有办法在一行中执行以下操作 const myObj myArray forEach ite
  • 是否有标准方法可以在编译时确定系统是 32 位还是 64 位?

    我需要设置 ifdef 检查条件编译 我想自动化该过程 但无法指定目标操作系统 机器 有什么方法可以让预编译器判断它是在 32 位还是 64 位上运行吗 解释 我需要定义一个 64 位大小的类型 在 64 位操作系统上它是一个 long 在
  • 在 Stylus 中访问 JavaScript 的原生数学库

    我最近问了一个问题是否可以用手写笔计算平方根 https stackoverflow com questions 21033346 得到这个问题的答案后 我想知道是否有一种方法可以完全访问 Stylus 中的 JavaScript 原生数学
  • 具有 3 个用户连接的 WebRTC

    我现在正在实施源代码WebRTC 示例 https github com webrtc samples tree gh pages src content peerconnection audio通过使用网状拓扑成为 3 个用户连接 但是
  • 为什么OutputStream存在write(int b)方法? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 Java OutputStream write 接受整数但写入字节 https stackoverflow com questions 1407893 why java outputstrea
  • 我们如何检查表是否有索引?

    我们如何检查该表是否有索引 如果有如何找到表的特定列的索引 问候 库马尔 在 SQL Server Management Studio 中 您可以沿着树导航到您感兴趣的表并打开索引节点 双击该节点中的任何索引将打开属性对话框 其中将显示索引
  • 图像上沿折线/曲线的点的有序列表

    我有一些带有折线 多重曲线组合的图像 我的目标是恢复沿着这些折线 多重曲线的点的有序列表 使用 opencv ConnectedComponents 我可以隔离图像中的每条折线 曲线 然后尝试通过以下步骤获取有序的点序列 num label
  • With 函数中的多个对象表达式循环遍历所有工作表

    我有一个由两张表组成的 Excel 电子表格 Sheet1 and Sheet2 在每张纸上我都有一个Button 1 为了将此按钮移动到Range D9 E11 在两张表中 我使用以下 VBA 来引用解决方案here https stac
  • Angular 2 找不到我的功能模块中声明的组件

    我很难让模块在 Angular 2 中工作 我创造了a plunk http plnkr co edit gJup4zH7v4CoFNC8k5kZ p preview这说明了问题所在 在 plunk 中 您会看到我有 app module
  • 如何将文本附加到 d3.js 中的一行

    我正在尝试将文本附加到条形图上创建的线条中 问题是我可以看到文本元素已创建 但它没有显示在 svg 上的任何地方 我附加文本的代码部分 var line svg append line attr x1 function return x l
  • 是否可以在 Android 设备上运行容器?

    我是一名移动开发人员 最近擅长使用 docker 容器 我正在为我的研究生项目开发容器架构 该架构的模块之一需要在 Android 设备上运行 但我找不到有关如何在 Android 设备上运行容器的信息 它可以是一些简单的东西 比如用 py
  • 计算硬盘吞吐量

    我的应用程序创建了一个 2GB 文件 需要选择系统上速度最快且有足够空间的驱动器 我尝试通过创建文件 设置长度 然后按顺序向其中写入数据来计算吞吐量 如下所示 FileInfo file null var drives DriveInfo