.net部分运行非常慢

本文关键字:非常 运行 net | 更新日期: 2023-09-27 17:58:18

更新:Andrew和Conrad的回答同样有帮助。时间问题的简单修复解决了这个问题,缓存更大的对象引用而不是每次重新构建它们消除了问题的根源。谢谢你们的投入,伙计们

我使用的是一个c#.NETneneneba API,由于某些原因,下面的代码执行的速度非常慢。

这是System.Timers.Timer的处理程序,该处理程序每5秒触发其运行事件。

private static void TimerGo(object source, System.Timers.ElapsedEventArgs e)
    {
        tagList = reader.GetData(); // This is a collection of 10 objects.
        storeData(tagList); // This calls the 'storeData' method below
    }

和storeData方法:

private static void storeData(List<obj> tagList)
    {
        TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1));
        long timestamp = (long)t.TotalSeconds;
        foreach (type object in tagList)
        {
            string file = @"path'to'file" + object.name + ".rrd";
            RRD dbase = RRD.load(file);
            // Update rrd with current time timestamp and data.
            dbase.update(timestamp, new object[1] { tag.data });
        }
    }

我是不是错过了一些引人注目的资源库?您看到的RRD内容来自rrdtool的NHawk C#包装器;在这种情况下,我用它更新了10个不同的文件,但我看不出为什么要花这么长时间。

当我说"这么长"时,我的意思是计时器在第一次更新完成之前触发了第二次,所以最终"更新2"会在"更新1"之前发生,这会打破局面,因为"更新1"的时间戳早于"更新2"。

我把计时器的长度增加到了10秒,它运行的时间更长,但最终还是超过了自己,并试图用更早的时间戳更新文件。我能做些什么不同的事情来提高效率,因为很明显我做错了。。。

.net部分运行非常慢

并不能真正回答您的性能问题,但如果您想修复租赁位,请设置计时器。AutoRest为false,然后在方法结束时调用start(),例如

private static void TimerGo(object source, System.Timers.ElapsedEventArgs e)
{
    tagList = reader.GetData(); // This is a collection of 10 objects.
    storeData(tagList); // This calls the 'storeData' method below
    timer.Start();
} 

标签列表中的每个标签是否有不同的RRD文件?在您的伪代码中,您可以打开每个文件N次。(你说列表中只有10个对象。)然后你执行更新。我只能假设你在更新RRD文件后处理它。如果你不这样做,你就是在保留对一个打开文件的引用。

如果RRD是相同的,但您只是将不同类型的绘图数据放入一个文件中,那么您只需要将其打开,直到您想要对其进行独占写入访问为止。

在不分析代码的情况下,你有几个选项(我建议分析btw)

保持RRD文件打开

缓存打开的文件以防止您不得不打开,每个文件每5秒写一次关闭。只需缓存10个打开的文件引用,并每5秒写入一次。

将数据采集与数据写入分离

看起来你每5秒就要从某个物体上采集一次公制样本。如果您的文件中没有"尾随"内容,请将收集内容与写作内容分开。获取数据样本并将其放入队列中进行处理。处理器将使每个tagList出列,并以最快的速度写入,从队列中返回更多列表。

这样,即使写入机制变慢,您也可以始终确保获得约5秒的样本。

使用探查器。JetBrains是我个人的推荐。使用程序运行探查器,并查找运行时间最长的线程/方法。这听起来很像IO或数据问题,但从您的示例代码中并不能立即看出这一点。