性能优化的核心思路

news2024/11/14 6:23:59

性能优化的本质是良好的用户体验和有限的资源之间的矛盾。

核心思路

【1】堆硬件 +优化软件(算法、步骤)

【2】开源(堆机器) + 节流(提高资源利用率,少占资源)

【3】输入、计算、输出

【4】权衡

核心思想

架构优化

架构=组件+交互。
架构可细分为:业务架构、应用架构、技术架构、代码架构、 部署架构。
架构原则:模块化、轻耦合、无共享架构;减少各个组件之前的依懒、注意服务之间依懒所有造成的链式失败及影响等。
DDD提供了在不同的特定领域上下文以及业务功能的基础上拆分组件的指导方法。
如果Redis等中间件在多个业务模块经常使用到且流量压力大,可以考虑单独抽出来做一个Redis服务模块。
高并发场景适当考虑使用全链路NIO异步响应式编程。SpringCloud Gateway、WebFlux、Dubbo、Nacos等。

化整为零

分布式 读写分离:①代理方式:myCat、Atlas;②应用内路由:主从、多数据源;③sharding-jdbc等。

化零为整

批量接口
Buffer

空间换时间(缓存、预写、预留空间、堆硬件)

缓存(浏览器缓存、CDN加速、内存缓存、CPU缓存…)
预写(将一些操作提前准备好) 预留空间(ArrayList 扩容 1.5 倍; HashMap 的扩容机制;Redis String 也会预留空间,避免频繁扩容)
堆硬件(通过添加更多机器,增加集群机器数量,抗更多流量)
提高配置(给更多内存、宽带等)
读写分离(写主读从;COW写时复制)

串行转并行

使用并行 API 将消息发到MQ中,负载均衡给多个消费者,增加消费能力

同步转异步

减少资源利用(压缩、合并、复用、减少输出、减少上下文切换、减少指令)

池化(线程池、连接池、对象池)
压缩、合并、复用、减少输出、减少上下文切换、减少指令

时空局部性

发挥各方面的优势(选择合理的数据结构、合理的中间件等)

比如开发时要用 Set 去重,而不是 List
比如 HashMap 冲突时拉链,链表大于 8个 转为红黑树
使用 Redis,如果适合用 Set 结构的就不要每次都拼接成 String 存储,每次取出来再切割再用。
比如 MySQL 的 InnoDB 选用 B+ 树,主要是层数低,这样IO次数就少,每个叶子节点构成链表,那么范围查找就比较容易。

根据技术特点进行优化(深翻页问题、属性转换问题)

深翻页问题,通过移动 where 条件来实现永远只查第一页,提高性能
手动写 get/set 转换方法或者使用基于字节码增强的属性转换工具,比基于反射的属性转换工具性能好

降低冲突(时间、空间)的范围

分段加锁
COW(Copy-On-Write)
乐观锁

反推产品来优化性能(加限制条件)

比如消息推送即使优化,千万的消息也得发3分钟,产品本来想要提前5分钟发到用户手中。是不是可以和产品商量提前10分钟发? 比如 ES深翻页有性能问题,是不是和产品商量下限制只能搜出2000条?

注意事项

  1. 避免过早优化

过早优化是万恶之源。

比如业务发展初期,最重要的是迎合市场,抢占市场份额,那么如果某个功能性能一般,但是不特别影响用户体验,也可以后面再优化。

2. 考虑投入产出比

如果一个功能投入很大,优化效果不好,那么是不是要三思而后行呢?

3. 考虑正确性

性能优化的同时一定要考虑正确性,如果优化之后连正确性都无法保证优化有啥意义呢?

性能优化要伴随着更多的测试来保证正确性。

4. 考虑稳定性

5. 考虑拓展性、可读性、考虑安全性

性能很好,但是可读性很差,可拓展性、安全性很差,那么就容易埋下很多隐患。

比如为什么外国人很少用 fastjson,其中一个重要原因是里面有很多硬编码的东西,而且总是爆出安全漏洞。

等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/400088.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谷粒学院开发(二):教师管理模块

前后端分离开发 前端 html, css, js, jq 主要作用:数据显示 ajax后端 controller service mapper 主要作用:返回数据或操作数据 接口 讲师管理模块(后端) 准备工作 创建数据库,创建讲师数据库表 CREATE TABLE edu…

git 当有人邀请你加入项目(gitee)

第一步,找到仓库地址 https://gitee.com/xxxxxxxxxxxxxxxx/abcd.git https://gitee.com/xxxxxxxxxxxxxxxx/abcd.git 2,打开git bush git clone https://gitee.com/xxxxxxxxxxxxxxxx/abcd.git 这条命令新建一个名为abcd(也就是项目目录结尾…

python操作频谱仪(是德科技N9030B)

由于工作需要,需要针对产品进行一些自动化的测试,其中就包含了验证开机启动或者长时间运行时候对射频、晶振频率等等一些列进行获取频率或者功率的偏差。这里就需要用到了频谱仪,可以使用脚本连接到频谱仪进行循环对数据的采集等等。直接开始…

Python中的property介绍

Python中的property介绍 Python中进行OOP(面向对象程序设计)时,获取、设置和删除对象属性( attribute)的时候,常常需要限制对象属性的设置和获取,比如设置为只读、设置取值范围限制等&#xff…

28个案例问题分析---06---没有复用思想的接口和sql--mybatis,spring

复用思维故事背景没有复用的接口没有复用思想的接口优化方案问题一优化获取所有的课程获取某个人创建的课程问题二优化升华故事背景 项目里有两处没有复用的思想的体现。在这里进行总结并且进行优化。以这种思维方式和习惯来指导我们进行开发工作。 没有复用的接口 通过查看代…

PowerShell远程代码执行漏洞(CVE-2022-41076)分析与复现

漏洞概述PowerShell(包括Windows PowerShell和PowerShell Core)是微软公司开发的任务自动化和配置管理程序,最初只是一个 Windows 组件,由命令行 shell 和相关的脚本语言组成。后于2016年8月18日开源并提供跨平台支持。PowerShell…

网络安全与信息安全的主要区别讲解-行云管家

生活中工作中,我们经常可以听到信息安全与网络安全这两个词语,但很多小伙伴对于两者区分不清楚,今天我们小编就给大家来简单讲解一下这两者的主要区别吧! 网络安全与信息安全的主要区别讲解 1、定义不同 网络安全是指网络系统的…

总结:Linux内核相关

一、介绍看eBPF和Cilium相关内容时,碰到Cilium是运行在第 3/4 层,不明白怎么做到的,思考原理的时候就想到了内容,本文记录下内核相关知识。https://www.oschina.net/p/cilium?hmsraladdin1e1二、Linux内核主要由哪几个部分组成Li…

前端——6.文本格式化标签和<div>和<span>标签

这篇文章,我们来讲一下HTML中的文本格式化标签 目录 1.文本格式化标签 1.1介绍 1.2代码演示 1.3小拓展 2.div和span标签 2.1介绍 2.2代码演示 2.3解释 3.小结 1.文本格式化标签 在网页中,有时需要为文字设置粗体、斜体和下划线等效果&#xf…

vuedraggable的使用

Draggable为基于Sortable.js的vue组件,用以实现拖拽功能。 特性 支持触摸设备 支持拖拽和选择文本 支持智能滚动 支持不同列表之间的拖拽 不以jQuery为基础 和视图模型同步刷新 和vue2的国度动画兼容 支持撤销操作 当需要完全控制时,可以抛出所有变化 可…

【国际化】vue2+uniapp实现国际化

文章目录前言一、什么是国际化?二、使用步骤1.创建locale文件夹2.创建国际化JSON文件3.引入国际化总结前言 国际化其实是拓展你的应用的受众人群的一种方式,有利于你的项目应用范围更广,uniapp和vue官方文档都有针对于国际化有专门的文档&am…

WIFI电子标签参数

一、4.2寸WIFI电子标签参数 型号 PW42R_V1 尺寸(mm) 104.95*95.93*15.2mm 显示技术 3色墨水屏显示技术 可视区域(mm) 84.6*63.4 分辨率(像素) 400*300 像素尺寸(mm) 0.212*0.212 单点颜色 黑/白/红 视角 180 工作温度 0 - 40℃ 重量 150g 电池 CR2477*6 …

Nginx同一端口部署多个前后端分离的vue项目

要用nginx容器部署多个前端项目可以采用监听端口,和基于location配置两种方法, 我的nginx是使用docker部署的,启动的时候没有开多余的端口,所以采用location配置 一个server下根据根路径不同分别代理访问不同项目。 下面操练起来&…

什么是响应式编程

简称RP(Reactive Programming) 定义一 响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。 变化传播:主动/自动将…

2023/03/09 - Vue学习笔记 - 【组件通信】 vuex的使用和讲解—$store

官网:https://vuex.vuejs.org/zh/ 1 Vuex存在的意义 概念:专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应用中多个组件的共享状态进行集中式的管理(读/写),也是…

Kafka入门(七)

下面聊聊Kafka的配置参数,包括生产者的配置参数、Broker的配置参数、消费者的配置参数。 1、生产者配置参数 acks 该参数控制了生产者的消息发送确认机制,用于指定分区中必须有多少个副本成功接收到消息后生产者才会认为这条消息写入是成功的&#xff0c…

问题解决:利用GeoFabrik下载OSM数据

问题描述由于OpenStreetMap数据常常是.osmnx格式,需要在Linix系统上进行格式转换,比较不方便。GeoFabrik 下载平台提供了一个很好的直接下载.shp数据格式的途径,链接如下:【无需梯子】Geofabrik Download Server具体下载方法以Nep…

QT-项目创建

项目创建 注意: 项目创建&#xff0c;名称和路径不能包含中文路径。 创建窗口三大基类 QWidhetQMainWindowQDialog 1.1 项目文件介绍 mian.cpp 介绍 #include "mywidget.h" #include <QApplication> // QApplication 应用程序类// 程序入口 命令行变量数量 …

Zabbix6.2利用模板和自定义监控项监控华为AR3260路由器

1&#xff1a;登录路由器的WEB管理控制台。在系统管理中找到SNMP然后开启SNMP代理&#xff0c;SNMP的版本可以只选择v2c都选择也无所谓&#xff0c;然后点击新建一个团体。 2&#xff1a;团体名称输入默认的public即可&#xff0c;在WEB端显示的是乱码&#xff0c;但是不影响使…

SQL执行过程详解

1 、用户在客户端执行 SQL 语句时&#xff0c;客户端把这条 SQL 语句发送给服务端&#xff0c;服务端的进程&#xff0c;会处理这条客户端的SQL语句。 2 、服务端进程收集到SQL信息后&#xff0c;会在进程全局区PGA 中分配所需内存&#xff0c;存储相关的登录信息等。 3 、客…