草庐IT

【Odoo】Odoo16-性能优化提升

虚幻私塾 2023-04-03 原文

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

上海序说科技,专注于基于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. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  2. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

  3. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  4. ruby-on-rails - 如果条件与 &&,是否有任何性能提升 - 2

    如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:

  5. ruby - 如何找到我的 Ruby 应用程序中的性能瓶颈? - 2

    我编写了一个Ruby应用程序,它可以解析来自不同格式html、xml和csv文件的源中的大量数据。我如何找出代码的哪些区域花费的时间最长?有没有关于如何提高Ruby应用程序性能的好资源?或者您是否有任何始终遵循的性能编码标准?例如,你总是用加入你的字符串吗?output=String.newoutput或者你会使用output="#{part_one}#{part_two}\n" 最佳答案 好吧,有一些众所周知的做法,例如字符串连接比“#{value}”慢得多,但是为了找出您的脚本在哪里消耗了大部分时间或比所需时间更多,您需要进行分

  6. 深度学习12. CNN经典网络 VGG16 - 2

    深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG

  7. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

  8. STM32的HAL和LL库区别和性能对比 - 2

    LL库和HAL库简介LL:Low-Layer,底层库HAL:HardwareAbstractionLayer,硬件抽象层库LL库和hal库对比,很精简,这实际上是一个精简的库。LL库的配置选择如下:在STM32CUBEMX中,点击菜单的“ProjectManager”–>“AdvancedSettings”,在下面的界面中选择“AdvancedSettings”,然后在每个模块后面选择使用的库总结:1、如果使用的MCU是小容量的,那么STM32CubeLL将是最佳选择;2、如果结合可移植性和优化,使用STM32CubeHAL并使用特定的优化实现替换一些调用,可保持最大的可移植性。另外HAL和L

  9. ruby - GC.disable 的任何性能缺点? - 2

    是否存在GC.disable会降低性能的情况?只要我使用的是真正的RAM而不是交换内存,就可以这样做吗?我正在使用MRIRuby2.0,据我所知,它是64位的,并且使用的是64位的Ubuntu:ruby2.0.0p0(2013-02-24revision39474)[x86_64-linux]Linux[redacted]3.2.0-43-generic#68-UbuntuSMPWedMay1503:33:33UTC2013x86_64x86_64x86_64GNU/Linux 最佳答案 GC.disable将禁用垃圾回收。像rub

  10. Ruby 缺少常量表达式优化? - 2

    我希望Ruby的解析器会进行这种微不足道的优化,但似乎并没有(谈到YARV实现,Ruby1.9.x、2.0.0):require'benchmark'deffib1a,b=0,1whileb由于这两种方法除了在第二种方法中使用预定义常量而不是常量表达式外是相同的,因此Ruby解释器似乎在每个循环中一次又一次地计算幂常数。是否有一些Material说明为什么Ruby根本不进行这种基本优化或只在某些特定情况下进行? 最佳答案 很抱歉给出了另一个答案,但我不想删除或编辑我之前的答案,因为它下面有有趣的讨论。正如JörgWMittag所说,

随机推荐