做压力测试的时候,为了分析log日志文件的信息,做了个统计小工具,功能很简单,就是统计指定文件中指定字串出现的个数。基于log文件的格式,要查找的关键字在一行内出现,不会跨行查找的。
这个功能很简单,很快的写出了代码:
Using sr As StreamReader = New StreamReader(txtFile.Text)
Str = sr.ReadToEnd
i = (Str.Length - Str.Replace(strkey1, "").Length) / strkey1.Length
sr.Close()
End Using
Str = sr.ReadToEnd
i = (Str.Length - Str.Replace(strkey1, "").Length) / strkey1.Length
sr.Close()
End Using
选择一个1MB的log文件,OK,统计正确,再选择一个100MB的log文件,呜~~机器太破,跑死了。
唉,性能啊!应用程序的性能问题就出来了,也可以说,计算方法正确,但在现有的环境下无法得出正确的结果,好吧,只好牺牲时间换空间了,改为逐行处理,代码如下:
Using sr As StreamReader = New StreamReader(txtFile.Text)
Do
str = sr.ReadLine
strtotal = str.Replace(strkey, "")
If strtotal.Length <> str.Length Then
i += (str.Length - strtotal.Length) / strkey.Length
End If
Loop Until str Is Nothing
sr.Close()
End Using
Do
str = sr.ReadLine
strtotal = str.Replace(strkey, "")
If strtotal.Length <> str.Length Then
i += (str.Length - strtotal.Length) / strkey.Length
End If
Loop Until str Is Nothing
sr.Close()
End Using
这样一来,虽然得出统计结果的时间长了点,但不管多大的文件,都能统计出结果了,一个好的算法,虽然能以最快的速度得出答案,但却不能保证在任何情况下都能得出答案,这就是为什么要做性能测试的问题。对于应用程序性能的改进,其实还是有必要好好研究研究的。关键是,要先找出瓶颈在哪里。比如上面的例子,瓶颈就在于一次全部加载100MB的文件,是个很消耗内存的操作,改为逐行加载,就解决了这个问题。