2023-08
13

VBA跨表查询优化

By xrspook @ 10:27:49 归类于: 烂日记

第一次加VBA+ADO+SQL里跨表查询到一个表之后,发现运行时间只需要0.12秒。那个时候我就觉得如果我要完成之前已经在PQ、PP和python的那个方案,在VBA里估计只需要很短的时间,有可能是一秒以内实现,但最长时间我感觉不会超过三秒。之所以有这种感觉是因为之前我用VBA的时候,如果我使用的是数组,使用的是数据最后一次性的打印出来,中间不显示,通常运行时间不会超过一秒。如果我不是用数组操作,而是在折腾单元格,比如做一些打印格式的转换,时间可能会长一点。那个时间的长短跟我电脑正在处理的任务多少有关,如果电脑比较空闲,时间会很短,但如果电脑正在运行其他的东西,比如FireFox里打开了N个网页,那么这个运行时间可能会长一点,甚至会超出我的想象。最终,当我把整个之前的那跨表查询方案在VBA里实现的时候,我办公室的那台电脑大概需要1.3秒。这个1.3秒是不确定的,有时可能需要1.4甚至1.5秒,但是也有可能1.2秒就可以。

当我在进行了一些数据的优化,比如当那个字典完全赋值给数组以后,就把字典关掉,又或者是减少一些变量,比如在我用SQL进行查询的时候,因为有些步骤太长,我的脑子又转不过来,所以我一个步骤跨了好多段。多段实际上是一路到底,后面不需要引用步骤中的数据,在写下一段的时候,我就不再定义一个新的变量,而直接沿用上一个变量名。连续三段,都是为了得出最后一个答案,在我优化之前,每一段我都会用一个新的变量名。仅仅是在使用完字典以后就把它关闭掉这个操作就让我的运行时间马上提升了0.2秒。我不知道为什么,效果居然如此明显,字典是个非常高效的东西,但原来之所以这么高效,非常有可能是因为它占用了资源。虽然释放字典这个操作基本上是在整个程序的最后部分,但依然能明显提速。当我慢慢地研究一行又一行的合并变量名以后。整个程序的运行时间有可能在一秒之内。通常是1.1秒,如果我同一个时间刷新多次的话,非常有可能会出现0.9秒。但就使用而言,你怎么可能就为了那个0.9秒,把它刷多次呢。因为刷新多次,实际上也花了好几秒,这是完全没有意义的。写这个VBA就是为了让你打开文件,输入相关参数以后进行查询,一次能查到的那个时间才是意义所在。PQ输入参数,点击刷新,第1次的刷新时间肯定是最长的,在成功的刷了第1次以后,继续刷,时间你会觉得明显缩短。所以的确最后这个VBA文件有可能在我的同一台电脑上刷出0.9秒,但在我的能力范围之内,我顶多能改到在那台电脑上首次刷新小于1.1秒。

运行效率这个东西在不同的电脑上效果是不一样的,在我做python方案的时候,我就已经明显感觉到了。python方案的运行时间大概6秒。在我家的电脑上大概需要7-8秒,在我那个不插电源的笔记本电脑上需要10秒。这个让我挺惊讶,因为笔记本电脑购买的时间比我家台式机组装的时间晚起码5年以上。之前我就试过,在笔记本电脑上插电和不插电压片,结果发现插电的时候性能会明显飙上去,CPU的使用率会飙起来。据我观察,在python方案的时候,CPU的使用程度要比内存大,运行PQ的时候刚好反过来。所以电脑的CPU越好,python方案的运行时间会越短。宿舍那台神舟miniPC5的运行时间大概跟我家里的电脑差不多。VBA的方案我没有在宿舍的电脑测试过,也没在笔记本电脑上测试过,但家里的那台电脑,我感觉运行时间有点不稳定,有可能会超过两秒,但有可能会是1.3秒。为什么会这么不稳定呢?VBA的那个脚本,我同事的运行时间通常能在一秒以内,曾经试过0.8秒,她办公室的电脑购买时间大概比我的晚两年。就我俩办公室的电脑来说,差距大概是0.1秒。对运行时间得大概6秒左右的python来说,她只需要5秒多一点。

运行一个跨表查询,VBA+ADO+SQL这套方案就只需要一秒,其实已经很快了。如果我把那个VBA根据输出表格的类型拆分为两个,我觉得运行时间能进一步的提升。毕竟其实输出的4个表格通常不会一起用到,但是如果现在需要一秒,单独一个也需要0.6秒,我为什么要做这个拆分呢?

接下来我会继续研究一下还能怎么改进,研究完以后再把这个发给专业同事,询问一下改进意见。

2020-03
5

电动牙刷耗电测试

By xrspook @ 10:47:11 归类于: 烂日记

昨天我花了一整个下午的时间(间歇时间)去研贝医生的电动牙刷。一开始的时候我觉得一个小时之内可以结束战斗,结果这场战斗居然持续了两个多小时。这样的结果让我很震惊,因为对上一次在家里做试验的时候,只花了不到一个小时。一样的试验条件,理论上出来的结果应该是相似的。某个周六我在家里,让贝医生连续不断地进入刷牙模式,22次之后,从充满电的绿灯长亮变成了黄灯。昨天从绿灯到黄灯,我足足反复了48次。上一次当牙刷进入黄灯后我就不再继续下去,而是拿去充电了,而这一次,我继续刷下去,从黄灯到红灯我又刷了13次。如果这根牙刷待机的时候是完全不耗电的话,这样的测试结果简直是神一般的存在。可以连续使用63次,每天两次的使用频率,等于一个月不用充电了。22次和48次差别非常明显。之所以有这样的差别,一定程度上我觉得跟刷头有没有阻力有关系。上一次我把牙刷头套进去了,牙刷头一直作用在我的手上施压,而这一次我没有装上刷头,只是把牙刷拿在手上或者放在桌面上。之所以没有一直都放在桌面上,是因为上班时间虽然牙刷震动声响不大,但是还是会有一定分贝,在安静的环境下,那个声音很明显。有段时间,我是把牙刷拿在手上。长时间拿着那个牙刷,我觉得自己都变成神经病了,放下牙刷以后,我仍觉得手依然在那里震动。

上一次在家里试验出牙刷可以连续运行22次,已经让人很惊叹,而这一次更加是不知道如何形容。根据我妈的描述,这个牙刷使用两天就会没电,第3天早上开机的时候是黄灯,但牙没刷完就会变成红灯,自动关机,然后再也无法开启。我妈用电动牙刷刷牙的频率是每天早上一次,晚上那一次她用的是普通牙刷,因为她一直觉得电动牙刷无法把牙齿刷干净。所以昨天下午我把牙刷的电量耗尽后重新充满,接着我进行了间隔的试验。每天早晚各启动一次,看看能坚持多少天。我的第1次间隔试验没有加上刷头,也没有给施加阻力。在空载的条件下,理论上应该能坚持两天以上。我把我妈的牙刷拿到手亲自测试之前,我妈已经在家里进行过两轮试验,两次都是用不到三天时间。我妈跟我说,不要在这根牙刷上继续较劲了,反正她不喜欢用,但是对我来说,研究这个牙刷是一个工科生的探寻故障原因的喜好,所以我会设定试验方案,然后执行,必要时候还得多次重复。目的是得到类似的结果,最终得出故障原因并排除它。估计贝医生的用户里只有极少数会做这种事。的确有人会把牙刷寄回售后,但只会告诉他们,用了几次就没电,但这几次的间隔到底是如何,这种情况重复出现了多少次,估计用户不会去详细记录。所以,有人会觉得牙刷寄过去再发回来,情况还是一样,而有些人则觉得问题解决了。之所以问题会存在,肯定是因为贝医生的电动牙刷在工艺设计上有某些缺陷。如果用户的测试能帮助他们解决这些缺陷,用户不只是帮助了自己,而是帮助到电动牙刷的制造商以及千千万万使用产品的用户。

我不是为了什么而去纠结,只是因为我想纠结,所以纠结。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress