一个列表,加入有 20 行,每行都是用 partial 去渲染,需要用 900 毫秒,但是如果不用 partial,只要 300 毫秒。
还让不让人用了啊。
老实说我觉得在实际页面如果加上和去掉自己平心的感受一次,要是觉得差不多的话,我觉得用也没关系的,不用太纠结了。等到真的感觉到慢的时候再去做优化吧。
我记得 @xdite 似乎有写过一篇 blog 说过 partial 这些,有兴趣可以娶她 blog 看看。
你可以试试这个:https://github.com/n8/multi_fetch_fragments?source=cc
I just implemented this on the staging environment of https://www.biglittlepond.com. The one-line render call for the most recently collected items dropped from ~700 ms to ~50 ms. 25 items per page. This will be going into the production release later this week.
Nathaniel Jones
加 collection 选项也可以快一点:http://ruby-china.org/topics/1040#reply11
http://ruby-china.org/topics/12008?page=1
没贴代码之前我认为代码没写好的可能性更大,partial 我一向正常用,该用就用。
掌握模板引擎核心技术,整个 erubis 的小补丁,编译时就把 render :partial =>
内联进来,就一样快了
至于在 partial 中访问数据库,是往往比在 helper 慢一点的,看访问和拼接的顺序了。
helper 往往可以先取数据库内容,然后再开始拼接,partial 往往是先拼接一段,再访问数据库,再拼接 (其实 partial 也可以先取再拼接的,效果就差不多了)
拼接 -> 数据库 -> 拼接 更容易产生 page-fault 也就是 CPU 的 L2 cache 失效 (呃,这里讲的是 CPU cache 而不是页面 cache...) 数据库 -> 拼接 的方式 CPU cache miss 就少一点
另外 rails 在每个 partial 里都会调用一次 eval
以注入局部变量,而 eval
是比较重量级的方法,需要解析 -> 生成 bytecode -> 执行
三步走。其实注入局部变量在 ruby 2.0+ 可以用不带 eval
的方式实现的... 所以 nyara 才需要 2.0+
Rails 在 production 环境和 development 环境中对 partial 的处理不同,看 development 日志得出的结论不一定可靠。参考这篇文章:http://bindle.me/blog/index.php/26/helpers-vs-partials-from-a-performance-perspective
how cells improve your architecture, cell 可以很好的解决 render 过程中出现的某些性能问题,比如去除 view 中的逻辑判断以及 view 中出现的查询