我正在使用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()
));
}
答案 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构造函数而不是所有字符串化的字段值,可以获得(可能很小的)进一步的性能改进,并在该构造函数中处理值检索。
它也更为通用:如果将来的任何时间使用字段发生变化,则无需重新编码。