解析日志文件时性能下降

时间:2012-08-21 07:50:31

标签: c# .net performance

我正在使用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()
    ));
}

5 个答案:

答案 0 :(得分:3)

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

在我的脑海中,我建议缓存rs.getRecord()并将dataEntities替换为List<T>,其类似于LinkedList<T>

答案 1 :(得分:3)

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

var record = rs.getRecord();
dataEntities.add(New LogParserDataEntry(
              record.getValue("eventlog").ToString,
              record.getValue(......

答案 2 :(得分:1)

缓存rs.getRecord()的结果:

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

                dataEntities.Add(new LogParserDataEntity(
                                     record.getValue("eventlog").ToString(),
                                     record.getValue("recordnumber").ToString(),
                                     ...

答案 3 :(得分:0)

我同意其他人认为缓存getRecord()可以提供帮助, 但是如果你发现这个过程仍然太慢,你可能会考虑使用像免费Microsoft Log Parser这样的工具 - 我暂时没有使用过它,但记得很快。

答案 4 :(得分:0)

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

它也更为通用:如果将来的任何时间使用字段发生变化,则无需重新编码。