(1)缘起
bfax@smth.org发了一个字符串转换程序,引起了热烈讨论。原程序如下:
1
2
End Function
2
(2) 分析问题
写测试程序测试在我的1.5M迅驰本本测试,替换效率为30万字/s,该程序采用Replace,这样对每一个字符都要扫描GB_Lib字符串中的几千个字符,性能自然上不去。需要寻找更好的数据结构和算法,降低每一个字符串的操作时间。
.net类库里有一个很好的东西可以拿来直接用:Hashtable。也就是说,把每一个简体字作为key,每一个繁体字作为value。这样处理每个字符的时候只需要看它在不在Hashtable的key里面,在的话就找出对应的value替换,否则就不做任何操作。这样做的代价是Hashtable初始化的耗时,不过初始化顶多也就一次嘛。程序如下:
1
public class ConvertDemo
2
}
2
测试性能,结果为300万字/秒。性能提高了10倍。
(3)用relector看Hashtable源代码,消除无用操作,继续优化
还能不能继续优化呢?ConvertChar (char input)执行次数最多,是对性能最有影响的方法。用reflector反编译Hashtable的get_Item(object key)方法:
1
public virtual object get_Item(object key)
2
}
2
我的天天天天天天天天天天天天天........好长呀,先不管这个。哦,方法并不抛出异常,如果key不存在就直接返回null。这样的话,采用ContainsKey(...)判断key是否存在就是多次一举了。
把ConvertChar (char input)改为:
1
private static char ConvertChar(char input)
2
}
2
这样大概能节省一半的操作。
测试结果验证了我这一想法。性能一下提高了40%,达到了500万字/s
注:上面程序有小bug,后来发现的。