什么更快:预加载文件或按命令加载文件?

时间:2015-06-02 14:37:33

标签: python file websocket

我一直在使用Python创建一个Web服务器,我认为在字典中预加载所有.html文件会更快:

#snippets are the HTML files
snippets = {}
snippetnames = [ f for f in listdir(getcwd() + "/snippets") if isfile(join(getcwd() + "/snippets",f))]
for i in snippetnames:
    snippets[i.replace('.html', '')] = (open('snippets/' + i, 'r').read())

这是在我启动服务器之前运行的,如果我的服务器想要检索数据,那么每个请求只需clientsocket.send(snippets['nameofhtmlfile'])。但是,这比每次请求都要快得多:

file = open('nameofhtmlfile', 'r')
file = file.read()
c.send(file.encode('utf-8'))

我注意到使用Chrome开发者菜单(F12)时第一个选项更快,但我想知道为什么它实际上更快。

2 个答案:

答案 0 :(得分:1)

您可能需要查看负载测试(例如使用http_load)来回答您的效果问题。

此外,如果你真的关心性能,你可能不应该在python中编写你的web服务器,而是重用一个用较低级语言编写的现有服务器,例如h2onxweb

答案 1 :(得分:1)

内存选项应该更快,因为从文件加载内容所需的光盘访问操作数比从内存中读取数据更昂贵。

...但是...

我坚信这些场景的延迟加载选项。

如果您的服务器处于“休眠状态” - 让我们假设您部署在Heroku上 - 加载时间对于第一个请求的响应能力非常重要。

如果您在第一个加载时间内将所有服务器加载到缓存中,那么速度会明显变慢......

...但是,延迟加载 - 我的意思是说在第一次实际请求时将文件存储到缓存中 - 允许您在加载时间,响应时间和其他注意事项之间取得平衡。

通过动态缓存管理,您还可以在首次加载时存储模板信息(例如模板对象),也可以存储非文件但经常使用的其他信息。

例如,我在Ruby中有一个项目,我在缓存中存储了Haml,Slim,SASS和CoffeeScript模板渲染引擎,这样就可以为每个请求重新运行引擎而无需重新创建引擎对象(显然无需重新访问模板文件。)

此外,缓存API对于框架用户是开放的,这肯定会增加它的可用性。

我知道它是Ruby代码,但是如果你想查看缓存系统,你可以找到the code here

祝你好运。