【发布时间】:2011-01-29 17:50:09
【问题描述】:
情况如下:
我正在制作一个小程序来解析服务器日志文件。
我用一个包含数千个请求的日志文件对其进行了测试(10000 - 20000 之间不知道确切)
我要做的就是将日志文本文件加载到内存中,以便我可以查询它们。
这占用了最多的资源。
占用cpu时间最多的方法是那些(最坏的罪魁祸首):
string.split - 将行值拆分为值数组
string.contains - 检查用户代理是否包含特定的代理字符串。 (确定浏览器 ID)
string.tolower - 各种用途
streamreader.readline - 逐行读取日志文件。
string.startswith - 判断 line 是列定义行还是带值的行
还有一些我可以替换的。例如字典吸气剂是 也占用了很多资源。这是我没想到的,因为它是一本字典,应该索引它的键。我将其替换为多维数组并节省了一些 cpu 时间。
现在我在快速双核上运行,加载我提到的文件所需的总时间约为 1 秒。
现在这真的很糟糕。
想象一个每天有数万人访问的网站。加载日志文件需要几分钟时间。
那么我的替代方案是什么?如果有的话,因为我认为这只是一个 .net 限制,我对此无能为力。
编辑:
如果你们中的一些大师想查看代码并发现问题,这里是我的代码文件:
- http://freehosting1.net/temp/data.txt
- http://freehosting1.net/temp/logentry.txt
- http://freehosting1.net/temp/lists.txt
到目前为止,占用资源最多的函数是 LogEntry.New 加载所有数据的函数称为Data.Load
创建的 LogEntry 对象总数:50 000。所用时间:0.9 - 1.0 秒。
CPU:AMD 飞鸿 II x2 545 3ghz。
不是多线程的
【问题讨论】:
标签: .net performance optimization string