我如何衡量一个函数对物理内存的使用量?

时间:2019-10-23 11:31:33

标签: c# memory

该功能不在我的控制范围内,因此无法通过查看代码进行计算。它输入一个文件,并且对于不同种类的文件表现不同。而且我正在尝试预测所需的物理内存。我试图找到文件和函数的内存需求之间的关联。稍后,我将使用此信息来确定要创建的线程数,每个线程将调用此函数。

使用Process.GetCurrentProcess()和Process.PrivateMemorySize64,我可以得到调用该函数之前和之后的总内存使用之间的差异。由于没有内存泄漏,因此我将此值设为零,因此这不是我的信息。我真正需要的是学习函数执行期间使用的最大内存。

Process.PeakWorkingSet64给出自应用程序启动以来最大的总物理内存使用量。

是否可以将 PeakWorkingSet64 的值重置为零,以便获得初始值和函数的最大内存使用量之间的差值?还是有其他方法可以衡量我想要的东西?

修改

我想出了这种污垢解决方案,但似乎可行。它从不同的线程每100毫秒测量一次进程内存。任何意见 或更好的解决方案将不胜感激。

        private static int _no;
        private static double getCurrentMemoryInMB(System.Diagnostics.Process proc)
        {
            GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
            proc.Refresh();
            return proc.PrivateMemorySize64 / 1024d / 1024d;
        }
        private static void measureMemoryUse(Action action, string processingFileName)
        {            
            double before = 0d, after;
            bool killTask = false;
            double peak = 0d;
            using (System.Diagnostics.Process proc = System.Diagnostics.Process.GetCurrentProcess())
                try
                {
                    before = getCurrentMemoryInMB(proc);
                    System.Threading.Tasks.Task.Factory.StartNew(() =>
                    {
                        while (!killTask)
                        {
                            peak = Math.Max(peak, getCurrentMemoryInMB(proc));
                            System.Threading.Thread.Sleep(100);
                        }
                    });
                    action();
                }
                finally
                {
                    killTask = true;
                    after = getCurrentMemoryInMB(proc);

                    double diff = peak - before;

                    var fi = new System.IO.FileInfo(processingFileName);
                    double fileSize = fi.Length / 1024d / 1024d;
                    string fileName = fi.Name;

                    string fnReport = @"C:\....\report.csv";
                    if (!File.Exists(fnReport))
                    {
                        _no = 0;
                        File.AppendAllLines(fnReport, new string[] { "#;before (mb);peakMem (mb);after (mb);diff (mb);fileSize (mb);diff/fileSize;fileName" });
                    }

                    File.AppendAllLines(fnReport, new string[] { string.Format("{0};{1};{2};{3};{4};{5};{6};{7}", ++_no, before, peak, after, diff, fileSize, diff / fileSize, fileName) });
                }
        }

0 个答案:

没有答案