1

私はC#を使用してログを処理していますが、コードのこの部分でパフォーマンスのオーバーヘッドが非常に悪くなっています。私は何をすべきか?

私もログをフィルタリングしますが。それでも処理には2〜3分以上かかります。私のOSログは16MBのサイズに設定されています。しかし、たぶん1台のサーバーでは多かれ少なかれそうです。

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

ほとんどの時間はレコード自体を取得することに費やされますが、小さな改善点があります。getRecord を呼び出す必要があるのは 1 回だけです。

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

まず第一に、コードのこの特定の部分にパフォーマンスの問題があることを示唆するものは何ですか? プロファイラーを使用しましたか?そうでない場合は、1 つ試して (dotTrace は 30 日間無料です。これで十分です)、どこに問題があるかを確認してください。

頭のてっぺんから、のように見える をキャッシュして、 のようなものrs.getRecord()に置き換えることをお勧めします。dataEntitiesList<T>LinkedList<T>

于 2012-08-21T07:54:54.000 に答える
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

すべての文字列化されたフィールド値ではなく、レコードを受け取り、そのコンストラクターで値の取得を処理する dataEntities コンストラクターを作成/使用することにより、(おそらくわずかな) さらなるパフォーマンスの向上が得られる場合があります。

また、より一般的です。使用するフィールドが将来いつでも変更された場合でも、あまりコーディングする必要はありません。

于 2012-09-07T16:23:34.653 に答える