没想到帮一个朋友看了下他们公司的源码,差点把我给整崩溃了!事情的起因是有个项目,软件在笔记本上的运行速度比在工控机上的运行速度要快至少一半的时间,这个事情把这个朋友折腾得够呛。于是,他就找到了我,我在排除了硬件配置问题后,决定帮他看看软件源码,看看是不是源码有问题,谁知道看了几个小时,我差点就崩溃了!
工控机运行效率竟然不及笔记本
详情是这样的,朋友的公司做了一个视觉软件,软件做好之后,放到工控机上去运行,结果发现工控机上运行速度特别慢。
朋友特地在公司用来敲代码的两台笔记本上做了实验,发现软件在两台笔记本速度都比在工控机上快。
再看两台笔记本的配置和工控机的配置,两台笔记本的CPU别是一个11代I5和12代I7,显卡分别是3050和3090。而工控机的CPU则是一枚10代I9,显卡则是4060。
账面上看,工控机的CPU虽然代数略低于那两台笔记本,但是工控机的优势就是CPU是36线程的,标压下3.0GHz,睿频下4.8GHz,显卡不用说了,秒杀那两台笔记本。
所以,大家都觉得,工控机再差,性能也不会比笔记本低才对。但是,就如前面所说,工控机跑出来的数据却比那两台笔记本要差好多。假设跑完一段逻辑,笔记本需要5秒的话,工控机反而需要6秒甚至是更长时间。
我一开始以为是工控机的电压不够,导致其发挥不出极致性能,于是看了下工控机的电源配置,结果发现工控机的电源配置是标准模式。
我拿一套算法脚本在朋友提供的笔记本是跑了一下,发现跑完这套算法需要250毫秒左右,又拿相同的算法在工控机上跑,发现竟然需要500毫秒左右!整整差了两倍性能!
于是,我将工控机的电源设置成性能模式,再次跑了下算法,发现工控机算法执行时间降到了230毫秒左右。
原本以为就是电源的问题,结果朋友又拿他们开发的软件跑了一下,发现耗时跟之前并无差别。
因为他们软件运行时需要用到显卡,于是我便问他,显卡供电有没有问题,结果他说显卡是独立供电的。
在此情况之下,我找朋友要了这个软件项目的源码,想看看是不是代码写得有问题,导致在工控机上性能反而会降低。
项目源码看着太难受!
结果让我万万没想到的是,这代码让我难受得怀疑人生!
这个软件虽然功能挺多,但整体并不复杂,可是,光代码,这个软件的项目就有600多M!一个代码的解决方案里竟然包含了24个项目引用!啥意思呢,您可以理解为24个独立的库!
本身24个库也没啥,一个简单的项目引用更多的库我也见过。但是,这24个库不简单,里面大约有一半代码都是废代码!
有可能只是为了使用一个扩展函数,代码的编写者把整个库都搬来了!注意,是把整个库的源码都搬来了,而不是单独引用一个库!
其实,这也没啥,我还是可以忍的,大不了视而不见就是了!
但是,我折腾了将近一个小时,才将这个项目跑起来,原因是库与库之间存在循环引用的关系!
循环引用库
什么是循环引用?意思就是A项目库调用了B项目库,而B项目库也调用了A项目库!
这种做法看起来简单,但是实际上是不符合项目设计思想的!而且,这会导致一个非常严重的问题,那就是库之间存在依赖关系,导致两个库都无法引用成功,最终IDE无法执行编译过程!
这又怎么解释呢?
很简单!假设A项目依赖B项目,此时B项目出现了问题导致了无法编译,那么A项目自然也就无法编译成功了!但是,如果B项目编译不成功,是因为A项目无法编译呢?
这就会导致出现了一个编译上的“死循环”,为此,我们甚至都可以讨论一下“先有鸡还是先有蛋”的问题!
但是,这个问题在这个项目里有24个!
抛开循环引用问题,这个项目还有一个问题,那就是库与库的引用都是引用自文件夹而非项目。
怎么说呢?
打个比方,假设A项目需要引用B项目,那么需要先将B项目编译到指定目录,然后A引用该目录的B项目库即可。
这种做法在简单的项目结构里面没问题,但是,这个项目可是有24个项目库!如果我不放心的话,我需要编译24次!
有人说了:“你可以直接编译解决方案啊!”
但是,这又回到了上面的那个问题,那就是库与库之间存在依赖关系,直接编译解决方案可能会因为编译顺序的问题编译失败!
于是,我尝试将所有库的引用直接改为项目引用,这种做法可以在编译主程序的时候,顺带编译其他库项目,而且是遵循依赖顺序的编译!
不改还好,改完以后我发现库引用不上了,IDE直接告诉我说库与库之间存在循环引用,不允许我这么干!
废了半天功夫,项目被我搞得乱七八糟,不动他还可以编译,结果彻底无法编译了!最后实在搞不动了,决定放弃!
结语
听说,这个项目是个月薪22K的人写的,而且,这个22K还是在一个三线城市拿到的,我觉得这个人怎么说也是个编程大牛吧!从项目业务逻辑上来看,能把这个项目写出来,也算个牛人,可是代码表现上又不像,这让我陷入了非常难受的怀疑和自我怀疑中!
这就像形容一个人既好看,又难看那么矛盾!
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.