”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 我如何将应用程序性能提高到

我如何将应用程序性能提高到

发布于2024-11-08
浏览:682

⌛ 回顾时间

在我的上一篇博客中,我谈到了如何在短短 2 周内将应用程序大小从 75MB 减少到 34MB(查看!)。但这还不是全部,我还将我们应用程序的整体性能提高了 80%?.

让我们来看看如何!!

?传说

经过简单的一轮浏览后,我发现我们的应用程序中存在一些导致糟糕的用户体验和性能的顶级问题。多么美好的一天!

  • 主要恶棍 - 生成实时响应时整个应用程序 UI 冻结

  • 小人 - 响应时间慢且无帧速率

  • 反派情人-Api调用过多

  • 亡灵大军 - 糟糕的错误处理和崩溃

  • 痛苦 - 更多 CPU 使用率和服务器成本

  • 黯然失色 - 我!

How I boosted my App Performance up to
于是,一场带着更美好世界希望的宇宙重建之战开始了。

塔希提岛计划(但这一次有效)

所以我首先从解决更简单的问题开始,因为人们很容易忽视大萧条,而不是立即与之抗争。

1. ⚛️ React 的诅咒

ReactJs 的智慧和诅咒是状态。随着我们在 React 中年龄的增长,我们意识到状态越少,应用程序就越好。因此,这个特定的艺术作品在单个聊天屏幕中使用了 22(是的,该死的 22 useStates),您所能做的就是发送消息和接收消息。

樱桃在上面!
我们使用服务器端事件实现从服务器获取逐块数据,在这种情况下是逐字获取的。因此,如果您的查询有 100 个单词的响应(这是最少的响应)。它实际上会收到 100 个事件。

因此,如果您了解数学,每次我们收到响应时,100*22 = 2200 都会重新渲染

我还需要进一步解释吗? ( 不 )

所以我开始重新创建整个屏幕,并将数字减少到 6 个状态。与以前一样具有更好、更流畅的功能。

性能比之前提高了 72%
!!

2.❄️冰冻沙漠

现在,在见证了 React 的 Radahn 之后,我们可以很容易地得出结论,应用程序将会卡住很多,对吗?

现在即使有 6 个状态,主要问题仍然是 100*6。我们仍然悬而未决,但状态减少了。

How I boosted my App Performance up to

主要原因是,react dom 在每个块上都得到更新。因此,为了解决这个问题,我们使用了“批处理和帧速率生成

天哪!

所以基本上,我们每次获得一个块时都会更新 DOM,而是批量制作块并以固定的动态帧速率更新它。这些帧速率是从操作系统调用的,因此每个设备都会根据系统容量具有不同的 FPS,从而使应用程序具有更强大和兼容的性能。

我们批量捕获一组有限的块并保持响应直到帧被释放并重复相同的操作直到所有块都被处理。

因此,我们只更新了 DOM 3-4 次,而不是更新 DOM 100 次。


现在做数学计算并计算家庭作业的表现增强!

3. ?做一个好的倾听者!

这对我来说没能找到女朋友,但肯定能让应用程序变得更好。

API 是获取数据的很酷且很好的方式,但明智地使用它们是您自己的技能!现在这个应用程序正在使用这个 api 从后端获取用户状态。但最好的部分是它每 3 秒使用一次!!

我明白了,开发人员有不安全感,但这不是他们所说的实现工作与生活平衡的意思。

a) 获取

为了在用户每次使用应用程序时获取用户数据,请在应用程序启动时或每次从最近调用应用程序时进行调用(应用程序状态侦听器)。每3秒调用一次,不仅将Mobile资源消耗成无限流,还会造成服务器开销。

serve 不会从 100 个用户那里获取 100 个请求,而是从 1 个用户那里获取 100 个请求。对我来说听起来不太可扩展和可靠。

此外,它还会造成无法追踪的内存泄漏和使用情况,从而在较长的使用中产生问题。

b) 数据流

现在,在解决了内部 DDOS 攻击后,我发现这个应用程序使用了许多 api,其数据在稀薄的空气中消失(数据处理不佳)。应用程序不再缓存数据并在同一流程中再次使用它,而是再次调用 api。

我确保数据被缓存并线性地流动到流程中,并且仅在需要新实例时才调用 api。

一定要记住!

这使得服务器运行状况更好,并减少了由于 api 请求过多而导致的后端停机时间。由于公司运行后端的成本很高,因此仅在需要时有效使用 API 至关重要

不仅对于后端,对于前端也是如此,进行额外的 api 调用会增加系统消耗,因为每次调用时都必须执行更多的 HTTP 握手和协议。

3. ?如果我们不承认它就不是错误!

处理 api 的关键之一是错误。将它们安慰到日志是不够的,因为它使用户的体验比他们的良好使用情况差得多。

使用某种反馈系统处理任何操作中的错误非常重要。它可以是警报、弹出窗口、Toast 或任何东西。但用户应该知道为什么以及如何发生,以便他们可以报告或至少知道他们做错了什么!

4. ?她的回忆

哥们儿!她不会回来,但记忆泄漏会回来。在附加任何侦听器或 Api 调用时我们忘记的主要事情之一是在关闭该活动后删除其实例。

这个应用程序有它的基调,即使活动关闭或在后台,API 调用也会被调用。导致不必要的 CPU 使用和资源占用,使应用程序更加滞后且难以使用。

正确清理这些可以使应用程序更快、更少的开销。

5. 绩效声明

现在使用任何资产的基本方法就是导入它并正确使用它?

但是你知道它是如何工作的吗?每次默认导入一个项目时,它都会通过初始化分配到内存中。因此,如果您在 5 个文件中导入并声明一个图像或组件,如下所示

import Profile from '../../profile'


从“../../profile”导入配置文件

它将为同一件事创建它的 5 个实例!

相反,您应该调用一个索引文件中的所有资源并从中导入对象,这样它只会被声明一次,并且将被到处引用使用。


因此将内存使用量减少到 4/5。

✅ 结论 -

你是个好人阿瑟! (抱歉,我刚刚完成了 RDR2,这是一款非常棒的游戏)。

通过这些更改,应用程序性能得到了极大的提升,不仅有更好的移动端运行状况,还有更好的服务器端优化。

使用短短 1 周,商店评分从 3.5 上升到 4.1!!!

请记住,它不仅仅是一个代码,而是一个关于用户如何与其交互的故事。

作为前端开发人员,整个产品取决于我们。无论后端的可扩展性如何,用户将要使用的最终产品都是创建出来的,这是他们做出决定的唯一事情。因此,对我们来说最重要的是为他们提供顺畅的互动,从而为整个公司带来更好的业务。

?如果您喜欢该博客,请发表评论,或与您的朋友分享,让他们也喜欢它!

版本声明 本文转载于:https://dev.to/suyashdev/how-i-boosted-my-app-performance-up-to-80-334n?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    找到最大计数时,如何解决mySQL中的“组函数\”错误的“无效使用”?
    如何在mySQL中使用mySql 检索最大计数,您可能会遇到一个问题,您可能会在尝试使用以下命令:理解错误正确找到由名称列分组的值的最大计数,请使用以下修改后的查询: 计数(*)为c 来自EMP1 按名称组 c desc订购 限制1 查询说明 select语句提取名称列和每个名称...
    编程 发布于2025-07-01
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在银光应用程序中,尝试使用LINQ建立错误的数据库连接的尝试,无法找到以查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中,tblpersoon可能需...
    编程 发布于2025-07-01
  • Java是否允许多种返回类型:仔细研究通用方法?
    Java是否允许多种返回类型:仔细研究通用方法?
    在Java中的多个返回类型:一种误解类型:在Java编程中揭示,在Java编程中,Peculiar方法签名可能会出现,可能会出现,使开发人员陷入困境,使开发人员陷入困境。 getResult(string s); ,其中foo是自定义类。该方法声明似乎拥有两种返回类型:列表和E。但这确实是如此吗...
    编程 发布于2025-07-01
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-07-01
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-07-01
  • 如何从Google API中检索最新的jQuery库?
    如何从Google API中检索最新的jQuery库?
    从Google APIS 问题中提供的jQuery URL是版本1.2.6。对于检索最新版本,以前有一种使用特定版本编号的替代方法,它是使用以下语法:获取最新版本:未压缩)While these legacy URLs still remain in use, it is recommended ...
    编程 发布于2025-07-01
  • 反射动态实现Go接口用于RPC方法探索
    反射动态实现Go接口用于RPC方法探索
    在GO 使用反射来实现定义RPC式方法的界面。例如,考虑一个接口,例如:键入myService接口{ 登录(用户名,密码字符串)(sessionId int,错误错误) helloworld(sessionid int)(hi String,错误错误) } 替代方案而不是依靠反射...
    编程 发布于2025-07-01
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-07-01
  • 版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    版本5.6.5之前,使用current_timestamp与时间戳列的current_timestamp与时间戳列有什么限制?
    在时间戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源于遗留实现的关注,这些限制需要对当前的_timestamp功能进行特定的实现。 创建表`foo`( `Productid` int(10)unsigned not n...
    编程 发布于2025-07-01
  • 在PHP中如何高效检测空数组?
    在PHP中如何高效检测空数组?
    在PHP 中检查一个空数组可以通过各种方法在PHP中确定一个空数组。如果需要验证任何数组元素的存在,则PHP的松散键入允许对数组本身进行直接评估:一种更严格的方法涉及使用count()函数: if(count(count($ playerList)=== 0){ //列表为空。 } 对...
    编程 发布于2025-07-01
  • 如何正确使用与PDO参数的查询一样?
    如何正确使用与PDO参数的查询一样?
    在pdo 中使用类似QUERIES在PDO中的Queries时,您可能会遇到类似疑问中描述的问题:此查询也可能不会返回结果,即使$ var1和$ var2包含有效的搜索词。错误在于不正确包含%符号。通过将变量包含在$ params数组中的%符号中,您确保将%字符正确替换到查询中。没有此修改,PDO...
    编程 发布于2025-07-01
  • 为什么不使用CSS`content'属性显示图像?
    为什么不使用CSS`content'属性显示图像?
    在Firefox extemers属性为某些图像很大,&& && && &&华倍华倍[华氏华倍华氏度]很少见,却是某些浏览属性很少,尤其是特定于Firefox的某些浏览器未能在使用内容属性引用时未能显示图像的情况。这可以在提供的CSS类中看到:。googlepic { 内容:url(&#...
    编程 发布于2025-07-01
  • 为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    为什么不````''{margin:0; }`始终删除CSS中的最高边距?
    在CSS 问题:不正确的代码: 全球范围将所有余量重置为零,如提供的代码所建议的,可能会导致意外的副作用。解决特定的保证金问题是更建议的。 例如,在提供的示例中,将以下代码添加到CSS中,将解决余量问题: body H1 { 保证金顶:-40px; } 此方法更精确,避免了由全局保证金重置引...
    编程 发布于2025-07-01
  • 在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在程序退出之前,我需要在C ++中明确删除堆的堆分配吗?
    在C中的显式删除 在C中的动态内存分配时,开发人员通常会想知道是否需要手动调用“ delete”操作员在heap-exprogal exit exit上。本文深入研究了这个主题。 在C主函数中,使用了动态分配变量(HEAP内存)的指针。当应用程序退出时,此内存是否会自动发布?通常,是。但是,即使在这...
    编程 发布于2025-07-01
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-07-01

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3