【问题标题】:Gathering Performance Metrics: Resetting "Warm" vs. "Cold" State on a File收集性能指标:重置文件的“暖”与“冷”状态
【发布时间】:2018-02-16 17:11:51
【问题描述】:

我知道这是一个笼统的问题,但我不知道如何处理它。

我正在编写一些测试来收集有关打开文件需要多长时间的数据,并使用两种不同的方法从中提取一些数据。我注意到在某些情况下,差异可能非常大,这可能是有效的结果,但我想消除潜在的缓解因素。特别是,我担心在 Windows 上打开“暖”文件与“冷”文件。

我这里的基本流程(伪ish代码)如下:

private void GatherMetrics(List<FileInfo> files)
{
    // Each metric holds how much data was gathered and how long it took
    var results = new List<MetricsResult>();

    for (int i = 0; i < files.Count; i++)
    {
        results.Add(GetAllData(files[i]));
        results.Add(GetDataSubset(files[i]));
    }

    // This just generates statistics on the data and outputs it somewhere.  Not
    // really relevant, since by then the data is already gathered.
    LogResults(results);
}

private MetricsResult GetAllData(FileInfo file)
{
    var stopwatch = new Stopwatch();
    stopwatch.Start();

    // Open file
    // Get the data from the file
    // Close file

    stopwatch.Stop();

    return new MetricsResult 
    { 
        Time = stopwatch.ElapsedMilliseconds,
        Data = /* data gathered from the file */
    }
}

private MetricsResult GetAllData(FileInfo file)
{
    // Same as GetAllData, only gathers data in a different way
}

如您所见,我正在打开一个文件,获取数据,关闭文件,再次打开它,以不同的方式获取数据,然后再次关闭它。

我的问题是:有没有办法强制文件超出内存,所以我不会受到任何类型的操作系统缓存的影响?我正在处理很多文件(> 4000),所以我唯一能想到的就是用一种方法处理所有文件,然后从头开始,然后用另一种方法再做一次。这给了我最大的机会在我回到那个时候让第一个文件超出内存。

或者有没有更好的方法来处理这个问题?

这可能不是特定于 C# 的问题,但无论如何我都会将其标记为 C#,因为这就是我用来完成所有这些工作的内容。 C# 的答案将是最直接的帮助,但由于这个问题是半概念性的,任何事情都可以,真的。

【问题讨论】:

    标签: c# file operating-system performance-testing


    【解决方案1】:

    我相信如果您使用的是 Windows,您可以使用 FILE_FLAG_NO_BUFFERING 标志打开文件。关于标志的更多信息可以在here找到,还有一个相关的堆栈溢出问题here可能会提供一些更有用的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 2019-01-27
      • 2013-12-04
      • 2020-02-17
      相关资源
      最近更新 更多