Android启动优化指南
文章目录
- 前言
- 一、启动分类与优化目标
- 1、冷启动
- 1.1 优化思路
- 1.2 延迟初始化与按需加载
- 1.3 并行加载与异步执行
- 1.4 资源优化与懒加载
- 1.5 内存优化与垃圾回收控制
- 2. 温启动
- 2.1 优化应用的生命周期管理
- 2.2 数据缓存与懒加载
- 2.3 延迟渲染与视图优化
- 3. 热启动
- 3.1 保持应用的状态
- 3.2 优化 UI 渲染
- 二、如何查看启动指标
- 查看冷启动指标
- 查看温启动指标
- 查看热启动指标
- 通过 Logcat 辅助分析
前言
应用启动时间是用户体验的重要指标,特别是首次启动时,优化可以显著提高用户对产品的满意度。以下是优化 Android 应用启动时间的常用策略:
一、启动分类与优化目标
1、冷启动
定义:
应用被完全杀死后再次启动。此时需要重新加载应用所有资源和界面,耗时最长。
典型场景:
用户首次启动应用,或应用被系统回收后重新打开。
启动流程:
冷启动时的基本流程如下:
1、启动应用进程:操作系统为应用创建一个新的进程。
2、初始化 Application 类:应用的 Application 类会被初始化,这是整个应用的入口点。
3、加载 ContentProvider:如果应用中使用了 ContentProvider,这些组件会在启动时被初始化。
4、加载资源:应用的布局、图片、字符串等资源需要被加载到内存。
5、启动 Activity:应用的第一个界面(通常是 MainActivity)会被创建并展示给用户。
1.1 优化思路
仅仅提供思路,需要具体情况具体分析
优化冷启动的关键在于减少上述步骤中不必要的操作,将耗时的操作分散到启动后的阶段,或者采用懒加载技术延迟初始化。
1.2 延迟初始化与按需加载
冷启动时,如果在主线程中执行长时间的操作(如数据库初始化、网络请求、广告资源加载等),会导致启动时间大幅延长。因此,推迟不必要的操作直到真正需要时再执行,是优化的核心。
方案:
按需加载:非核心资源(如广告、第三方 SDK、数据库等)应使用延迟加载策略,避免阻塞应用启动。
协程与异步操作:通过使用协程在后台线程执行非紧急任务,如加载图片、初始化数据库等,确保主线程的流畅性。
class MyApplication : Application() {override fun onCreate() {super.onCreate()// 异步初始化数据库CoroutineScope(Dispatchers.IO).launch {initializeDatabase()}// 延迟加载第三方 SDKCoroutineScope(Dispatchers.IO).launch {loadThirdPartySDK()}}private suspend fun initializeDatabase() {// 模拟数据库初始化过程delay(800)Log.d("MyApplication", "Database Initialized")}private suspend fun loadThirdPartySDK() {// 模拟第三方 SDK 初始化delay(600)Log.d("MyApplication", "Third Party SDK Loaded")}
}
1.3 并行加载与异步执行
冷启动时,多个任务通常是独立的(如资源文件加载、用户数据加载、广告初始化等)。利用并行加载和异步执行策略,可以减少启动时间并避免串行执行的瓶颈。
方案:
并行任务调度:通过协程的 async 和 await,可以并行执行多个独立任务,避免串行等待。
轻量级线程管理:协程相较于传统线程消耗资源更少,能够在保证高效性的同时,不会产生过多的上下文切换开销。
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 启动并行加载任务GlobalScope.launch(Dispatchers.Main) {val networkData = async { fetchNetworkData() }val localData = async { loadLocalCacheData() }// 并行加载并返回数据val data1 = networkData.await()val data2 = localData.await()updateUI(data1, data2)}}private suspend fun fetchNetworkData(): String {delay(1000) // 模拟网络请求return "Network Data"}private suspend fun loadLocalCacheData(): String {delay(500) // 模拟本地缓存加载return "Local Data"}private fun updateUI(data1: String, data2: String) {Log.d("MainActivity", "Data loaded: $data1, $data2")}
}
1.4 资源优化与懒加载
冷启动过程中,应用可能需要加载大量的资源文件,尤其是图片、视频等大文件。这些资源的加载常常是冷启动过程中性能瓶颈的主要来源。通过资源优化和懒加载策略,可以减少启动过程中的 IO 操作和内存消耗。
方案:
图片资源优化:图片在加载时可以采用更高效的格式(如 WebP)和尺寸(如按需加载不同分辨率的图像),避免大图片文件的加载拖慢启动速度。
懒加载非核心资源:将非核心资源(如广告素材、非关键功能的资源)推迟加载,甚至使用占位图或低质量图像代替。
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 异步加载图片loadImageAsync()}private fun loadImageAsync() {// 使用协程加载图片GlobalScope.launch(Dispatchers.IO) {val image = loadImage()withContext(Dispatchers.Main) {// 将图片加载到 UIfindViewById<ImageView>(R.id.imageView).setImageBitmap(image)}}}private suspend fun loadImage(): Bitmap {delay(500) // 模拟图片加载return BitmapFactory.decodeResource(resources, R.drawable.sample_image)}
}
1.5 内存优化与垃圾回收控制
冷启动过程中,内存使用情况和垃圾回收(GC)的执行会对启动性能产生影响。如果应用在启动过程中频繁触发 GC,可能会导致性能显著下降。优化内存管理和减少 GC 的干扰,可以有效提升冷启动的性能。
方案:
内存池和对象复用:避免频繁创建大对象,利用对象池和缓存来复用内存中的对象。
优化 GC 频率:通过合理设计内存分配和回收策略,减少启动过程中不必要的垃圾回收操作。
2. 温启动
定义:
温启动(Warm Start)是指应用已经处于后台,但用户重新打开时的启动过程。与冷启动不同,温启动通常涉及到较少的资源加载,因为大部分数据和资源已被缓存,因此启动时间较短。
然而,即便如此,优化温启动依然是提升应用性能和用户体验的关键环节。优化温启动不仅可以减少启动时间,还能提升应用的响应速度和流畅性。
2.1 优化应用的生命周期管理
应用在后台运行时,可能会在某些情况下被系统回收或者资源被清理掉,这样当应用重新启动时就需要重新加载资源。因此,合理的生命周期管理对温启动性能至关重要。
方案:
- 避免不必要的资源释放:在应用切换到后台时,应避免释放过多的资源。尽量使用缓存机制保留必要的数据,避免重新加载。
- 利用 onPause() 和 onStop() 方法优化资源:确保在后台时清理无关的资源和任务,以便下次启动时不需要重新加载。
class MainActivity : AppCompatActivity() {override fun onPause() {super.onPause()// 暂停不重要的资源或任务,确保温启动时能快速恢复pauseResources()}override fun onStop() {super.onStop()// 清理不需要的资源releaseUnnecessaryResources()}private fun pauseResources() {// 暂停网络请求或其他耗时操作}private fun releaseUnnecessaryResources() {// 释放缓存或内存中的大对象}
}
2.2 数据缓存与懒加载
温启动中,数据已经在应用中缓存,但仍有一些资源可能需要重新加载。通过合理使用缓存机制,可以大大减少加载时间,并优化用户体验。
方案:
内存缓存:对于一些常用数据,可以使用内存缓存(如 LruCache)避免重复从网络或数据库中加载。
磁盘缓存:如果数据量较大或无法完全存放在内存中,可以利用磁盘缓存来存储数据。对于图片或较大的资源,可以使用 DiskLruCache 来缓存数据。
懒加载:非关键数据(如广告、推荐内容等)可以采用懒加载策略,避免在温启动时进行不必要的加载。
class MainActivity : AppCompatActivity() {private val memoryCache: LruCache<String, String> = LruCache(1024)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)// 通过缓存加载数据val cachedData = memoryCache.get("key") ?: loadDataFromDisk()displayData(cachedData)}private fun loadDataFromDisk(): String {// 从磁盘加载数据(示例)return "Cached Data"}private fun displayData(data: String) {// 显示数据Log.d("MainActivity", "Displaying data: $data")}
}
2.3 延迟渲染与视图优化
即使在温启动过程中,某些视图或组件的渲染也可能造成延迟,尤其是当布局复杂、图像过大时。通过优化视图的渲染过程,可以显著提升启动速度。
方案:
- 延迟渲染复杂视图:对于一些计算密集型的视图组件,可以延迟加载或使用占位符进行替代,直到应用界面完全展示。
- 避免复杂的布局嵌套:复杂的视图层次和布局渲染可能导致启动延迟,尽量使用简单、扁平的布局结构。
- RecyclerView 优化:对于列表类视图,使用 RecyclerView 并优化其适配器,以便快速加载大量数据。
class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val recyclerView: RecyclerView = findViewById(R.id.recyclerView)recyclerView.layoutManager = LinearLayoutManager(this)// 延迟加载 RecyclerView 的数据GlobalScope.launch(Dispatchers.Main) {val data = loadData()recyclerView.adapter = MyAdapter(data)}}private suspend fun loadData(): List<String> {delay(500) // 模拟加载数据return List(20) { "Item $it" }}
}
3. 热启动
定义:
热启动(Hot Start)指的是应用已经在内存中运行,用户通过点击图标或通过某些交互再次进入应用,通常情况下,热启动的性能要求非常高,因为应用状态已经存在于内存中,理想情况下启动应该是瞬时的。
典型场景:
用户快速切换应用后返回,应用无需重新初始化。
启动流程:
直接恢复到栈顶 Activity,无需任何创建操作。
3.1 保持应用的状态
在热启动过程中,保持应用状态和数据的一致性是非常重要的。合理管理和保存应用状态可以让用户在重新进入应用时,继续他们的上一个操作,而无需重新加载或重新计算数据。通过智能的状态管理,可以大幅度提高用户体验。
方案:
- 保存 Activity 状态:可以使用 onSaveInstanceState() 和 onRestoreInstanceState() 方法在活动(Activity)之间保存和恢复状态。这对于维持用户的当前视图和输入数据非常重要。
- 保持共享数据:使用 SharedPreferences、数据库、内存缓存等方式保存关键数据,避免重新加载数据或重新计算状态。
- Fragment 管理:对于复杂的界面,可以在 Fragment 中维护各自的状态,避免不必要的重建。
class MainActivity : AppCompatActivity() {override fun onSaveInstanceState(outState: Bundle) {super.onSaveInstanceState(outState)// 保存应用状态数据outState.putString("key", "some_data")}override fun onRestoreInstanceState(savedInstanceState: Bundle) {super.onRestoreInstanceState(savedInstanceState)// 恢复应用状态val restoredData = savedInstanceState.getString("key")Log.d("MainActivity", "Restored data: $restoredData")}
}
3.2 优化 UI 渲染
在热启动过程中,UI 渲染速度是影响用户体验的关键因素。如果应用的界面加载太慢,用户可能会感觉到卡顿或延迟。通过优化布局和渲染过程,可以显著提升热启动的性能。
方案:
避免复杂布局:减少布局层级和复杂的视图嵌套,尽量使用简单扁平化的布局结构。
使用 ConstraintLayout:相比于传统的 LinearLayout 或 RelativeLayout,ConstraintLayout 提供了更高效的布局性能,适合复杂的 UI 布局。
图片优化:图片加载过程是热启动中的常见瓶颈。通过使用图片压缩、合理的缓存策略和异步加载,可以大幅度提升 UI 渲染速度。
class MainActivity : AppCompatActivity() {override fun onStart() {super.onStart()// 图片优化示例:使用 Glide 加载图片Glide.with(this).load("image.jpg").into(findViewById(R.id.imageView))}
}
二、如何查看启动指标
查看冷启动指标
1、杀掉当前应用进程
2、使用 adb shell am start -W -n / 命令启动应用:
adb shell am start -W -n <package>/<activity>
是你应用的包名(例如 com.example.myapp)。
是应用的主界面或启动 Activity(例如 com.example.myapp.MainActivity)。
输出示例:
Starting: Intent { cmp=com.example.myapp/.MainActivity }
Total time: xxx ms (init + launch + resume)
Wait time: xxx ms
This time: xxx ms
Total time:从启动应用到应用准备好展示界面所花费的总时间。(括应用的初始化、界面加载、Activity 启动等操作的总时间。)
Wait time:等待启动的时间,通常是 Activity 被加载的时间,表示你点击应用图标到 Activity 启动过程中等待的时间。(是从按下应用图标到系统开始启动该应用所需的时间。)
This time:实际花费的时间,即冷启动时长。(表示冷启动过程中从系统启动到主界面完全加载出来所花费的时间。)
查看温启动指标
准备工作:
- 确保应用正在运行。
- 将应用退到后台(按 Home 键,应用状态变为 onPause() 和 onStop())。
执行命令:
adb shell am start -W -n <package>/<activity>
输出结果:
Starting: Intent { cmp=com.example.myapp/.MainActivity }
Total time: 234 ms
Wait time: 200 ms
This time: 34 ms
Total time:温启动的总时间,包括从后台唤醒进程和恢复 Activity 的时间。
Wait time:系统调度启动任务的时间。
This time:Activity 从后台恢复到前台的时间。
查看热启动指标
准备工作:
- 确保应用在前台运行。
执行命令:
adb shell am start -W -n <package>/<activity>
输出结果:
Starting: Intent { cmp=com.example.myapp/.MainActivity }
Total time: 234 ms
Wait time: 200 ms
This time: 34 ms
Total time:热启动的总时间,通常会非常短,因为应用已经在运行。
This time:从点击到完成界面刷新所花费的时间。
启动类型 | 特点 | 时间特点 |
---|---|---|
冷启动 | 应用完全退出或被清理,需要重新加载资源、启动进程和初始化。 | 时间最长(数百到上千ms) |
温启动 | 应用仍在后台保留进程,只需将其唤醒并恢复界面状态。 | 时间中等(几十到数百ms) |
热启动 | 应用已在前台运行,仅需重新渲染界面(无明显启动过程)。 | 时间最短(几十ms以内) |
通过 Logcat 辅助分析
你可以结合 Logcat 查看启动过程中的生命周期方法来确认启动类型:
- 冷启动:从 Application#onCreate() 开始。
- 温启动:从 Activity#onRestart() 或 Activity#onStart() 开始。
- 热启动:仅触发 Activity#onResume()。
如果从 Application#onCreate() 开始,说明是冷启动。
如果从 onRestart() 或 onStart() 开始,说明是温启动。
如果仅触发 onResume(),说明是热启动。
相关文章:
Android启动优化指南
文章目录 前言一、启动分类与优化目标1、冷启动1.1 优化思路1.2 延迟初始化与按需加载1.3 并行加载与异步执行1.4 资源优化与懒加载1.5 内存优化与垃圾回收控制 2. 温启动2.1 优化应用的生命周期管理2.2 数据缓存与懒加载2.3 延迟渲染与视图优化 3. 热启动3.1 保持应用的状态3.…...
每日一练 | 华为 eSight 创建的缺省角色
01 真题题目 下列选项中,不属于华为 eSight 创建的缺省角色的是: A. Administrator B. Monitor C. Operator D. End-User 02 真题答案 D 03 答案解析 华为 eSight 是一款综合性的网络管理平台,提供了多种管理和监控功能。 为了确保不同用…...
ubuntu 手动更换库文件解决nvcc -V和nvidia-smi不一致
NVML 库版本与驱动不匹配 问题现象问题排查限制解决禁止自动更新降低库版本 问题现象 笔主在训练之前想查看gpu占用情况,使用watch -n 1 nvidia-smi发现: 且在推理、训练时无法使用到显卡。 问题排查 cat /proc/driver/nvidia/version查看当前显卡驱…...
DataSophon集成CMAK KafkaManager
本次集成基于DDP1.2.1 集成CMAK-3.0.0.6 设计的json和tar包我放网盘了. 通过网盘分享的文件:DDP集成CMAK 链接: https://pan.baidu.com/s/1BR70Ajj9FxvjBlsOX4Ivhw?pwdcpmc 提取码: cpmc CMAK github上提供了zip压缩包.将压缩包解压之后 在根目录下加入启动脚本…...
2024-2025关于华为ICT大赛考试平台常见问题
一、考生考试流程 第一步:收到正式考试链接后点击考试链接并登录; 第二步:请仔细阅读诚信考试公约,阅读完成后勾选“我已阅读”,并点击确定; 第三步:上传身份证人像面进行考前校验࿰…...
Halcon中lines_gauss(Operator)算子原理及应用详解
在Halcon图像处理库中,lines_gauss算子是一个用于检测图像中线条的强大工具,它能够提供亚像素精度的线条轮廓。以下是对lines_gauss (ImageReducedTracks, Lines, 1.5, 1, 8, ‘light’, ‘true’, ‘bar-shaped’, ‘true’)算子的详细解释:…...
Flink集群搭建整合Yarn运行
Flink 集群 1. 服务器规划 服务器h1、h4、h5 2. StandAlone 模式(不推荐) 2.1 会话模式 在h1操作 #1、解压 tar -zxvf flink-1.19.1-bin-scala_2.12.tgz -C /app/#2、修改配置文件 cd /app/flink-1.19.1/conf vim conf.yaml ##内容:## j…...
FPGA工作原理、架构及底层资源
FPGA工作原理、架构及底层资源 文章目录 FPGA工作原理、架构及底层资源前言一、FPGA工作原理二、FPGA架构及底层资源 1.FPGA架构2.FPGA底层资源 2.1可编程输入/输出单元简称(IOB)2.2可配置逻辑块2.3丰富的布线资源2.4数字时钟管理模块(DCM)2.5嵌入式块 …...
Postman的使用
(一)创建Collections:Collections->New Collection->创建界面填入Collection名称,比如某个系统/模块名,描述里可以稍微更详细的介绍集合的信息 Collection创建时,还可以定义Authorization 如下&#…...
【报错】新建springboot项目时缺少resource
1.问题描述 在新建springboot项目时缺少resources,刚刚新建时的目录刚好就是去掉涂鸦的resources后的目录 2.解决方法 步骤如下:【文件】--【项目结构】--【模块】--【源】--在main文件夹右击选择新建文件夹并命名为resources--在test文件夹右击选择新建文件夹并命名…...
phpstudy访问本地localhost无目录解决办法
phpstudy访问本地localhost无目录解决办法 错误: 直接访问本地http://localhost/,出现hello word,或者直接报错,无法出现本地目录 解决办法: 对于Phpstudy-2018版本来说: 找到这里的Phpstudy设置 2. 打…...
架构16-向微服务迈进
零、文章目录 架构16-向微服务迈进 1、向微服务迈进 (1)软件开发中的“银弹”概念 **背景:**软件开发过程中常常出现工期延误、预算超支、产品质量低劣等问题,这使得管理者、程序员和用户都渴望找到一种能够显著降低成本的“银…...
基于Springboot汽车资讯网站【附源码】
基于Springboot汽车资讯网站 效果如下: 系统主页面 汽车信息页面 系统登陆页面 汽车信息推荐页面 经销商页面 留言反馈页面 用户管理页面 汽车信息页面 研究背景 随着信息技术的快速发展和互联网的普及,互联网已成为人们查找信息的重要场所。汽车资讯…...
Tomcat项目本地部署
今天分享一下如何在本地,不依赖于idea部署聚合项目,以我做过的哈米音乐项目为例,项目结构如下: ham-core模块为公共模块,我们只需将另外三个模块:前台、后台、文件服务器打包,将打好的jar、war包…...
【OpenCV】直方图
理论 可以将直方图视为图形或曲线图,从而使您对图像的强度分布有一个整体的了解。它是在X轴上具有像素值(不总是从0到255的范围),在Y轴上具有图像中相应像素数的图。 这只是理解图像的另一种方式。通过查看图像的直方图,您可以直观地了解该…...
pika:适用于大数据量持久化的类redis组件|jedis集成pika(二)
文章目录 0. 引言1. pika客户端支持2. jedis集成pika3. pika性能测试 0. 引言 上节我们讲解了pika的搭建,这节我们来看下如何在java项目中利用jedis集成pika 1. pika客户端支持 pika支持的客户端与redis完全一致,所以理论上redis支持的客户端pika也都…...
Linux 进程间通信
Linux进程间通信 进程间通信(IPC,Inter-Process Communication)在 Linux 下常用的方法包括: 1)管道(Pipe) 2)有名管道(FIFO) 3)消息队列&#x…...
【C++】快速排序详解与优化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯快速排序的核心思想1. 算法原理2. 算法复杂度分析时间复杂度空间复杂度 💯快速排序的代码实现与解析代码实现代码解析1. 递归终止条件2. 动态分配子数组3. 分区…...
【JAVA高级篇教学】第二篇:使用 Redisson 实现高效限流机制
在高并发系统中,限流是一项非常重要的技术手段,用于保护后端服务,防止因流量过大导致系统崩溃。本文将详细介绍如何使用 Redisson 提供的 RRateLimiter 实现分布式限流,以及其原理、使用场景和完整代码示例。 目录 一、什么是限流…...
NanoLog起步笔记-1
nonolog起步笔记-1 背景与上下文写在前面Nanolog与一般的实时log的异同现代log的一般特性Nanolog的选择 背景与上下文 因为工作中用到了NanoLog。有必要研究一下。 前段时间研究了许多内容,以为写了比较详实的笔记,今天找了找,不仅笔记没找到…...
vs打开unity项目 新建文件后无法自动补全
问题 第一次双击c#文件自动打开vs编辑器的时候能自动补全,再一次在unity中新建c#文件后双击打开发现vs不能自动补全了。每次都要重新打开vs编辑器才能自动补全,导致效率很低,后面发现是没有安装扩展,注意扩展和工具的区别。 解决…...
HDFS的Federation机制的实现原理和Erasure Coding节省存储空间的原理
目录 Federation机制的实现原理1.HDFS的分层图解(1)NameSpace(2)Block Storage1)Block Management2)Storage 2.Federation机制的优点3.Federation机制的缺点4.Federation机制的实现(1࿰…...
经验笔记:使用 PyTorch 计算多分类问题中Dice Loss 的正确方法
经验笔记:使用 PyTorch 计算多分类问题中Dice Loss 的正确方法 概述 Dice Loss 是一种广泛应用于图像分割任务中的损失函数,它基于 Dice 系数(也称为 F1-score),用于衡量预测结果与真实标签之间的相似度。在 PyTorch…...
如何在 Ubuntu 22.04 上安装 PostgreSQL
简介 PostgreSQL(或简称Postgres)是一个关系型数据库管理系统,它提供了SQL查询语言的实现。它符合标准,并且拥有许多高级特性,比如可靠的事务处理和无需读锁的并发控制。 本指南将展示如何在Ubuntu 22.04服务器上快速…...
正则表达式的高级方法
正则表达式的高级方法 正则表达式(regex)不仅仅是简单的模式匹配工具,它还提供了一系列高级功能,使得处理复杂文本任务变得更加灵活和强大。以下是一些Python中正则表达式的高级用法: 1. 命名捕获组 命名捕获组允许…...
axios的get和post请求,关于携带参数相关的讲解一下
在使用 Axios 发送 HTTP 请求时,GET 和 POST 请求携带参数的方式有所不同。以下是关于这两种请求方法携带参数的详细讲解: GET 请求携带参数 对于 GET 请求,参数通常附加在 URL 之后,以查询字符串的形式传递。 直接在 URL 中拼接…...
中间件--MongoDB部署及初始化js脚本(docker部署,docker-entrypoint-initdb.d,数据迁移,自动化部署)
一、概述 MongoDB是一种常见的Nosql数据库(非关系型数据库),以文档(Document)的形式存储数据。是非关系型数据库中最像关系型数据库的一种。本篇主要介绍下部署和数据迁移。 在 MongoDB 官方镜像部署介绍中ÿ…...
基于SpringBoot框架的民宿连锁店业务系统(计算机毕业设计)+万字说明文档
系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 IDE环境: Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境: Tomcat 7.x,8.x,9.x版本均可 操作系统…...
PHP8 动态属性被弃用兼容方案
PHP 类中可以动态设置和获取没有声明过的类属性。这些属性不遵循具体的规则,并且需要使用 __get() 和 __set() 魔术方法对动态属性如何读写进行有效控制。 class User {private int $uid; }$user new User(); $user->name Foo; 上述代码中,User 类…...
Spring Boot 3.0 + MySQL 8.0 + kkFileView 实现完整文件服务
Spring Boot 3.0 MySQL 8.0 kkFileView 实现完整文件服务 背景:比较常见的需求,做成公共的服务,后期维护比较简单,可扩展多个存储介质,上传逻辑简单,上传后提供一个文件id,后期可直接通过此i…...
【YashanDB知识库】php查询超过256长度字符串,数据被截断的问题
本文内容来自YashanDB官网,原文内容请见:https://www.yashandb.com/newsinfo/7488290.html?templateId1718516 问题现象 如下图,php使用odbc数据源,查询表数据,mysql可以显示出来,yashan显示数据被截断。…...
为什么ETH 3.0需要Lumoz的ZK算力网络?
1.Lumoz 模块化计算层 Lumoz 协议是一个全球分布式模块化计算协议,致力于提供先进的零知识证明(ZKP)服务,支持ZK技术的发展,为ZK、AI等前沿技术提供强大的算力支撑。面对当前零知识计算领域计算成本的挑战,…...
反向代理-缓存篇
文章目录 强缓存一、Expires(http1.0 规范)二、cache-control(http1.1 出现的 header 信息)Cache-Control 的常用选项Cache-Control 常用选项的选择三、弊端协商缓存一、ETag二、If-None-Match三、Last-modified四、If-Modified-Since浏览器的三种刷新方式静态资源部署策略…...
(重点来啦!)MySql基础增删查改操作(详细)
目录 一、客户端和数据库操作: 二、表操作 1.查看当前数据库中有哪些表 2.创建一张新表 3.查看表结构: 4.删除表 三、CRUD增删查改 1.新增——插入 2.查询操作 a.全列查询: b.指定列查询: c.列名为表达式的查询&#…...
WPF编写工业相机镜头选型程序
该程序满足面阵和线阵的要求。 前端代码 <Window x:Class"相机镜头选型.MainWindow" Loaded"Window_Loaded"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml…...
阿里云轻量应用服务器开放端口,图文教程分享
阿里云轻量应用服务器如何开放端口?在轻量服务器管理控制台的防火墙中添加规则即可开通端口,开通80端口就填80,开通443就填443端口,开通3306端口就填3306。阿里云百科网aliyunbaike.com整理阿里云轻量应用服务器端口号开通图文教程…...
分布式 CAP理论 总结
前言 相关系列 《分布式 & 目录》《分布式 & CAP理论 & 总结》《分布式 & CAP理论 & 问题》 分布式 分布式的核心是将大型业务拆解成多个子业务以使之在不同的机器上执行。分布式是用于解决单个物理机容量&性能瓶颈问题而采用的优化手段…...
【UNION 和 UNION ALL 】关键字在MySql中的用法,以及注意事项
在 MySQL 中,UNION 和 UNION ALL 都用于将多个 SELECT 语句的结果合并到一个结果集中。它们的主要区别在于 UNION 去除重复 的行UNION ALL 保留所有 的行 示例 …...
GauHuman阅读笔记【3D Human Modelling】
笔记目录 1. 基本信息2. 理解(个人初步理解,随时更改)3. 精读SummaryResearch Objective(s)Background / Problem StatementMethod(s)EvaluationConclusionReferences1. 基本信息 题目:GauHuman: Articulated Gaussian Splatting from Monocular Human Videos时间:2023.12…...
SkyWalking 和 ELK 链路追踪实战
一、背景 最近在给项目搭建日志平台的时候,采用的方案是 SkyWalking ELK 日志平台,但发现 ELK 日志平台中的日志没有 Trace ID,导致无法追踪代码报错的整体链路。 空哥提示:Trace ID 是分布式追踪中用来唯一标识一个服务请求或事…...
深度学习中的损失函数
损失函数是深度学习模型训练过程中不可或缺的一部分,是模型预测值与真实值之间差异的客观衡量标准。它们是模型训练的基础,指导算法调整模型参数,以最小化损失并提高预测准确性。它们衡量了模型预测值与真实值的吻合程度。通过最小化这种损失…...
android编译assets集成某文件太大更新导致git仓库变大
不知道大家有没有类似的困扰,你的工程assets文件过大,我曾经在某度车机地图团队工作过一段时间时候,每次发包会集成一个上百MB的文件。工作一段时间你的git仓库将会增加特别多。最后,你会发现你如果重新git clone这个仓库会非常大…...
技术支持人员发现跨域问题,该如何处理
跨域问题通常是由于浏览器的同源策略(Same-Origin Policy)引起的。简而言之,浏览器阻止了一个域上的网页访问另一个域的资源,目的是为了安全性。跨域问题通常发生在以下场景: 在一个网站的前端应用程序(如…...
有 SpringBoot 助力,广场舞团解锁花式舞步密码
3 系统分析 3.1 系统可行性分析 3.1.1 经济可行性 由于本系统是作为毕业设计系统,且系统本身存在一些技术层面的缺陷,并不能直接用于商业用途,只想要通过该系统的开发提高自身学术水平,不需要特定服务器等额外花费。所有创造及工作…...
【推荐算法】单目标精排模型——FiBiNET
key word: 学术论文 Motivation: 传统的Embedding&MLP算法是通过内积和Hadamard product实现特征交互的,这篇文章的作者提出了采用SENET实现动态学习特征的重要性;作者认为简单的内积和Hadamard product无法有效对稀疏特征进行特征交互&a…...
从零开始学TiDB(3)TiKV 持久化机制
如图,每个TiKV有两个rocksdb实例,rocksdbKV复制存储键值对,rocksdb raft负责存储复制的日志 。 每个region及其副本构成了raft group。这个OB的Zone其实有点类似,在OB中每个Unit及其副本构成了paxos组,在TiDB中叫raft…...
集合ArrayList
黑马程序员Java的个人笔记 BV17F411T7Ao p111~p115 目录 集合存储数据类型的特点 创建对象 ArrayList 成员方法 .add 增加元素 .remove 删除元素 .set 修改元素 .get 查询元素 .size 获取长度 基本数据类型对应的包装类 Character 练习 返回多个数据 集合存储…...
后端API接口设计标准(Java)
Controller 层(API接口) 无论是传统的三层架构还是现在的COLA架构,Controller 层依旧有一席之地,说明他的必要性;说它是配角是因为 Controller 层的代码一般是不负责具体的逻辑业务逻辑实现,但是它负责接收…...
Oracle Recovery Tools工具一键解决ORA-00376 ORA-01110故障(文件offline)---惜分飞
客户在win上面迁移数据文件,由于原库非归档,结果导致有两个文件scn不一致,无法打开库,结果他们选择offline文件,然后打开数据库 Wed Dec 04 14:06:04 2024 alter database open Errors in file d:\app\administrator\diag\rdbms\orcl\orcl\trace\orcl_ora_6056.trc: ORA-01113:…...
Python制做一个简易PDF编辑器——关于PDF文字编辑实现的思路
在Python零基础快速入门最后一篇,我们一起做了一个PDF编辑小工具,里面只实现的PDF翻页浏览等,并没有实现PDF的文字在线编辑,是因为在PDF编辑器中实现文字编辑功能是一个相对复杂的过程,因为PDF格式本质上是一个用于呈现…...