周五整理语音服务端的程序,发现原来在程序启动的时候导入黑名单到内存(CMap)的那行代码被注释掉了,一看类实现发现查找黑名单也改成了实时查数据库的方式,于是试着去掉注释执行了一下,结果导入黑名单整整花了1000秒,怪不得要去掉呢;可是一看数据库里面也就是29万条记录,这个也不应该这么慢啊
首先想到的会不会是CMap在频繁的reallocate以至于耗费太多时间,一看这个类里头还真有个函数叫InitHashTable,果然MSDN里面写到:
For best performance, the hash table size should be a prime number. To minimize collisions, the size should be roughly 20 percent larger than the largest anticipated data set.
调用之后发现时间提高到了70秒,感觉还是不够快,应该也就是几秒的事儿,于是继续看代码。
果然看到原来的代码再用ADO读取SQL Server数据的时候为了简单起见,所有的代码打开数据库的时候用的都是一样的参数,而这里显然是只读的,所有游标打开的时候不需要是adOpenDynamic,用adOpenForwardOnly就足够了,再执行一看时间提高到了4秒,这些算是靠谱了。