记C#优化接口速度过程

news2024/11/28 6:53:39

请添加图片描述

前提摘要

首先这个项目是接手的前一任先写的项目,接手后,要求对项目一些速度相对较慢的接口进行优化,到第一个速度比较慢的接口后,发现单接口耗时4-8秒,是的,请求同一个接口,在参数不变的情况下,会出现浮动的时长,这种,之前我在其他项目里面也遇到过,第一种是因为有其他用户在操作其他比较卡的接口时,或者导出报表时,造成接口卡顿的拥堵,这种情况没有办法去排查,只能一一把接口优化好,速度才能提上来**,第二种想到的是检测服务,如果服务跑的时候间隔时间较短**,然后又有大量的查询之类的,可能也会造成整体性能的低下,这种可以排查,检查服务确实有一分钟跑一次的服务,但是,查询不大,按理来说,应该痛点不是在这里
随后对该接口进行优化,首先是对数据库查询类的代码进行优化,将查询语句一一挑出来,之后再放到数据库中去排查查询速度比较慢的查询,但是未发现查询比较慢的查询,于是就只能先把缺掉的索引先补上,在检查数据库查询类的代码的时候,发现这个接口存在多次连接数据库查询数据,大概有20-30次,很明显是个隐患,这个地方肯定会有拖累速度,考虑到重写的话,首先是不熟悉业务流程,第二是可能需要花费大量时间,所以还是争取在不改变原来的逻辑下,去给接口进行优化,所以查询多次的问题就先放一放了,随后我给重点查询的地方添加上了计时,想通过此方法来找出耗时比较明显的查询再针对性的去进行优化

Stopwatch watch = new Stopwatch();
watch.Start();
//代码
watch.Stop();
//获取检测时长1
watch.ElapsedMilliseconds
watch.Start();
//代码
watch.Stop();
//获取检测时长2
watch.ElapsedMilliseconds

通过Stopwatch很快就发现
日志记录
整个检测时间下来,整个接口跑完,都不到200ms,我觉得很奇怪,既然接口整体完成速度不到200ms,为何返回给postman的速度达到了惊人的几秒钟,此时我怀疑Stopwatch不准确,于是在代码开始前和开始后都加上了datetime.now,但是显示时间也很短
猜测1:计时不准
猜测2:返回json给前端的时候,时间耗费了很长
猜测1没有办法求证,猜测2其实做了那么多项目,其实也没有遇到,而且感觉这个接口返回的json也没有那么离谱,随后就只能抱着试一试的态度,设定了以下几组返回的json,以及他们最终测试的结果
第一种 返回原来的json 结果:几秒
第二种 返回一个字符串 结果:100-200毫秒
第三种 返回原来的json,但是减少一些很长的对象 结果:几秒
第四种 返回的对象再包一层 结果:几秒
第五种 不使用框架的json返回方法,自定义json返回方法 结果:几秒

很显然第二种的出现,让我认为json返回就是接口超时的最大原因,这里我只能去猜测
第一种 这里我只能去猜测是不是服务器的内存不够,造成的返回json时这么慢
第二种 会不会是c#识别到我没有用上面代码中的参数,所以它自己省略了上面一些代码的逻辑,直接就返回了字符串,但是日志记录到了每个节点的计时,而且这个结果跟一直计时的也对的上,那就只能往下求证

然后把返回的json最小化,这时候就用到了json压缩

后端代码
//data为需要转换的数据
public string GetJsonData<T>(T data)
{
    // 序列化数据为JSON
    string json = JsonConvert.SerializeObject(data);
    // 如果需要压缩
    using (var memoryStream = new MemoryStream())
    {
        using (var gzipStream = new GZipStream(memoryStream, CompressionMode.Compress))
        using (var streamWriter = new StreamWriter(gzipStream))
        {
            streamWriter.Write(json);
        }
        return Convert.ToBase64String(memoryStream.ToArray());
    }
}
vue
npm install pako
import pako from 'pako'
// b64Data-->传入加密的数据进行解密
function unzip (b64Data) {
  let strData = atob(b64Data)
  // Convert binary string to character-number array
  const charData = strData.split('').map(function (x) { return x.charCodeAt(0) })
  // Turn number array into byte-array
  const binData = new Uint8Array(charData)
  // // unzip
  const data = pako.inflate(binData)
  // Convert gunzipped byteArray back to ascii string:
  strData = String.fromCharCode.apply(null, new Uint16Array(data))
  return strData
}

// 加密
function zip (str) {
  if (typeof str !== 'string') {
    str = JSON.stringify(str)
  }
  const binaryString = pako.gzip(str, { to: 'string' })
  return btoa(binaryString)
}

这种会中文乱码,需要改一下

let strData = atob(拿到的数据)
const charData = strData.split('').map(function (x) { return x.charCodeAt(0) })
const binData = new Uint8Array(charData)
strData = pako.inflate(binData,{to: 'string'})
//转换为json对象
ret.data = JSON.parse(strData);

这样整个压缩就结束了,3.2k的字符大概能压到2.几K,三分之一吧,至于查询速度,丝毫没有减少,那只能再看看,能不能继续减少json中的字符,如果这条路行不通的话
1.后面可能会把查询修改为存储过程
2.重构数据结构,优化查询频率之类的

整个过程下来,其实测试站速度很快,慢的也就是正式站,但是两个服务器的配置不同,这个没法横向比较,测试站数据量也没有正式站多,而且测试站的服务应该不是一直在跑的

破案了

破案了,是上一任小伙伴把一个实体的扩展方法内,返回字段的时候,做了很慢的查询,之前没发现是因为,之前只是查询了这张表,但是没有用这个字段,但是在返回json的时候,返回的是整个实体,导致它会去拿所有的字段,包括扩展类中的那个很慢查询的字段,所以,会导致看起来好像是json返回很慢的感觉,也算是个坑吧

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

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

相关文章

【Linux】运维-Kubernetes(k8s)应用介绍及使用-了解

一、介绍 Kubernetes&#xff0c;也被称为K8s或Kube&#xff0c;是谷歌推出的业界最受欢迎的容器编排器。 K8s是一个架构良好的分布式系统的例子。它将集群中的所有机器都视为单个资源池的一部分。 K8s与其他成熟的分布式系统一样&#xff0c;有两层&#xff1a;头节点和工作节…

defer关键字

【1】defer关键字的作用&#xff1a; 在函数中&#xff0c;程序员经常需要创建资源&#xff0c;为了在函数执行完毕后&#xff0c;及时的释放资源&#xff0c;Go的设计者提供defer关键字 【2】案例展示&#xff1a; 【3】代码变动一下&#xff0c;再次看结果&#xff1a; 发…

Vue3【十九】自定义Hooks钩子 将数据和方法分组

Vue3【十九】自定义Hooks钩子 将数据和方法分组 Vue3【十九】自定义Hooks钩子 将数据和方法分组 每个分组都可以放置 各种生命周期钩子 分组和可以使用计算属性等 案例截图 目录结构 代码 person.vue <template><div class"person"><h2>Vue3自定…

Ecovadis认证准则

Ecovadis准则是一个国际性的企业社会责任(CSR)评估平台&#xff0c;旨在帮助企业、投资者、供应商和利益相关者等评估和管理其全球供应链的社会和环境影响。该准则涵盖了可持续性、人权、劳工权利、环境保护等方面的评估内容&#xff0c;为企业提供了全面的评估标准和管理工具&…

轻松连接远程服务器SecureCRT for Mac/Windows

SecureCRT是一款功能强大的终端仿真器和文件传输工具&#xff0c;专为网络管理员、开发人员和系统工程师设计。它支持SSH、Telnet、RDP和串口等多种协议&#xff0c;提供安全、高效的远程访问和管理体验。SecureCRT具有多窗口/多标签管理、自定义终端仿真、颜色方案优化等高级功…

GStreamer安装——Android

Android安装 支持所有从2.3.1Gingerbread开始的版本 先决条件 开发机器是您开发Android应用程序的地方&#xff0c;然后您将其部署在目标机器上&#xff0c;目标机器显然应该是Android设备。 开发机器可以是Linux、Mac OS X或Windows&#xff0c;并且需要安装&#xff1a; 最…

【机器学习】常用的分类算法代码实现

文章目录 任务&数据集一、基算法1.1 决策树&#xff08;Decision Tree&#xff09;1.2 逻辑回归&#xff08;Logistic Regression&#xff09;1.3 支持向量机&#xff08;Support Vector Machine, SVM&#xff09; 二、集成算法2.1 随机森林&#xff08;Random Forest&…

哪个牌子洗地机最好?四款甄选佳品安利,质量放心

作为一个熟悉智能清洁家电的行业者&#xff0c;洗地机可谓是实用性最高的地面清洁工具&#xff0c;这个实用性一方面是清洁力强&#xff0c;它集合了扫地和拖地能力&#xff0c;另一方面是操作方便&#xff0c;清洁速度快。可是面对市面上种类繁多的智能清洁家电&#xff0c;往…

【Python】已完美解决:(Python键盘中断报错问题) KeyboardInterrupt

文章目录 一、问题背景二、可能出错的原因三、错误代码示例四、正确代码示例&#xff08;结合实战场景&#xff09;五、注意事项 已解决&#xff1a;Python中处理KeyboardInterrupt&#xff08;键盘中断&#xff09;报错问题 一、问题背景 在Python编程中&#xff0c;当我们运…

晨持绪科技:抖音网店怎么做有前景

在数字时代的浪潮中&#xff0c;抖音平台以其独特的魅力和庞大的用户基础成为电商的新阵地。开设一家有前景的抖音网店&#xff0c;不仅需要对市场脉搏有敏锐的洞察力&#xff0c;还需融合创新思维与数据驱动的营销策略。 明确定位是成功的先声。深入分析目标消费群体的需求与偏…

SpringCash

文章目录 简介引入依赖常用注解application.yml使用1. 启动类添加注解使用方法上添加注解 简介 Spring Cache是一个框架&#xff0c;实现了基于注解的缓存功能底层可以使用EHCache、Caffeine、Redis实现缓存。 注解一般放在Controller的方法上&#xff0c;CachePut 注解一般有…

【Java面试】十九、并发篇(下):线程池

文章目录 1、为什么要使用线程池2、线程池的执行原理2.1 七个核心参数2.2 线程池的执行原理 3、线程池用到的常见的阻塞队列有哪些4、如何确定核心线程数开多少个&#xff1f;5、线程池的种类有哪些&#xff1f;6、为什么不建议用Executors封装好的静态方法创建线程池7、线程池…

虚拟化 之七 详解构造带有 jailhouse 的 openEuler 系统

构造一个默认带有 jailhouse 的 openEuler 系统实际上就是创建一个包含 jailhouse 软件包的 openEuler 发行版,创建的过程在 x86 和 嵌入式平台差距很大,因此,本文我们分别进行详细介绍。 x86_64 平台 对于 x86_64 平台,如果手动从头创建(参考 Linux From Scratch)一个自…

Kubernetes 集群架构

etcd 集群状态存储&#xff1a;etcd 存储所有 Kubernetes 对象的状态&#xff0c;例如部署、pod、服务、配置映射和机密。配置管理&#xff1a;集群配置的更改存储在 etcd 中&#xff0c;允许 Kubernetes 管理和维护集群的所需状态。 注意&#xff1a;etcd 可能位于 kube-syst…

【ARM Cache 与 MMU/MPU 系列文章 2.1 -- 什么是 Cache PoP 及 PoDP ?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 PoP 及 PoDPCache PoDPCache PoP应用和影响PoP 及 PoDP Cache PoDP 点对深度持久性(Point of Deep Persistence, PoDP)是内存系统中的一个点,在该点达到的任何写操作即使在系统供电…

git下载项目登录账号或密码填写错误不弹出登录框

错误描述 登录账号或密码填写错误不弹出登录框 二、解决办法 控制面板\用户帐户\凭据管理器 找到对应的登录地址进行更新或者删除 再次拉取或者更新就会提示输入登录信息

Linux服务器安装Jupyter,并设置公网访问详细教程

本章教程,主要介绍如何在Linux服务器上安装jupyter,并可以通过公网地址进行访问。 一、安装jupyter pip install jupyter二、生成jupyter配置文件 jupyter notebook --generate-config三、编辑这个配置文件 找到配置文件并修改以下配置项: # 允许所有 IP 地址访问 c.Noteb…

nodejs湖北省智慧乡村旅游平台-计算机毕业设计源码 00232

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;旅游行业当然也不能排除在外。智慧乡村旅游平台是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采…

【ai】blender4.1 安装插件

开源软件,所以资料充足插件及配置 下载插件插件是python开发的 编辑中的偏好设置 点击选中 点击一键切换中文英文 切换主题 插件源码