1

我正在使用 C# 对日志进行处理,这部分代码的性能开销非常糟糕。我该怎么办?

虽然我什至过滤了日志。仍然需要2~3分钟来处理。我的操作系统日志设置为 16 MB 大小。但也许在一台服务器上它或多或少。

List<LogParserDataEntity> dataEntities = new List<LogParserDataEntity>();
.
.
.
for (; !rs.atEnd(); rs.moveNext())
{
    dataEntities.Add(new LogParserDataEntity(
        rs.getRecord().getValue("eventlog").ToString(),
        rs.getRecord().getValue("recordnumber").ToString(),
        rs.getRecord().getValue("timegenerated").ToString(),
        rs.getRecord().getValue("timewritten").ToString(),
        rs.getRecord().getValue("eventid").ToString(),
        rs.getRecord().getValue("eventtype").ToString(),
        rs.getRecord().getValue("eventtypename").ToString(),
        rs.getRecord().getValue("eventcategory").ToString(),
        rs.getRecord().getValue("eventcategoryname").ToString(),
        rs.getRecord().getValue("sourcename").ToString(),
        rs.getRecord().getValue("strings").ToString(),
        rs.getRecord().getValue("computername").ToString(),
        rs.getRecord().getValue("sid").ToString(),
        rs.getRecord().getValue("message").ToString(),
        rs.getRecord().getValue("data").ToString()
    ));
}
4

5 回答 5

3

首先,什么表明这部分代码存在性能问题?你用过分析器吗?如果没有,请尝试一个(dotTrace 可以免费使用 30 天,这应该足够了),看看问题出在哪里。

在我的脑海中,我建议缓存rs.getRecord()和替换dataEntities,它看起来像 aList<T>和类似 a 的东西LinkedList<T>

于 2012-08-21T07:54:54.000 回答
3

大部分时间将在检索记录本身,但有一个小的改进:getRecord 只需要调用一次,

var record = rs.getRecord();
dataEntities.add(New LogParserDataEntry(
              record.getValue("eventlog").ToString,
              record.getValue(......
于 2012-08-21T09:07:46.370 回答
1

缓存 rs.getRecord() 的结果:

for (; !rs.atEnd(); rs.moveNext())
            {
                var record = rs.getRecord();

                dataEntities.Add(new LogParserDataEntity(
                                     record.getValue("eventlog").ToString(),
                                     record.getValue("recordnumber").ToString(),
                                     ...
于 2012-08-21T07:54:00.180 回答
0

我同意其他人的观点,即缓存getRecord()可能会有所帮助,但是如果您发现该过程仍然太慢,您可能需要考虑使用免费的Microsoft Log Parser之类的工具- 我有一段时间没有使用它了,但请记住它非常快速地。

于 2012-08-21T08:10:36.110 回答
0

通过编写/使用接收记录而不是所有字符串化字段值的 dataEntities 构造函数,并在该构造函数中处理值检索,可以获得(可能很小)进一步的性能改进。

它也更通用:如果将来使用的字段发生变化,您不需要重新编码。

于 2012-09-07T16:23:34.653 回答