当前位置: 首页 > news >正文

实际项目角度优化App性能

         前言:前年替公司实现了一个在线检疫App,接下来一年时不时收到该App的需求功能迭代,部分线下问题跟进。随着新冠疫情防控政策放开,该项目也是下线了。

        从技术角度来看,有自己的独特技术处理特点。下面我想记录一下该App的性能优化点。

        项目结构简介

        整个项目由摄像头采集帧。交给算法(该算法是一个跑在linux上面的应用程序)对图像实现人脸识别,是否佩戴口罩,体温是否异常(红外线测温)。将识别后的帧与结果通过GRPC通信推送给App(针对这一系列需求展开)

 

         该APP主要涉及到的是毫秒级的图像帧,就之前打日志初步观察到1s大概能接收到算法推送10~15帧图像。优化也是围绕图像来处理。

         针对该流程的优化点:1:压缩图片大小提高图像下载速度,2:根据绘制Bitmap的SurfaceView的长宽对原图进行尺寸压缩,3:解码Bitmap格式采用RGB_565,4:Bitmap内存复用.

        关于如上第二点与第三点优化大致代码如下,值得一提的是采用尺寸压缩解码Bitmap还会减少解码时间10ms左右(对于毫秒级反复解码图像,效果提升是非常显著的)

另外对于毫秒级Bitmap反复创建,内存复用是必不可少的,它会让App避免内存抖动的情况(内存抖动时间长了还真会导致App卡顿,最后OOM崩溃了)。 

另功能点“温度图”,对于温度图,算法推送过来的是一个关于温度值的浮点数组。对于这类反复推送,我们任然还得需要内存复用,当初根据该需求写的一个数组缓存池:

/*** 温度图对应的数据缓存池* 内存复用 避免内存抖动*/
abstract class AllocAnyArrayPool<T>(cacheSize: Int = 4) {companion object {const val TAG = "TempDataPool"}private val arrayPool: LruCache<Int, SoftReference<T>> = LruCache(cacheSize)fun getAllocData(arraySize: Int): T = arrayPool.get(arraySize).let {if (it == null) {return@let createObjSpace(arraySize).apply {Timber.i("$TAG ==>from create")arrayPool.put(arraySize, SoftReference(this))}}return@let it.get().let { allocData ->if (allocData == null) {createObjSpace(arraySize).apply {Timber.i("$TAG==>from create")arrayPool.put(arraySize, SoftReference(this))}} else {Timber.i("$TAG==>from cache")allocData}}}protected abstract fun createObjSpace(arraySize: Int): T}

 主要记录这么多。当然该App的优化远不止这么多,比如场景抓拍图像压缩上传,人脸识别到人脸库获取信息涉及到本地数据库,减少访问网络次数提升获取数据效率等等

相关文章:

实际项目角度优化App性能

前言&#xff1a;前年替公司实现了一个在线检疫App&#xff0c;接下来一年时不时收到该App的需求功能迭代&#xff0c;部分线下问题跟进。随着新冠疫情防控政策放开&#xff0c;该项目也是下线了。 从技术角度来看&#xff0c;有自己的独特技术处理特点。下面我想记录一下该App…...

Structure|Alphafold2在肽结构预测任务上的基准实验

​题目&#xff1a;Benchmarking AlphaFold2 on peptide structureprediction 文献来源&#xff1a;2023, Structure 31, 1–9 代码&#xff1a;基准实验&#xff0c;比较了比较多的模型 1.背景介绍 由2-50个氨基酸构成的聚合物可以称为肽。但是关于肽和蛋白质之间的差异还是…...

Simple XML

简介 官网&#xff1a;https://simple.sourceforge.net/home.php Github&#xff1a;https://github.com/ngallagher/simplexml Simple 是用于 Java 的高性能 XML 序列化和配置框架。它的目标是提供一个 XML 框架&#xff0c;使 XML 配置和通信系统的快速开发成为可能。该框架…...

在代码质量和工作效率的矛盾间如何取舍?

这个问题的答案是&#xff0c;在很短的一段时期&#xff0c;编写高质量代码似乎会拖慢我们的进度。与按照头脑中首先闪现的念头编写代码相比&#xff0c;高质量的代码需要更多的思考和努力。但如果我们编写的不仅仅是运行一次就抛之脑后的小程序&#xff0c;而是更有实质性的软…...

rabbitMq安装(小短文)--未完成

rabbitMq是在activeMq的基础上创造的&#xff0c;有前者的功能&#xff0c;比前者强&#xff0c;属于后来居上。系统环境:windows10首先下载相关软件Erlang&#xff0c;因为他是这个语言写的。https://www.erlang.org/downloads然后安装&#xff0c;并且弄到环境变量里验证是否…...

Python调用MMDetection实现AI抠图去背景

这篇文章的内容是以 《使用MMDetection进行目标检测、实例和全景分割》 为基础&#xff0c;需要安装好 MMDetection 的运行环境&#xff0c;同时完成目标检测、实例分割和全景分割的功能实践&#xff0c;之后再看下面的内容。 想要实现AI抠图去背景的需求&#xff0c;我们需要…...

Java代码使用最小二乘法实现线性回归预测

最小二乘法简介最小二乘法是一种在误差估计、不确定度、系统辨识及预测、预报等数据处理诸多学科领域得到广泛应用的数学工具。它通过最小化误差&#xff08;真实目标对象与拟合目标对象的差&#xff09;的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数…...

linux-rockchip-音频相关

一、查看当前配置声卡状态 cat /proc/asound/cards二、查看当前声卡工作状态 声卡分两种通道&#xff0c;一种是Capture、一种是Playback。Capture是输入通道&#xff0c;Playback是输出通道。例如pcm0p属于声卡输出通道&#xff0c;pcm0c属于声卡输入通道。 ls /proc/asoun…...

Android Handler的内存抖动以及子线程创建Handler

一、介绍 Handler&#xff0c;作为一个在主线程存活的消息分发工具&#xff0c;在App开发过程使用频率很高&#xff0c;也是面试问的比较多的。 面试常见的比如&#xff1a;子线程如何创建&#xff1f;Handler的机制是什么&#xff1f;内存抖动等&#xff0c;接下来我们会针对H…...

机器学习算法原理之k近邻 / KNN

文章目录k近邻 / KNN主要思想模型要素距离度量分类决策规则kd树主要思想kd树的构建kd树的搜索总结归纳k近邻 / KNN 主要思想 假定给定一个训练数据集&#xff0c;其中实例标签已定&#xff0c;当输入新的实例时&#xff0c;可以根据其最近的 kkk 个训练实例的标签&#xff0c…...

【期末复习】例题说明Prim算法与Kruskal算法

点睛Prim与Kruskal算法是用来求图的最小生成树的算法。最小生成树有n个顶点&#xff0c;n-1条边&#xff0c;不能有回路。Prim算法Prim算法的特点是从个体到整体&#xff0c;随机选定一个顶点为起始点出发&#xff0c;然后找它的权值最小的边对应的另一个顶点&#xff0c;这两个…...

AtCoder Beginner Contest 290 A-E F只会n^2

ABC比较简单就不再复述 D - Marking 简要题意 &#xff1a;给你一个长度为nnn的数组,下标为0到n−10 到 n-10到n−1&#xff0c;最初指针位于0,重复执行n-1次操作&#xff0c;每次操作的定义为将当前指针加上ddd&#xff0c;如果该位置为空(未填数),否则我们向右找到第一个为空…...

springMvc源码解析

入口&#xff1a;找到springboot的自动配置&#xff0c;将DispatcherServlet和DispatcherServletRegistrationBean注入spring容器&#xff08;DispatcherServletRegistrationBean间接实现了ServletContextInitializer接口&#xff0c;最终ServletContextInitializer的onStartup…...

采用aar方式将react-native集成到已有安卓APP

关于react-native和android的开发环境搭建、环境变量配置等可以查看官方文档。 官方文档地址 文章中涉及的node、react等版本&#xff1a; node:v16.18.1 react:^18.1.0 react-native:^0.70.6 gradle:gradle-7.2开发工具&#xff1a;VSCode和android studio 关于react-native和…...

Tomcat目录介绍,结构目录有哪些?哪些常用?

bin 启动&#xff0c;关闭和其他脚本。这些 .sh文件&#xff08;对于Unix系统&#xff09;是这些.bat文件的功能副本&#xff08;对于Windows系统&#xff09;。由于Win32命令行缺少某些功能&#xff0c;因此此处包含一些其他文件。 比如说&#xff1a;windows下启动tomcat用的…...

Elasticsearch也能“分库分表“,rollover实现自动分索引

一、自动创建新索引的方法 MySQL的分库分表大家是非常熟悉的&#xff0c;在Elasticserach中有存在类似的场景需求。为了不让单个索引太过于庞大&#xff0c;从而引发性能变差等问题&#xff0c;我们常常有根据索引大小、时间等创建新索引的需求&#xff0c;解决方案一般有两个…...

6 大经典机器学习数据集,3w+ 用户票选得出,建议收藏

内容一览&#xff1a;本期汇总了超神经下载排名众多的 6 个数据集&#xff0c;涵盖图像识别、机器翻译、遥感影像等领域。这些数据集质量高、数据量大&#xff0c;经历人气认证值得收藏码住。 关键词&#xff1a;数据集 机器翻译 机器视觉 数据集是机器学习模型训练的基础&…...

Logview下载

Logview下载 之前一直用的NotePad 后来偶尔的看到作者有发布不当言论 就卸载了又去下载了NotePad– 但是&#xff0c;其实不管是 还是 – 打开大一些的文件都会卡死 所以就搜了这个logview 用起来还不错&#xff0c;目前我这再大的文件 这个软件都是秒打开 但是也会有一点点小…...

macos 下载 macOS 系统安装程序及安装U盘制作方法

01 下载 macOS 系统安装程序的方法 本文来自: https://discussionschinese.apple.com/docs/DOC-250004259 简介 Mac 用户时不时会需要下载 macOS 的安装程序&#xff0c;目的不同&#xff0c;或者升级或者降级&#xff0c;或者研究或者收藏。为了方便不同用户&#xff0c;除…...

c++动态内存分布以及和C语言的比较

文章目录 前言一.c/c内存分布 C语言的动态内存管理方式 C内存管理方式 operator new和operator delete函数 malloc/free和new/delete的区别 定位new 内存泄漏的危害总结前言 c是在c的基础上开发出来的&#xff0c;所以关于内存管理这一方面是兼容c的&…...

renderer数学库解析:3D图形学中的向量、矩阵与四元数

renderer数学库解析&#xff1a;3D图形学中的向量、矩阵与四元数 【免费下载链接】renderer A shader-based software renderer written from scratch in C89 项目地址: https://gitcode.com/gh_mirrors/re/renderer 想要从零开始构建一个完整的3D渲染器吗&#xff1f;r…...

Wan2.2-I2V-A14B惊艳效果:动态镜头推移、自然光影变化、流畅运镜展示

Wan2.2-I2V-A14B惊艳效果&#xff1a;动态镜头推移、自然光影变化、流畅运镜展示 1. 专业级视频生成能力 Wan2.2-I2V-A14B模型带来了令人惊叹的视频生成效果&#xff0c;能够将简单的文字描述转化为专业水准的动态视频。这个模型特别擅长处理复杂的镜头运动和光影变化&#x…...

Verilog实战:手把手教你实现8B/10B编码与解码(附完整代码)

Verilog实战&#xff1a;从零构建8B/10B编解码器的工程化实现 在高速串行通信领域&#xff0c;数据完整性如同精密钟表的齿轮咬合——任何微小的时序偏差都可能导致整个系统崩溃。8B/10B编码技术正是解决这一痛点的关键钥匙&#xff0c;它通过精心设计的编码规则&#xff0c;确…...

高压电源软启动:从浪涌抑制到系统可靠性的工程实践

1. 高压电源软启动的必要性 第一次见到整流二极管炸裂的场景&#xff0c;至今记忆犹新。那是在一个工业电源调试现场&#xff0c;工程师刚合上电闸就听到"啪"的一声脆响&#xff0c;随后便闻到焦糊味——价值数百元的整流模块瞬间报废。罪魁祸首就是电容滤波电路带来…...

Robin机器人感知系统与持续学习技术

“Robin 面对的是一个万物皆在变化的世界” 一套先进的感知系统能够检测并学习自身错误&#xff0c;使 Robin 机器人能够在生产规模下从杂乱的包裹堆中选取单个物品。 作者&#xff1a;Alan S. Brown 2022年4月18日 阅读时间&#xff1a;9分钟 相关内容 某机构的机器人手臂在安…...

触发器导致的DG库日志同步中断

触发器导致的DG库日志同步中断 第一次排查 问题复现 问题解决 第一次排查 主库服务器宕机重启后,到备库的日志传输中断,备库一直在等某个日志,主库上有这个日志文件,但是不会自动传输到备库上。 主库日志一直在刷ORA-16191和ORA-1017的报错: FAL[server, ARC0]: Error …...

别再只用Speedtest了!自建LibreSpeed测速站,监控家庭宽带/公司内网真实表现

自建网络测速站&#xff1a;用LibreSpeed打造精准带宽监控系统 每次看到运营商宣传的"千兆宽带"&#xff0c;你是否怀疑过实际使用中根本达不到承诺速度&#xff1f;公共测速网站的结果总让人将信将疑——它们可能被ISP特殊优化&#xff0c;或是受限于服务器位置。更…...

深度解析WaveTools:鸣潮游戏性能优化与数据分析的专业工具

深度解析WaveTools&#xff1a;鸣潮游戏性能优化与数据分析的专业工具 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools WaveTools作为一款专为《鸣潮》游戏设计的开源工具箱&#xff0c;通过帧率解锁、画质…...

快速原型利器:在快马平台一键对比不同AI模型的代码生成效果

最近在开发一个需要快速验证AI模型代码生成能力的项目时&#xff0c;发现手动切换不同模型测试效率太低。于是尝试用InsCode(快马)平台搭建了个模型对比工具&#xff0c;意外地好用&#xff0c;分享下具体实现思路和踩坑经验。 核心需求拆解 这个工具的核心目标是解决三个痛点&…...

从Hello-World到自定义镜像:在Ubuntu 20.04上玩转Docker镜像的完整工作流

从Hello-World到自定义镜像&#xff1a;在Ubuntu 20.04上玩转Docker镜像的完整工作流 当开发者第一次接触Docker时&#xff0c;往往会被其"一次构建&#xff0c;到处运行"的理念所吸引。但真正深入使用后才会发现&#xff0c;Docker的魅力远不止于此——它更像是一个…...