Flexbox 布局不慢

Paul Irish

不久之前,Wilson Page 为 Smashing Magazine 写了一篇精彩文章,深入探讨了他们如何让《金融时报》这个 Web 应用变得生动有趣。在本文中,Wilson 指出:

随着应用规模的扩大,我们发现应用的表现越来越差。

我们花了好几个小时查看 Chrome 开发者工具的时间轴,并找出了问题所在:惊悚、可怕!它是我们的新好友:Flexbox。时间轴显示,某些布局耗时将近 100 毫秒;在不使用 Flexbox 的情况下重新处理布局时,这一时间缩短至 10 毫秒!

Wilson 的评论是关于使用 display: box; 的原始(旧版)Flexbox。遗憾的是,他们从来没有机会回答较新的 Flexbox (display: flex;) 是否更快,但在 CSS Tricks 中,Chris Coyier 提出了这个问题

我们请 Ojan Vafai 向我们介绍了较新的 Flexbox 模型和实现,他在 WebKit 和 Blink 中编写了很多实现方法。

新的 Flexbox 代码的多遍布局代码路径减少了很多。不过,您仍然可以非常轻松地遇到多遍代码路径(例如,flex-align: stretch 通常是 2 次代码路径)。一般来说,在常见情况下,运行速度应该快得多,但您也可以构建一个同样慢的用例。

即便如此,只要能使用常规块布局(非浮点数),它通常就会比新的 Flexbox 快或快,因为它总是单遍。但是,与使用表格或编写自定义 JS 基本布局代码相比,新的 Flexbox 应该更快。

为了了解数据差异,我对新旧语法进行了对比。

旧版与新版 Flexbox 基准

  • 旧的 Flexbox新 Flexbox(具有回退)
  • 每页 500 个元素
  • 评估网页加载费用
  • 每次运行 3 次计算得到的平均值
  • 衡量指标(移动速度会慢约 10 倍)

旧版 Flexbox:布局开销为大约 43.5 毫秒


旧的 Flexbox 布局示例

新的 Flexbox:布局开销为约 18.2 毫秒


新的 Flexbox 布局示例

摘要:旧版应用的速度是新版应用的 2.3 倍。

您该怎么做?

使用 Flexbox 时,一定要编写新内容:IE10 补间程序语法,以及 Chrome 21+、Safari 7+、Firefox 22+、Opera(和 Opera Mobile)12.1+、IE 11+ 和 Blackberry 10+ 中的新版 Flexbox。在很多情况下,您可以使用某些旧版 Flexbox

请注意:工具而非规则

更重要的是优化重要内容。在花时间优化某种操作之前,应始终先使用时间轴来确定瓶颈问题。

事实上,我们已经与 Wilson 和 Financial Times Labs 团队建立了联系,从而扩大了 Chrome 开发者工具在布局性能工具方面的覆盖范围。我们很快就会添加查看元素的重新布局边界的功能,时间轴中的布局事件会加载每个布局的作用域、根和开销的详细信息:

强制同步布局弹出式窗口