我构建了一个ASP.NET Web应用程序,使用数据绑定控件查看Windows事件日志中的数据。通过连接到访问ObjectDataSource
的中介类的EventLog
检索数据。当我将GridView
连接到ObjectDataSource
时,它想要计算EventLog
中的行数。我可以简单快速地完成这项工作:
var log = new EventLog {Log = logName};
return log.Entries.Count;
从我不科学的角度来看,它似乎是在O(1)中回归。但是,如果我想计算在特定日期之前或通过某个事件源发生的条目,我找不到一种方法来计算它们的效率。我尝试过WMI查询,例如:
var query = new ObjectQuery("Select * from Win32_NTLogEvent
where LogFile='Application'");
var searcher = new ManagementObjectSearcher(query);
var result = searcher.Get();
var foo = result.Count;
对于具有70k条目的事件日志,这在我合理供电的工作站上大约需要一分钟。它看起来像O(n)。我也尝试使用Linq过滤log.Entries
并得到类似的结果。
还有更高效的方法吗?对于网格中的实际数据,我发现在log.Entries
上循环并通过索引访问一种非常高效的方式来获取条目集合。