LOOKUP速度测试(之一,数值) 测试方法 数据区域:A列65536个单元格;公式:LOOKUP(5,A:A)共2000个公式 测试过程 1,A列全部设为1,运行时间:0.006s A列全部设为9,运行时间:0.006s 2,A列全部设为1,A1和AA65536两个单元格改为以下三个数字的各种组合:{1,5,9} 运行时间:0.006s 3,A列全部设为RAND()*100【选择性粘贴为数值,且其中没有=5的】,运行时间:0.006s 4,A1:A32767为上半区,A32768:A65536为下半区 上半区全部=5,下半区两次测试分别=1和RAND()*100,运行时间都是0.006s 5,三次测试—— A列全部=5, 下半区=5,上半区=1 下半区=5,上半区=RAND()*100 三次测试的结果都是:运行时间 11.609s 结果分析 1,第5个测试时间为什么这么长?看看流程图的中间部分。当X=A(posi)时,LOOKUP要逐个比较。由于下半区全部=5,所以它要比较(65536-32768)次。当下半区不是全部=5,就基本上使用二分法,比如上面说的测试3。 2,onkey流程图在二分法为主导的情况下,能找出另外一个逐个比较法的分支来,确属不易!这个精华是不是应该Double?! 3,两个时间之比=11.609/0.006=1934 这和查找次数之比基本吻合: 当采用逐个查找时(测试5),查找次数是:(65536-32768) 而采用二分法查找同样的区域(如测试1中的A列=1的情况),查找次数是LOG((65536-32768),2)=15 (65536-32768)/LOG((65536-32768),2)=2184。 2184与1934非常接近。这是不是也能从另一个侧面佐证:LOOKUP确实是采用的二分法? .
[此贴子已经被作者于2007-5-17 20:00:24编辑过] |