上海序说科技,专注于基于Odoo项目实施,实现企业数智化,助力企业成长。

老韩头的开发日常,博客园分享(2022年前博文)

10月12日,Odoo16版本正式发布,本文将就Odoo官方在性能方面做的优化做一个总结。如果需要官方视频,可以翻阅B站,有不少朋友已经做了搬运工。

性能提升切入点

Odoo作为B/S架构的应用,终端用户一般使用的是浏览器访问。因此,对于用户侧而言,性能提升的感觉主要体现在用户点击后响应实现变化。如下图



官方将该过程分为了

  • Web应用终端
  • 网络请求
  • 业务应用
  • Odoo主框架逻辑
  • 硬件层面

Web应用终端

在Web应用终端,其实也就是用户侧的浏览器。官方在JS和CSS方便都做了不同程度的优化,如下图



BlockDOM

官方定义是一种更为底层的对于DOM对象的抽象管理库。可以在渲染页面DOM对象的时候以块的形式进行,并区分了其中的静态元素和动态元素。

关于BlockDOM的详细说明,博主将在后续的文章中进行介绍。

blockdom is a very fast virtual dom library. Its main selling point is that it does not represent DOM element by element, but instead block by block, where a block is an element with all its static content and some special tags to indicate dynamic content. This allows blockdom to use cloneNode(true) on blocks and speed up the diff process, since the vdom tree is much smaller.

OWL2 框架

我们知道自Odoo15开始,官方引入了新的前端框架OWL。随着Odoo16的发布,OWL框架也进入2.x版本,其中与1.x版本还是有一些不同的,这也是为什么博主会写 OWL系列教程 的原因。



如上,在Odoo15中,只有30%的前端组件使用了OWL1框架,那么在本次发布的Odoo16版本中,除了Odoo Studio模块的部分前端代码依旧保留有Widget形式外,已经有99%的代码使用OWL 2进行了重构。

由此带来的效果是:

  1. 缩减了30%的代码行数
  2. 页面渲染速度实现了2到20倍不同程度的提升

    CSS Cleanup

    Odoo16中大幅缩减了SCSS的代码行数,从而减少了渲染页面时的时间。



    其他
  • 在Tree视图下的,将该对象下全部的信息的数量调整为上限10000,如下图所示,性能提升效果还是很明显的。
  • 减少或合并了一些RPC请求,进而提高客户端的响应
  • 重构了讨论模块并将longpoll改为了websocket(终于改了,该功能在Odoo14的时候就已经有开发者pull了,但一直没有合并 )

网络请求

作为BS架构的应用,用户的每一次操作都需要与服务器实现有效的数据交互。因此,优化的重点就放在了

  • 缩减请求包体大小
  • 合并请求数量

将分别将JS、CSS文件合并为一个文件,并去除了冗余代码:



优化load_views()中逻辑,精简字段数据:

  • 通过NGINX等软件代理实现大文件的下载

在启动Odoo实例的时候,添加--x-sendfile指令,可以在用户请求大文件的时候,响应用户请求的worker可通过添加X-Accel-Redirect头,实现NGINX直接将缓存文件发送回用户,减少对应用的压力。

业务应用

业务应用方面的优化主要是体现在

  • onchange -> compute
  • 代码重构

onchange -> compute



在上图中该销售单共有多个产品行,每个订单行的金额小计依赖于商品价格、数量、优惠等,而订单总金额则依赖于每行的金额小计。因此,在上图中,若我们改变了三行的优惠额度,那么对于总价而言,也将计算三次。但是,若我们将总金额通过compute方式实现,就只需要计算一次就够了。

如下图所示,Compute与onchange的对比:

Odoo16在field定义的时候,还新增了precompute关键字,可用于替换特定场景下的default,有效减少SQL操作。

Odoo主框架逻辑

Odoo16在主框架上优化还是很明显的,对于已有项目的迁移可能是个挑战。正好有客户使用的Odoo14版本,后续将迁移过程也会整理下。

  • 翻译字段优化
  • 片段优化
  • 索引优化
  • 视图和菜单优化
  • Sessions

翻译字段优化

我们看到,在老版本的Odoo中,res.country对象在不同语种情况下的名称是单独定义在iir.tanslation对象中的。那么,当我们需要非英语的国家名称时,需要将两张表关联查询才能得到目标值。

Odoo16将类似这种情况下的字段,调整为了JSONB格式字段,这样就允许我们较为直接的查询到我们的目标值。优化后在查询和更新时都会有较为明显的提升,唯一一个缺点是我们需要安装一个新的语种时会慢一点,不过这也能够理解。毕竟是新的语种需要将所涉及到的翻译全部都更新一遍。

片段缓存

在Odoo16的视图渲染中,引入了片段缓存的概念,如下图,我们可以在视图中通过t-cache关键字标识该区域是否启用缓存或者依赖于哪些对象。比如,header、footer标签一般是所有页面通用的,因此此处我们设置为t-cache="True"。在Section标签中,有可能展示不同的商品信息,此处我们配置了t-cache="products,pricelist"对象。而在购物车的位置,将需要判断用户是否登陆再渲染,所以此处设置为t-cache="None"

通过片段缓存技术,页面渲染的速度得到蛮大的提升。

索引优化

在Odoo16中,扩展了索引的方式,btree_not_null(并无索引null)和trigram(用于字符串搜索,ilike等场景)。

视图和菜单

引入视图缓存的方式及优化菜单冷加载,可将视图加载的时间提高6.5倍。

Sessions

仅存储必要的Sessions信息,对于访客的Session将不再存储。

硬件层面

这点没什么好说的

【Odoo】Odoo16-性能优化提升的更多相关文章

  1. 对JSP和Servlet性能优化,提升执行效率

    你的J2EE应用是不是运行的很慢?它们能不能承受住不断上升的访问量?本文讲述了开发高性能.高弹性的JSP页面和Servlet的性能优化技术.其意思是建立尽可能快的并能适应数量增长的用户及其请求.在本文 ...

  2. Elasticsearch 通关教程(七): Elasticsearch 的性能优化

    硬件选择 Elasticsearch(后文简称 ES)的基础是 Lucene,所有的索引和文档数据是存储在本地的磁盘中,具体的路径可在 ES 的配置文件../config/elasticsearch. ...

  3. 前端性能优化之 Composite

    摘要: 一个 Web 页面的展示,简单来说可以认为经历了 JavaScript/Style/Layout/Paint/Composite 几个步骤.本文主要深入 Composite 部分,从渲染原理. ...

  4. Java性能优化之使用NIO提升性能(Buffer和Channel)

    在软件系统中,由于IO的速度要比内存慢,因此,I/O读写在很多场合都会成为系统的瓶颈.提升I/O速度,对提升系统整体性能有着很大的好处. 在Java的标准I/O中,提供了基于流的I/O实现,即Inpu ...

  5. Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化

    Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化 1. 通用功能又可以组合成crud模块1 1.1. 查询(包括步骤,发送查询dsl,通讯返回结果,绑定到表格控件)2 1.2. ...

  6. 初探性能优化——2个月到4小时的性能提升(copy)推荐阅读

    一直不知道性能优化都要做些什么,从哪方面思考,直到最近接手了一个公司的小项目,可谓麻雀虽小五脏俱全.让我这个编程小白学到了很多性能优化的知识,或者说一些思考方式.真的感受到任何一点效率的损失放大一定倍 ...

  7. Web性能优化系列:10个JavaScript性能提升的技巧

    由 伯乐在线 - Delostik 翻译,黄利民 校稿.未经许可,禁止转载!英文出处:jonraasch.com.欢迎加入翻译小组. Nicholas Zakas是一位 JS 大师,Yahoo! 首页 ...

  8. [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  9. Web性能优化:What? Why? How?

    为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...

  10. C++ 应用程序性能优化

    C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...

随机推荐

  1. react实战系列 —— react 的第一个组件

    react 的第一个组件 写了 react 有一个半月,现在又有半个月没写了,感觉对其仍旧比较陌生. 本文分两部分,首先聊一下 react 的相关概念,然后不使用任何语法糖(包括 jsx)或可能隐藏底 ...

  2. Floyd算法详解

    Floyd本质上使用了DP思想,我们定义\(d[k][x][y]\)为允许经过前k个节点时,节点x与节点y之间的最短路径长度,显然初始值应该为\(d[k][x][y] = +\infin (k, x, ...

  3. 臭名远扬之 goto 语句

    C 语言自学之 goto 语句 Dome1:以下程序实现从控制台输出1-10,使用goto语句,实现当输出完3之后跳出循环体. 1 #include <stdio.h> 2 3 int m ...

  4. 手把手教你分析MySQL查询性能瓶颈,包教包会

    当一条SQL执行较慢,需要分析性能瓶颈,到底慢在哪? 我们一般会使用Explain查看其执行计划,从执行计划中得知这条SQL有没有使用索引?使用了哪个索引? 但是执行计划显示内容不够详细,如果显示用到 ...

  5. FormData 和表单元素(form)的区别

    Form 元素 <form>元素表示文档中的一个区域,此区域包含交互控件,用于向 Web 服务器提交信息(文件.字符).下面称之为表单元素或表单. 要向 Web 服务器提交信息,我们必须要 ...

  6. 生成 SSH 公钥

    什么是 SSH 一般的网络服务程序,如FTP.PoP和TelNet在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据.而且,这些服务程序的安全验证 ...

  7. 数据库简介与MySQL简介

    MySQL简介 数据存取演变史 起源······文本文件 在最开始使用计算机都没有相应的规范我们的数据一般都是自己起一个名字然后就根据这个路径存储数据并且存储数据的格式也都五花八门就产生了很多奇奇怪怪 ...

  8. HMS Core Discovery第17期直播预告|音随我动,秒变音色造型师

    [导读] 随着音视频内容品类的不断丰富及音乐创作门槛不断降低,大量用户正热切的参与到全民创作的大潮中.我们应该怎么去拥抱移动端影音潜力市场?音频编辑又可以有什么新玩法? 本期直播<音随我动,秒变 ...

  9. 【c#语言简单算法】1-角谷猜想

    角谷猜想 算法目的 一个正整数x,如果是奇数就乘以3再加1,如果是偶数就析出偶数因数2ⁿ,这样经过若干个次数,最终回到1. 这里计算0-100的所有计算过程 代码实现 for (int n = 1; ...

  10. 试用 ModVB(一):安装教程+使用 JSON 常量和 JSON 模式匹配

    前排提醒:阅读此文章并充分尝试 ModVB 的新语法需要较长的时间.对于程序员而言,如果你工作时不用 VB,则最好避免在上班时间看,以免被领导认为你在长时间摸鱼. 什么是 ModVB ModVB 是一 ...