使用了 socket 的 dns 缓存,为什么速度还变慢了呢

2017-10-07 11:52:21 +08:00
 noobpythoner

查了一下网上关于socket关于dns缓存的代码,希望提高网络请求的速度,
自己在代码中使用了以后,发现速度反倒慢了,为什么呢 下面的 100 个请求中,使用了缓存之后时间增加了 4 秒多, 10 个请求的时候,时间增加了 0.2 秒左右

# coding=utf-8
import requests
import time
import socket
_dnscache = {}

def _setDNSCache():
    """ DNS 缓存 """
    def _getaddrinfo(*args, **kwargs):
        if args in _dnscache:
            # print (str(args) + " in cache")
            return _dnscache[args]
        else:
            # print (str(args) + " not in cache")
            _dnscache[args] = temp_getaddrinfo(*args, **kwargs)
            return _dnscache[args]

    if not hasattr(socket, '_getaddrinfo'):
        temp_getaddrinfo = socket.getaddrinfo
        socket.getaddrinfo = _getaddrinfo

class TiebaSpider:
    def __init__(self,tieba_name):
        self.tieba_name = tieba_name
        self.headers = {
                "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
            }
    def get_url_list(self):
        url_temp = "https://tieba.baidu.com/f?kw=" + self.tieba_name + "&ie=utf-8&pn={}"
        url_list = [url_temp.format(i*50) for i in range(100)]
        return url_list

    def parse_url(self,url):
        print("now parsing url",url)
        response = requests.get(url,headers=self.headers)
        return response.content.decode()

    def run(self):
        url_list = self.get_url_list()
        for url in url_list:
            html_str = self.parse_url(url)

if __name__ == '__main__':
    t1 = time.time()
    _setDNSCache()
    tieba_spider = TiebaSpider("李毅")
    tieba_spider.run()
    print(time.time()-t1)
3202 次点击
所在节点    Python
3 条回复
wwqgtxx
2017-10-07 12:27:25 +08:00
你是不是应该先测试一下缓存命中率
shn7798
2017-10-07 13:41:06 +08:00
除了第一个请求,后续的请求应该的都是命中缓存的。
不过百度服务器毕竟不是放在你旁边,同样的 URL 每次的网络耗时都是不同的,所以这样用来对比是没啥意义的。

我的感觉瓶颈不在 DNS,建议使用 https://github.com/rkern/line_profiler 这个工具来分析一下每行代码的耗时,这样就能找出瓶颈了。
mengskysama
2017-10-08 10:49:02 +08:00
这个 dns 缓存意义不大,系统本来就有一层 dns 缓存。我猜换成 session 会快很多,时间都花在 ssl 隧道和 tcp 握手

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/395753

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX