这个题目是论坛第18期的VBA正式竞赛题目,谢谢northwolves版主的好题目!从终稿到终稿5,我共用了5种编程方式,回过头来看,终稿5与终稿相比,运算速度快得连我自已都不可想象,终稿运行14个1的连续数花了近26分钟,而用终稿5只需1秒种,并且在测试23个1的连续数所花的时间由原来终稿2的6分38秒减少到2分02秒。由此可以看出,在算法(主要思路)相同的情况下,运用不同的对象来编写程序,对处理多数据量的情况,程序执行的效果是不同的。我对5种编程方式一一作了测试。由于题目要求的是随机数,故出现包含3个以个1或2的连续数机率很小,即结果个数很少,所以用随机数是测不出结果的。我是用手工输入连续多个1这种数据来测试的,测试具体结果可见下表。另外每一个答案都写有我当时的编程想法,在这里与大家分享一下本次在处理大数据量时我的编程经验,大家如果能从初稿按顺序看下去,就能明白我下面写的几点经验了: 1、尽量用集合处理有排除重复值要求的数据; 2、尽量不要把结果直接赋值给单元格,可先把结果暂存于数组中,最后对单元格批量赋值; 3、尽量减少不必要的数据传输,尽管它是集合或数组中的数据; 4、尽量减少循环次数,对一些已经肯定没有作用的后续循环,可以加一个判断语句来跳出当前循环,不要小看循环中每个数据的每次计算,例如数据中有1万个数据在循环里可省1次循环,若在它之后面有2句必做代码的话,就可以省2万次的计算量。 5、另外在代码里可以把工作表的重新计算方式改为手动重算方式,我进行过少量测试,运行效率可提高千分之一左右。 2006-12-21 再次震惊:写完上面的经验后,当我用以上经验再次查看终稿5的代码,居然发现了一条"时间隧道",测试23个1的连续数只花18秒!乖乖,我作了回终结者!大家不防先不要看终稿6的代码,看你在终稿5中能找到这个时间隧道吗?
TfXYBOPp.rar
(45.76 KB, 下载次数: 86)
|