最近在写一套关于blog迁移的程序,由于涉及到页面分析就写了一个笨笨的循环检测程序
有段代码大致如下
public string t1(string str)
...{
for(int i=0;i<str.length;i++)
...{
if(str[i]=='<'&&(CountLength(str.Substring(1, i),"xxx")%2==0))
...{
... ....
}
}
}
...{
for(int i=0;i<str.length;i++)
...{
if(str[i]=='<'&&(CountLength(str.Substring(1, i),"xxx")%2==0))
...{
... ....
}
}
}
其中CountLength是个计算方法,计算str中xxx出现次数;
这样的一段代码你认为会有问题吗?
至少我最初是这么写的也没有发现有什么问题。
但是,后来发觉整个系统的代码处理完所有数据居然需要花费15分钟,太慢了,受不了。
开了性能检测工具,得出的结果是程序在迁移blogcn的站点时,blogcn的服务器太慢,socket的connect和recieve方法耗用的时间太多,基于socket的东西动不了,就只能想其他办法
追查代码访问计数,居然发觉countlength居然被调用了5w多次,占用了大概20秒左右。
于是对程序做了调整,修改为了:
if(str[i]=='<')
...{
if(CountLength(xxxxx))
...{
}
}
...{
if(CountLength(xxxxx))
...{
}
}
对比起来我后面的代码风格很不紧凑,而且大家大概一般都喜欢原来的模式。
但是这一改CountLength只被调用了3w多次,时间缩短为13秒左右。成果可喜
看似不清晰和简约的编码风格却提高了性能,是之前没有预料到的。
也提醒了俺以后要更注意编码习惯。
另外这段时间对于http协议,session,cookies重新有了进一步的认识。