阅读更多

1顶
0踩

编程语言

在 Web 开发中,随着需求的增加与代码库的扩张,我们最终发布的 Web 页面也逐渐膨胀。不过这种膨胀远不止意味着占据更多的传输带宽,其还意味着用户浏览网页时可能更差劲的性能体验。浏览器在下载完某个页面依赖的脚本之后,其还需要经过语法分析、解释与运行这些步骤。而本文则会深入分析浏览器对于 JavaScript 的这些处理流程,挖掘出那些影响你应用启动时间的罪魁祸首,并且根据我个人的经验提出相对应的解决方案。回顾过去,我们还没有专门地考虑过如何去优化 JavaScript 解析/编译这些步骤;我们预想中的是解析器在发现<script>标签后会瞬时完成解析操作,不过这很明显是痴人说梦。下图是对于 V8 引擎工作原理的概述:

下面我们深入其中的关键步骤进行分析。

到底是什么拖慢了我们应用的启动时间?
在启动阶段,语法分析,编译与脚本执行占据了 JavaScript 引擎运行的绝大部分时间。换言之,这些过程造成的延迟会真实地反应到用户可交互时延上;譬如用户已经看到了某个按钮,但是要好几秒之后才能真正地去点击操作,这一点会大大影响用户体验。

上图是我们使用 Chrome Canary 内置的 V8 RunTime Call Stats 对于某个网站的分析结果;需要注意的是桌面浏览器中语法解析与编译占用的时间还是蛮长的,而在移动端中占用的时间则更长。实际上,对于 Facebook, Wikipedia, Reddit 这些大型网站中语法解析与编译所占的时间也不容忽视:

上图中的粉色区域表示花费在 V8 与 Blink’s C++ 中的时间,而橙色和黄色分别表示语法解析与编译的时间占比。Facebook 的 Sebastian Markbage 与 Google 的 Rob Wormald 也都在 Twitter 发文表示过 JavaScript 的语法解析时间过长已经成为了不可忽视的问题,后者还表示这也是 Angular 启动时主要的消耗之一。

随着移动端浪潮的涌来,我们不得不面对一个残酷的事实:移动端对于相同包体的解析与编译过程要花费相当于桌面浏览器2~5倍的时间。当然,对于高配的 iPhone 或者 Pixel 这样的手机相较于 Moto G4 这样的中配手机表现会好很多;这一点提醒我们在测试的时候不能仅用身边那些高配的手机,而应该中高低配兼顾:

上图是部分桌面浏览器与移动端浏览器对于 1MB 的 JavaScript 包体进行解析的时间对比,显而易见的可以发现不同配置的移动端手机之间的巨大差异。当我们应用包体已经非常巨大的时候,使用一些现代的打包技巧,譬如代码分割,TreeShaking,Service Workder 缓存等等会对启动时间有很大的影响。另一个角度来看,即使是小模块,你代码写的很糟或者使用了很糟的依赖库都会导致你的主线程花费大量的时间在编译或者冗余的函数调用中。我们必须要清醒地认识到全面评测以挖掘出真正性能瓶颈的重要性。

JavaScript 语法解析与编译是否成为了大部分网站的瓶颈?
我曾不止一次听到有人说,我又不是 Facebook,你说的 JavaScript 语法解析与编译到
底会对其他网站造成什么样的影响呢?对于这个问题我也很好奇,于是我花费了两个月的时间对于超过 6000 个网站进行分析;这些网站囊括了 React,Angular,Ember,Vue 这些流行的框架或者库。大部分的测试是基于 WebPageTest 进行的,因此你可以很方便地重现这些测试结果。光纤接入的桌面浏览器大概需要 8 秒的时间才能允许用户交互,而 3G 环境下的 Moto G4 大概需要 16 秒 才能允许用户交互。

大部分应用在桌面浏览器中会耗费约 4 秒的时间进行 JavaScript 启动阶段(语法解析、编译、执行):

而在移动端浏览器中,大概要花费额外 36% 的时间来进行语法解析:

另外,统计显示并不是所有的网站都甩给用户一个庞大的 JS 包体,用户下载的经过 Gzip 压缩的平均包体大小是 410KB,这一点与 HTTPArchive 之前发布的 420KB 的数据基本一致。不过最差劲的网站则是直接甩了 10MB 的脚本给用户,简直可怕。

通过上面的统计我们可以发现,包体体积固然重要,但是其并非唯一因素,语法解析与编译的耗时也不一定随着包体体积的增长而线性增长。总体而言小的 JavaScript 包体是会加载地更快(忽略浏览器、设备与网络连接的差异),但是同样 200KB 的大小,不同开发者的包体在语法解析、编译上的时间却是天差地别,不可同日而语。

现代 JavaScript 语法解析 & 编译性能评测
Chrome DevTools
打开 Timeline( Performance panel ) > Bottom-Up/Call Tree/Event Log 就会显示出当前网站在语法解析/编译上的时间占比。如果你希望得到更完整的信息,那么可以打开 V8 的 Runtime Call Stats。在 Canary 中,其位于 Timeline 的 Experims > V8 Runtime Call Stats 下。


Chrome Tracing
打开 about:tracing 页面,Chrome 提供的底层的追踪工具允许我们使用disabled-by-default-v8.runtime_stats来深度了解 V8 的时间消耗情况。V8 也提供了详细的指南来介绍如何使用这个功能。


WebPageTest

WebPageTest 中 Processing Breakdown 页面在我们启用 Chrome > Capture Dev Tools Timeline 时会自动记录 V8 编译、EvaluateScript 以及 FunctionCall 的时间。我们同样可以通过指明disabled-by-default-v8.runtime_stats的方式来启用 Runtime Call Stats。

更多使用说明参考我的[url="https://gist.github.com/addyosmani/45b135900a7e3296e22673148ae5165b"]gist。

User Timing
我们还可以使用 Nolan Lawson 推荐的User Timing API来评估语法解析的时间。不过这种方式可能会受 V8 预解析过程的影响,我们可以借鉴 Nolan 在 optimize-js 评测中的方式,在脚本的尾部添加随机字符串来解决这个问题。我基于 Google Analytics 使用相似的方式来评估真实用户与设备访问网站时候的解析时间:


DeviceTiming
Etsy 的 DeviceTiming 工具能够模拟某些受限环境来评估页面的语法解析与执行时间。其将本地脚本包裹在了某个仪表工具代码内从而使我们的页面能够模拟从不同的设备中访问。可以阅读 Daniel Espeset 的Benchmarking JS Parsing and Execution on Mobile Devices 一文来了解更详细的使用方式。


我们可以做些什么以降低 JavaScript 的解析时间?
  • 减少 JavaScript 包体体积。我们在上文中也提及,更小的包体往往意味着更少的解析工作量,也就能降低浏览器在解析与编译阶段的时间消耗。
  • 使用代码分割工具来按需传递代码与懒加载剩余模块。这可能是最佳的方式了,类似于PRPL这样的模式鼓励基于路由的分组,目前被 Flipkart, Housing.com 与 Twitter 广泛使用。
  • Script streaming: 过去 V8 鼓励开发者使用async/defer来基于script streaming实现 10-20% 的性能提升。这个技术会允许 HTML 解析器将相应的脚本加载任务分配给专门的 script streaming 线程,从而避免阻塞文档解析。V8 推荐尽早加载较大的模块,毕竟我们只有一个 streamer 线程。
  • 评估我们依赖的解析消耗。我们应该尽可能地选择具有相同功能但是加载地更快的依赖,譬如使用 Preact 或者 Inferno 来代替 React,二者相较于 React 体积更小具有更少的语法解析与编译时间。Paul Lewis 在最近的一篇文章中也讨论了框架启动的代价,与 Sebastian Markbage 的说法不谋而合:最好地评测某个框架启动消耗的方式就是先渲染一个界面,然后删除,最后进行重新渲染。第一次渲染的过程会包含了分析与编译,通过对比就能发现该框架的启动消耗。
如果你的 JavaScript 框架支持 AOT(ahead-of-time)编译模式,那么能够有效地减少解析与编译的时间。Angular 应用就受益于这种模式:


现代浏览器是如何提高解析与编译速度的?
不用灰心,你并不是唯一纠结于如何提升启动时间的人,我们 V8 团队也一直在努力。我们发现之前的某个评测工具 Octane 是个不错的对于真实场景的模拟,它在微型框架与冷启动方面很符合真实的用户习惯。而基于这些工具,V8 团队在过去的工作中也实现了大约 25% 的启动性能提升:

本部分我们就会对过去几年中我们使用的提升语法解析与编译时间的技巧进行阐述。

代码缓存

Chrome 42 开始引入了所谓的代码缓存的概念,为我们提供了一种存放编译后的代码副本的机制,从而当用户二次访问该页面时可以避免脚本抓取、解析与编译这些步骤。除以之外,我们还发现在重复访问的时候这种机制还能避免 40% 左右的编译时间,这里我会深入介绍一些内容:
  • 代码缓存会对于那些在 72 小时之内重复执行的脚本起作用。
  • 对于 Service Worker 中的脚本,代码缓存同样对 72 小时之内的脚本起作用。
  • 对于利用 Service Worker 缓存在 Cache Storage 中的脚本,代码缓存能在脚本首次执行的时候起作用。
总而言之,对于主动缓存的 JavaScript 代码,最多在第三次调用的时候其能够跳过语法分析与编译的步骤。我们可以通过chrome://flags/#v8-cache-strategies-for-cache-storage来查看其中的差异,也可以设置 js-flags=profile-deserialization运行 Chrome 来查看代码是否加载自代码缓存。不过需要注意的是,代码缓存机制仅会缓存那些经过编译的代码,主要是指那些顶层的往往用于设置全局变量的代码。而对于类似于函数定义这样懒编译的代码并不会被缓存,不过 IIFE 同样被包含在了 V8 中,因此这些函数也是可以被缓存的。

Script Streaming
Script Streaming允许在后台线程中对异步脚本执行解析操作,可以对于页面加载时间有大概 10% 的提升。上文也提到过,这个机制同样会对同步脚本起作用。

这个特性倒是第一次提及,因此 V8 会允许所有的脚本,即使阻塞型的<script src=''>脚本也可以由后台线程进行解析。不过缺陷就是目前仅有一个 streaming 后台线程存在,因此我们建议首先解析大的、关键性的脚本。在实践中,我们建议将<script defer>添加到<head>块内,这样浏览器引擎就能够尽早地发现需要解析的脚本,然后将其分配给后台线程进行处理。我们也可以查看 DevTools Timeline 来确定脚本是否被后台解析,特别是当你存在某个关键性脚本需要解析的时候,更需要确定该脚本是由 streaming 线程解析的。


语法解析 & 编译优化
我们同样致力于打造更轻量级、更快的解析器,目前 V8 主线程中最大的瓶颈在于所谓的非线性解析消耗。譬如我们有如下的代码片:
(function (global, module) { … })(this, function module() { my functions })

V8 并不知道我们编译主脚本的时候是否需要module这个模块,因此我们会暂时放弃编译它。而当我们打算编译module时,我们需要重分析所有的内部函数。这也就是所谓的 V8 解析时间非线性的原因,任何一个处于 N 层深度的函数都有可能被重新分析 N 次。V8 已经能够在首次编译的时候搜集所有内部函数的信息,因此在未来的编译过程中 V8 会忽略所有的内部函数。对于上面这种module形式的函数会是很大的性能提升,建议阅读The V8 Parser(s) — Design, Challenges, and Parsing JavaScript Better来获取更多内容。V8 同样在寻找合适的分流机制以保证启动时能在后台线程中执行 JavaScript 编译过程。

预编译 JavaScript?
每隔几年就有人提出引擎应该提供一些处理预编译脚本的机制,换言之,开发者可以使用构建工具或者其他服务端工具将脚本转化为字节码,然后浏览器直接运行这些字节码即可。从我个人观点来看,直接传送字节码意味着更大的包体,势必会增加加载时间;并且我们需要去对代码进行签名以保证能够安全运行。目前我们对于 V8 的定位是尽可能地避免上文所说的内部重分析以提高启动时间,而预编译则会带来额外的风险。不过我们欢迎大家一起来讨论这个问题,虽然 V8 目前专注于提升编译效率以及推广利用 Service Worker 缓存脚本代码来提升启动效率。我们在 BlinkOn7 上与 Facebook 以及 Akamai 也讨论过预编译相关内容。

Optimize JS 优化
类似于 V8 这样的 JavaScript 引擎在进行完整的解析之前会对脚本中的大部分函数进行预解析,这主要是考虑到大部分页面中包含的 JavaScript 函数并不会立刻被执行。

预编译能够通过只处理那些浏览器运行所需要的最小函数集合来提升启动时间,不过这种机制在 IIFE 面前却反而降低了效率。尽管引擎希望避免对这些函数进行预处理,但是远不如optimize-js这样的库有作用。optimize-js 会在引擎之前对于脚本进行处理,对于那些立即执行的函数插入圆括号从而保证更快速地执行。这种预处理对于 Browserify, Webpack 生成包体这样包含了大量即刻执行的小模块起到了非常不错的优化效果。尽管这种小技巧并非 V8 所希望使用的,但是在当前阶段不得不引入相应的优化机制。

总结
启动阶段的性能至关重要,缓慢的解析、编译与执行时间可能成为你网页性能的瓶颈所在。我们应该评估页面在这个阶段的时间占比并且选择合适的方式来优化。我们也会继续致力于提升 V8 的启动性能,尽我所能!

原文出处: Addy Osmani 
  • 大小: 61.7 KB
  • 大小: 140.8 KB
  • 大小: 81.8 KB
  • 大小: 130.9 KB
  • 大小: 142.8 KB
  • 大小: 88.3 KB
  • 大小: 65.9 KB
  • 大小: 51.9 KB
  • 大小: 51.9 KB
  • 大小: 64.3 KB
  • 大小: 75.5 KB
  • 大小: 159.3 KB
  • 大小: 103.2 KB
  • 大小: 149.9 KB
  • 大小: 26.9 KB
  • 大小: 1 KB
  • 大小: 44.5 KB
  • 大小: 125.7 KB
  • 大小: 93.9 KB
  • 大小: 71.2 KB
  • 大小: 7.6 KB
  • 大小: 24.2 KB
  • 大小: 25.3 KB
  • 大小: 43.3 KB
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • JavaScript启动性能瓶颈分析与解决方案.docx

    JavaScript启动性能瓶颈分析与解决方案.docx

  • 跨平台解决方案的技术分析

    本文旨在介绍不同跨平台解决方案的技术架构和特点,分析各个解决方案的优势和不足之处,以便对业界当前的跨平台技术方案建立起整体的认知和对团队的技术选型提供一定的参考作用。注意的是,这里的跨平台特指的是...

  • JavaWeb 并发编程 与 高并发解决方案

    在这里写写我学习到和自己所理解的 Java高并发编程和高并发解决方案。现在在各大互联网公司中,随着日益增长的互联网服务需求,高并发处理已经是一个非常常见的问题,在这篇文章里面我们重点讨论两个方面的问题,一...

  • 【高并发解决方案】秒杀系统架构分析与实战

    #0 系列目录#秒杀系统架构秒杀系统架构分析与实战#1 秒杀业务分析#正常电子商务流程(1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货秒杀业务的特性(1)低廉价格;(2)大幅...

  • chrome开发者工具_如何使用Chrome开发者工具查找性能瓶颈

    您的主要目标是确定Scotch上的性能瓶颈 ,并进行优化以获得更好的性能。 软件工程中的瓶颈描述了一个应用程序的容量受单个组件限制的情况。 In the next step, you will perform an audit to look for performance ...

  • 前端如何进行网站性能分析及优化性能

    1.分析网站性能常用的方式 1.1chrome dev Tools 1.2Lighthouse 1.3第三方收费方案 2.介绍一个常用的性能分析工具 LightHouse 2.1 特点: 2.2 使用方式 2.3 代码示例 2.4性能报告 3.准确衡量网站的性能 ...

  • SpringMVC中的跨域请求配置解决方案

    作者:禅与计算机程序设计艺术 1.简介 跨域(Cross-origin resource sharing)是由一个资源从一个域名访问另一个不同的域名而发生的一种行为。由于同源策略的限制,默认情况下浏览器禁止从不同域向当前域发送HTTP...

  • 秒杀的架构设计和解决方案

    秒杀系统架构分析与实战 1 秒杀业务分析 正常电子商务流程 (1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货 秒杀业务的特性 (1)低廉价格;(2)...

  • 编写高性能JavaScript

    很多JavaScript引擎,如Google的V8引擎(被Chrome和Node所用),是专门为...如果你是一个开发者,并且关心内存使用情况与页面性能,你应该了解用户浏览器中的JavaScript引擎是如何运作的。无论是V8,SpiderMonkey

  • 关于 VS Code 优化启动性能的实践

    The First Second 这次分享的介绍,CovalenceConf 是一个以 Electron 构建桌面软件为主题的技术会议,这也是 VS Code 团队为数不多的对外分享之一(质量较高),主要分享了 VS Code 是如何优化启动性能的。...

  • JavaScript 的性能优化:加载和执行

    JavaScript 的性能优化:加载和执行 随着 Web2.0 技术的不断推广,越来越多的应用使用 JavaScript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题。而这...

  • WebView性能、体验分析与优化

    关于这些问题的解决方案数量可能会比问题还多,而它们也各有优劣。 具体分析太过复杂,鉴于篇幅原因在这里不做具体分析了。您可以期待我们的后续计划:BPM(浏览器包管理)。 JS解析、编译、执行 在...

  • 直播项目微信小程序源码(类似于微信视频通话).zip

    《直播项目微信小程序源码简介》 本资源是一份极具学习价值的直播项目微信小程序源码,类似于微信视频通话功能。它为开发者提供了一个完整的直播项目框架和实现逻辑,可用于深入研究直播技术在小程序中的应用。 该源码涵盖了直播项目的核心功能模块,包括视频采集、推流、播放等关键部分。通过对其代码结构的研究,开发者可以了解到如何利用微信小程序的相关接口和功能来实现流畅、稳定的直播体验。例如,在视频采集方面,源码展示了如何在小程序中调用设备摄像头,并进行实时视频数据的处理;在推流环节,详细阐述了如何将采集到的视频数据推送到服务器,以供其他用户观看;而在播放部分,则清晰地展示了如何在小程序界面上实现视频的流畅播放和控制。 这份源码不仅有助于开发者掌握直播技术在小程序中的实际应用,还能为进一步开发和优化直播类小程序提供宝贵的参考和借鉴,是一份不可多得的学习资源。

  • 详细阐述了中国智慧医疗建设的发展历程、现状、挑战及未来趋势 以下是文章的主要内容总结:

    内容概要:本文详细探讨了智慧医疗建设的历程、现状、挑战及未来发展趋势。智慧医疗建设经历了信息化、数字化和数智化三个阶段,政策、需求和技术是其发展的三大推动力。文章指出,当前智慧医疗已从数据收集与治理阶段迈向数据价值应用阶段,特别是在高质量数据库建设、云计算、人工智能等技术的推动下,实现了临床科研、药物研发、真实世界研究及数字营销等多个场景的商业化落地。此外,文中还分析了医疗信息化系统同质化、数据孤岛、互联互通等痛点,并提出了云化转型、新产品、新技术和新服务作为突破方向。最后,通过奈特瑞、医渡科技、东软集团三个企业案例,展示了不同企业在智慧医疗领域的创新实践。 适合人群:医疗信息化从业者、医疗行业研究人员、医疗机构管理者、医疗科技企业相关人员、政策制定者及对智慧医疗感兴趣的投资者。 使用场景及目标:①了解智慧医疗建设的阶段性特征和发展趋势;②掌握医疗信息化建设中的关键技术和应用场景;③探讨解决医疗信息化系统同质化、数据孤岛等问题的策略;④学习企业如何通过新产品、新技术和新服务实现突破,推动智慧医疗发展。 其他说明:本文通过对智慧医疗建设的深入剖析,强调了政策导向、技术创新和市场需求的重要性,为企业和政策制定者提供了宝贵的参考。同时,文章也揭示了未来智慧医疗发展的广阔前景,特别是在数据资产化和数智化应用方面的巨大潜力。阅读时应注意结合政策背景和技术发展趋势,关注行业动态和企业创新实践。

  • 电机设计领域中8级48槽永磁同步电机振动噪声分析的Motor CAD应用

    内容概要:本文详细介绍了利用Motor CAD软件对8级48槽永磁同步电机进行振动噪声分析的方法和步骤。主要内容涵盖前期准备工作,如软件环境搭建和基本原理的理解;建立电机模型的具体细节,包括定子和转子部分的参数设置;振动噪声分析的相关设置,特别是电磁力波的计算方法及其重要参数的设定;以及最终分析结果的解读,包括振动模态图和噪声频谱分析结果的应用。通过这些步骤,可以识别出导致较大振动和噪声的问题所在,并提出针对性的优化措施,如调整槽配合、优化永磁体形状等,以改善电机的整体性能。 适合人群:从事电机设计与优化的专业人士,尤其是对永磁同步电机振动噪声分析感兴趣的工程师和技术人员。 使用场景及目标:适用于希望深入了解和掌握Motor CAD软件在电机振动噪声分析方面应用的技术人员。目标是在实际工作中能够运用所学知识,提高电机的设计质量和性能,减少不必要的振动和噪声。 其他说明:文中提供了大量具体的代码片段和操作指南,帮助读者更好地理解和实践。同时强调了电磁-机械-声学耦合的重要性,指出结构设计对于降噪的关键作用。

  • 【计算机教育】计算机专业课后习题高效学习策略:构建知识体系与应对考试重点

    内容概要:本文是一篇面向计算机类专业学生的课后习题学习指南,强调课后习题对于构建专业知识体系的重要性。文章指出,做题不仅是为了完成任务或应付考试,更重要的是理解知识点背后的原理。文中详细介绍了不同课程类型的习题应采用的不同方法,如程序设计类需多动手调试,数据结构与算法类要手动画图并多敲代码等。同时提醒学生注意考试重点往往隐藏在课后题中,并提倡通过迭代学习巩固知识,避免常见错误。 适合人群:计算机类专业的学生,特别是那些在课后习题练习中遇到困难或希望提高学习效率的人群。 使用场景及目标:①帮助学生掌握正确的课后习题练习方法;②指导学生根据课程特点选择合适的做题策略;③提醒学生关注课后题中的潜在考试重点;④通过迭代学习的方式强化理解和记忆。 阅读建议:本文提供了实用的学习技巧和建议,读者应在实际做题过程中尝试运用这些方法,不断调整和优化自己的学习方式,以达到更好的学习效果。

  • 四旋翼无人机轨迹跟踪:PID与自适应滑模控制的Matlab仿真研究

    内容概要:本文详细探讨了四旋翼无人机(UAV)的轨迹跟踪控制技术,重点介绍了两种主流控制方法:PID控制和自适应滑模控制。首先,文章阐述了PID控制的基本原理及其在Simulink中的具体实现步骤,展示了如何通过调节PID参数实现稳定的轨迹跟踪,并提供了详细的Matlab代码示例。接着,文章深入讲解了自适应滑模控制的工作机制,强调了其对系统不确定性的强鲁棒性特点,并给出了相应的Matlab实现代码。此外,文中通过多种图表形式展示了不同控制方法下的仿真结果,直观比较了它们的优缺点。最后,作者总结指出,PID控制适合于系统模型较为确定的情况,而自适应滑模控制则更适合应对复杂的外部环境和不确定性因素。 适合人群:对无人机控制系统感兴趣的科研人员、工程技术人员及高校相关专业学生。 使用场景及目标:①帮助读者理解并掌握PID和自适应滑模控制的基本原理;②提供具体的Matlab/Simulink实现案例,便于读者进行实际操作练习;③通过对两种控制方法的对比分析,指导读者选择合适的控制策略应用于实际项目中。 其他说明:文章不仅提供了详尽的技术细节,还包括了许多实用的小技巧和经验分享,有助于提高读者的实际动手能力和解决问题的能力。

  • 电力电子领域LLC谐振变换器PFM+PSM混合控制仿真及其应用

    内容概要:本文详细探讨了LLC谐振变换器中变频移相(PFM+PSM)混合控制的仿真研究与实现。首先介绍了这种方法可以拓宽输入电压范围,确保MOS管的零电压开通(ZVS)和二极管的零电流关断(ZCS),从而降低开关损耗并提高变换器效率。接着展示了在Matlab/Simulink和Plecs环境下的具体实现步骤,包括关键参数设置、模式切换逻辑以及波形展示。文中还强调了参数整定的重要性,如谐振腔Q值的影响,并给出了具体的解决方案。此外,讨论了仿真过程中需要注意的问题,如仿真步长的选择和软开关条件的检测。 适合人群:从事电力电子设计的研究人员和技术工程师。 使用场景及目标:适用于需要设计高效、稳定电力转换系统的场合,特别是在输入电压范围较广的应用中,如光伏逆变器。目标是通过合理的控制策略实现更高的效率和平滑的工作状态。 阅读建议:读者应重点关注PFM和PSM模式的具体实现细节,尤其是两者之间的平滑切换逻辑,同时也要注意仿真工具的选择和参数调整技巧。

  • 【移动应用开发】VIP学习资源整合:涵盖Android、iOS、React Native及Flutter的开发工具、资源与社区

    内容概要:本文汇总了移动应用开发领域的VIP学习资源,涵盖从基础入门到进阶提高的全方位内容。基础资源方面,推荐了针对Android、iOS、React Native的多本经典书籍及Udemy、Coursera、edX等平台上的在线课程和YouTube视频教程,帮助初学者掌握UI设计、数据存储、前后端交互等基本技能。进阶资源则聚焦于高效编程、性能优化、架构设计等深层次主题,同样提供了书籍、在线课程和视频教程。对于跨平台开发,重点介绍了React Native和Flutter的相关学习资料。此外,还列举了Android Studio、Xcode等常用开发工具及其配套调试工具,以及Flutter Gallery、React Native Showcase等开源项目作为实践参考。最后,提及了Stack Overflow、Reddit - AndroidDev等社区论坛,为开发者提供交流平台。 适合人群:对移动应用开发感兴趣的初学者、有一定经验的研发人员及希望深入了解跨平台开发的开发者。 使用场景及目标:①初学者可以通过书籍、在线课程和视频教程系统学习移动应用开发的基础知识;②进阶者可利用进阶资源深入研究特定技术领域,如性能优化、架构设计等;③跨平台开发者可以借助React Native和Flutter的学习资料实现多平台应用开发;④使用推荐的开发工具和调试工具提高开发效率,解决实际问题;⑤通过开源项目和社区论坛获取实践经验和技术支持。 阅读建议:根据个人技术水平选择合适的资源进行学习,注重理论与实践相结合,积极参与社区交流,不断提升自己的移动应用开发能力。

Global site tag (gtag.js) - Google Analytics