PauperZ/SSRSpeedN

关于ssrspeed/utils/geo_ip.py 文件中 checkIPv4() 函数时间开销的探讨

AirportR opened this issue · 3 comments

,本人在浏览该部分代码时发现, 该函数是为域名转成ip做准备,也就是在domain2ip()中有调用。逻辑是如果检查为合法ip,则直接返回其本身。但令我迷惑的地方是,不论是否是ip或者域名,最终都要经过如下函数:
if (checkIPv4(domain)):
return domain
ip = "N/A"
try:
ip = socket.gethostbyname(domain)
return ip
except:
logger.exception("Translate {} to ipv4 failed.".format(domain))
return "N/A"
这就有点多此一举了,在这里我不知道判断合法v4地址的意义何在?况且经过测试发现:checkIPv4()函数本身使用正则匹配v4地址,极其占用时间开销,一个可能不明显,但是在日常生产环境中,测的机场少说也有二三十个节点吧,整个测试流程下来同步操作,时间开销就上来了。以下是时间开销测试截图:

测试截图

我不知道整个项目,还有多少这样做无用功的代码,也可能是我没看到其他弥补方案,故发布此issue与诸君交流。

@AirportR 我觉得用Python实现这个就不太好,效率极其低下,用Go实现并发测试更加好,这个任务就交给你了

@AirportR 我觉得用Python实现这个就不太好,效率极其低下,用Go实现并发测试更加好,这个任务就交给你了

我要是用Golang,我就不会在这里提issue了,本身issue中提到的只是一个小问题,只是细节方面的。只是当我在运行整个项目的时候,每次看到测试耗费时间我就直摇头,于是我在思考着,究竟是什么制约了它的运行速度?除了本身项目的整个架构所带来的瓶颈外,还有以上issue提到的这些令人迷惑的无用代码,它们的存在积土成山,成为了拖慢测试时间的不可忽视的因素。事实上,优化问题在每个项目都存在,所以我才拉出来讨论。对于前面这位朋友所说的重构,是有这方面的想法,但是开发成本巨大呀,有轮子了为啥要重复造轮子,除非这个轮子烂到家了。

首先谢谢你的建议,其实这个项目算是SSRSpeed的一个fork版本,只不过原项目删库了。有问题可以请教一下原作者: NyanChanMeow,毕竟这部分代码也不是我写的。对于你的问题,我个人的看法如下:
1、你测试的数据量太小,可以试试加大一下数据量到1k以上,差别其实没这么明显。
2、时间开销其实主要是流媒体解锁和测速时占用较大,毕竟一个需要多次访问多个流媒体网站,一个需要长时间占用带宽下载,优化思路其实和 youshandefeiyang 想法一致,主要得先实现并发测试,你说的这些问题即使有100个也提高不了几s的速度。如果你想加快测试速度,那估计是搞错方向了。
3、建议你下次提此类建议的时候语气缓和一点,所谓“无用代码积土成山”,代码未必无用,即使无用,找到一例就说积土成山也太过牵强,这种说辞不光是寒了维护本项目的几位作者的心,对原作者也不太尊重。毕竟我们搞这个也没啥收益,维护项目处理issue的时候再有人骂上两句估计心情也不太好。
4、关于代码优化、增加Trojan支持这些要求可能得9.28之后了,我现在可能没什么时间,再不准备准备预推免就没学上了,有想法可以先自己试试,再提交pr,比在这打字交流高效。