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

【无标题】I/O复用(epoll)三者区别▲

一、SOCKET-IO复用技术

定义:SOCKET - IO复用技术是一种高效处理多个套接字(socket)的手段,能让单个线程同时监听多个文件描述符(如套接字)上的I/O事件(像可读、可写、异常),进而提高程序的并发处理能力,避免为每个套接字创建一个线程或进程带来的资源开销(像一个管家)

是由函数select、poll和 Epoll 支持的

1.select、poll和 Epoll三者的区别:

select:轮回机制,存储容器数组,固定大小

poll:轮回机制,存储容器链表,动态扩展

epoll:事件驱动机制

2. 数据结构与扩展性

机制存储容器类型最大连接数限制动态扩展能力
select固定大小的位掩码数组通常为 1024(FD_SETSIZE)❌ 无法扩展
poll动态链表(struct pollfd)无硬性限制(取决于系统资源)✅ 动态添加
epoll内核红黑树 + 就绪链表无硬性限制(仅受内存约束)✅ 自动管理
  • select:使用固定大小的 fd_set(位掩码)存储文件描述符,需手动管理位操作,扩展性差。
  • poll:使用链表 struct pollfd 存储文件描述符,可动态添加,突破了 select 的限制。
  • epoll:使用内核红黑树高效管理所有待监控的文件描述符,自动扩容。

3. 工作机制

机制事件触发方式轮询方式性能特性
select水平触发(Level Triggered)遍历所有文件描述符O (n) 时间复杂度
poll水平触发遍历所有文件描述符O (n) 时间复杂度
epoll边缘触发(Edge Triggered)或水平触发仅遍历就绪链表O (1) 时间复杂度
  • 水平触发(LT):只要文件描述符就绪(如可读),就会持续通知。
  • 边缘触发(ET):仅在文件描述符状态变化(如从不可读到可读)时通知一次,需立即处理,否则数据可能丢失。

4. 性能对比

场景select/poll 表现epoll 表现
连接数少且活跃效率较高优势不明显
连接数多但不活跃性能急剧下降(轮询所有连接)性能稳定(仅处理就绪连接)
大量并发连接不适用(受 FD_SETSIZE 限制)非常高效

二、Epoll函数

基于以上三种方法对比,所以我们选用epoll进行使用较为合适

epoll两种模式的区别:

LT逻辑简单,但效率低,ET反之

核心数据结构是:1个红黑树和1个链表

1.创建

int epoll_create(int size);

参数size表明内核要监听的描述符数量。调用成功时返回一个epoll句柄描述符,失败时返回-1

2.注册要监听的事件类型

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

  • 参数:用于控制 epoll 实例对文件描述符的监听。
    • epfd是由epoll_create函数返回的 epoll 实例的文件描述符。
    • op参数指定操作类型,常见的值有EPOLL_CTL_ADD(将文件描述符fd添加到 epoll 实例的监听列表中)、EPOLL_CTL_MOD(修改文件描述符fd的监听事件)和EPOLL_CTL_DEL(从 epoll 实例的监听列表中删除文件描述符fd)。
    • fd是要进行操作的文件描述符。
    • event是一个指向struct epoll_event结构体的指针,用于指定要监听的事件类型以及关联的数据。
  • 返回值:成功时返回 0;失败时返回 -1,并设置errno以指示错误原因。

3.等待事件的就绪

int epoll_wait(int epfd, struct epoll_event * events, int maxevents, int timeout);

  • 功能:等待 epoll 实例所监听的文件描述符上有事件发生。
    • epfd是 epoll 实例的文件描述符。
    • events是一个struct epoll_event类型的数组,用于存储发生事件的文件描述符及其相关事件信息。
    • maxevents指定了events数组的大小,即最多能返回的事件数量。
    • timeout指定等待的超时时间,以毫秒为单位。如果设置为 -1,则表示无限期等待,直到有事件发生;如果设置为 0,则表示立即返回,不进行等待。
  • 返回值:成功时返回发生事件的文件描述符数量;如果超时则返回 0;失败时返回 -1,并设置errno以指示错误原因。
#include "epollServer.h"epollServer::epollServer(int port)
{this->server = new TCPServer(port);init_epoll();
}void epollServer::init_epoll()
{// 创建epollepoll_fd = epoll_create(10);if (epoll_fd < 0) {perror("epoll_create error");return;}// 添加epoll关注事件//struct epoll_event epoll_event;epoll_event.data.fd = this->server->getServerfd();epoll_event.events = EPOLLIN;epoll_ctl(epoll_fd, EPOLL_CTL_ADD, this->server->getServerfd(), &epoll_event);cout << "epoll初始化完成..." << endl;
}void epollServer::start()
{struct epoll_event event_array[10] = { 0 };int event_num = 0;this->thread_pool = new ThreadPool2(5);// 主循环while (1) {cout << "epoll wait..." << endl;event_num = epoll_wait(epoll_fd, event_array, 10, -1);// cout<<event_arrayif (event_num < 0) {perror("epoll_wait error");continue;}for (int i = 0; i < event_num; i++) {if (event_array[i].data.fd == this->server->getServerfd()) {//处理连接请求cout << "有新客户端连接请求" << endl;int client_fd = accept(this->server->getServerfd(), NULL, NULL);if (client_fd < 0) {continue;}// 将新的客户端连接添加到epoll关注列表epoll_event.data.fd = client_fd;epoll_event.events = EPOLLIN;epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_fd, &epoll_event);}else if (event_array[i].events & EPOLLIN) {//处理请求监听的事件}}}
}

相关文章:

【无标题】I/O复用(epoll)三者区别▲

一、SOCKET-IO复用技术 定义&#xff1a;SOCKET - IO复用技术是一种高效处理多个套接字&#xff08;socket&#xff09;的手段&#xff0c;能让单个线程同时监听多个文件描述符&#xff08;如套接字&#xff09;上的I/O事件&#xff08;像可读、可写、异常&#xff09;&#x…...

【数据结构】子串、前缀

子串 (Substring) 字符串中连续的一段字符序列&#xff0c;例如 "abc" 是 "abcd" 的子串。 特点&#xff1a;必须连续&#xff0c;顺序不可改变。 子序列 (Subsequence) 字符串中不连续但保持顺序的字符序列&#xff0c;例如 "acd" 是 "…...

[docker基础四]容器虚拟化基础之 LXC

目录 一 认识LXC 二 LXC容器操作实战 1&#xff09;实战目的 2&#xff09;基础知识 lxc-checkconfig lxc-create lxc-start lxc-ls lxc-info lxc-attach lxc-stop lxc-destory 3&#xff09;安装LXC(我的是Ubuntu) 4&#xff09;操作实战 1. 检查 lxc 是否运行…...

leetcode 2918. 数组的最小相等和 中等

给你两个由正整数和 0 组成的数组 nums1 和 nums2 。 你必须将两个数组中的 所有 0 替换为 严格 正整数&#xff0c;并且满足两个数组中所有元素的和 相等 。 返回 最小 相等和 &#xff0c;如果无法使两数组相等&#xff0c;则返回 -1 。 示例 1&#xff1a; 输入&#xf…...

RT-Thread 深入系列 Part 5:物联网与网络应用实战

摘要 本文聚焦 RT-Thread 在物联网场景下的网络应用实战,从网络协议栈集成到 MQTT/CoAP/HTTP 客户端实现,再到 mbedTLS 安全通信与 OTA 升级,最后以阿里云、腾讯云和 OneNet 平台对接为案例,完整呈现端到端的物联网解决方案落地过程。 目录 网络协议栈:LWIP 与网络设备 MQ…...

onGAU:简化的生成式 AI UI界面,一个非常简单的 AI 图像生成器 UI 界面,使用 Dear PyGui 和 Diffusers 构建。

​一、软件介绍 文末提供程序和源码下载 onGAU&#xff1a;简化的生成式 AI UI界面开源程序&#xff0c;一个非常简单的 AI 图像生成器 UI 界面&#xff0c;使用 Dear PyGui 和 Diffusers 构建。 二、Installation 安装 文末下载后解压缩 Run install.py with python to setup…...

Linux系统入门第十二章 --Shell编程之正则表达式

一、正则表达式 之前学习了 Shell 脚本的基础用法&#xff0c;已经可以利用条件判断、循环等语句编辑 Shell脚本。接下来我们将开始介绍一个很重要的概念-正则表达式(RegularExpression&#xff0c;RE) 1.正则表达式的定义 正则表达式又称正规表达式、常规表达式。在代码中常…...

Ubuntu22.04怎么退出Emergency Mode(紧急模式)

1.使用nano /etc/fstab命令进入fstab文件下&#xff1b; 2.将挂载项首行加#注释掉&#xff0c;修改完之后使用ctrlX退出; 3.重启即可退出紧急模式&#xff01;...

IC ATE集成电路测试学习——开尔文连接

首先&#xff0c;我们先了解一下ATE在测试时的PMU测量原理。 驱动线路和感知线路 为了提升 PMU 驱动电压的精确度&#xff0c;常使用 4 条线路的结构&#xff1a;两条驱动线路传输电流&#xff0c;另两条感知线路监测我们感兴趣的点&#xff08;通常是DUT&#xff09;的电压。…...

Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程

Ubuntu 与 Windows 双系统环境下 NTFS 分区挂载教程 摘要 本技术指南针对Ubuntu与Windows双系统用户&#xff0c;系统阐述NTFS分区挂载的技术原理与操作流程。通过规范的技术说明和专业的故障排除方案&#xff0c;帮助用户在异构操作系统环境下实现文件系统的无缝访问&#x…...

C++学习-入门到精通-【6】指针

C学习-入门到精通-【6】指针 指针 C学习-入门到精通-【6】指针一、指针的初始化二、指针运算符地址运算符&间接引用运算符* 三、使用指针的按引用传递方式四、内置数组标准库函数的begin和end内置数组的局限性 五、使用const修饰指针 一、指针的初始化 指针在声明或赋值时…...

数据集-目标检测系列- 冥想 检测数据集 close_eye>> DataBall

数据集-目标检测系列- 冥想 检测数据集 close * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gitcode: https://gitcode.com/DataBall/DataBall-detections-100s/overview 2&#xff09;数据集训练、推理相关项目&#xff1a;GitHub - XIAN-HHappy/ultralytics-yolo-…...

CoAP 协议介绍及应用场景

CoAP 协议&#xff0c;即受限应用协议&#xff08;Constrained Application Protocol&#xff09;&#xff0c;是专为资源受限的设备和网络设计的一种应用层协议 &#xff0c;旨在让小型、低功耗的设备能够接入物联网&#xff08;IoT&#xff09;&#xff0c;并以最小的资源与更…...

【并发编程】基于 Redis 手写分布式锁

目录 一、基于 Redis 演示超卖现象 1.1 Redis 超卖现象 1.2 超卖现象解决方案 二、Redis 的乐观锁机制 2.1 原生客户端演示 2.2 业务代码实现 三、单机部署 Redis 实现分布式锁 3.1 分布式锁的演变和升级 3.2 setnx 实现分布式锁 3.2.1 递归调用实现分布式锁 3.2.2 循…...

adb命令查询不到设备?

一、背景 -----以鸿蒙系统为例&#xff0c;其他系统类似--- 1、确保adb在电脑上成功安装 2 、连接手机 adb devices 列表中无显示设备 二、解决 1. 手机打开开发者模式 手机型号不同&#xff0c;所以选项不一样 2. 一般流程是&#xff1a;设置--搜索--“开发”--会出现开…...

JavaScript 数组去重:11 种方法对比与实战指南

文章目录 前言一、使用 Set 数据结构二、使用 filter indexOf三、使用 reduce 累加器四、双重 for 循环五、利用对象属性唯一性六、先排序后去重七、使用 Map 数据结构八、使用 includes 方法九、优化处理 NaN 的 filter 方法十、利用 findIndex十一.利用Set和展开运算符处理多…...

SlideLoss与FocalLoss在YOLOv8分类损失中的应用及性能分析

文章目录 一、引言二、YOLOv8 损失函数概述三、SlideLoss 详解&#xff08;一&#xff09;SlideLoss 的原理&#xff08;二&#xff09;SlideLoss 的代码实现 四、FocalLoss 分类损失函数详解&#xff08;一&#xff09;FocalLoss 的原理&#xff08;二&#xff09;FocalLoss 的…...

AI 驱动数据库交互技术路线详解:角色、提示词工程与输入输出分析

引言 在人工智能与数据库深度融合的趋势下&#xff0c;理解AI在数据库交互流程中的具体角色、提示词工程的运用以及各步骤的输入输出情况&#xff0c;对于把握这一先进技术路线至关重要。本文将对其展开详细剖析。 一、AI 在数据库交互流程中的角色 &#xff08;一&#xff0…...

Jmeter中的BeanShell如何使用?

在JMeter中&#xff0c;BeanShell 是一种基于Java语法的脚本工具&#xff0c;可以通过编写脚本实现动态逻辑处理、变量操作、条件判断等功能。以下是BeanShell的详细使用方法和常见场景示例&#xff1a; 1. BeanShell组件类型 JMeter提供多种BeanShell组件&#xff0c;根据场…...

JDBC工具类的三个版本

一、JDBC连接数据库的7个步骤 1、加载驱动 2、获取连接 3、编写sql 4、获取执行sql的stmt对象 有两种 stmt&#xff08;存在sql注入问题 字符串拼接&#xff09; pstmt&#xff08;预编译可以防止sql注入&#xff09; 5、执行sql 拿到结果集 6、遍历结果集 7、关闭资源…...

安达发|制药车间生产计划准备性的关键影响因素及优化策略研究

在高度规范的制药行业&#xff0c;生产计划的准备性直接影响企业的运营效率和合规水平。根据FDA统计&#xff0c;2024年因生产计划不当导致的药品短缺案例增加了23%&#xff0c;暴露出制药企业在生产计划管理方面的系统性挑战。本文将从设备、物料、人员、环境、法规五个维度&a…...

独立按键控制LED

目录 1.独立按键介绍 2.原理图 3.C51数据运输 解释&#xff1a;<< >> ​编辑 解释&#xff1a;& | 解释&#xff1a;^ ~ ​编辑 4.C51基本语句 5.按键的跳动 6.独立按键控制LED亮灭代码 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1…...

【Vue】vuex的getters mapState mapGetters mapMutations mapActions的使用

目录 一、getters 二、 mapState 三、 mapGetters 四、 mapMutations 五、 mapActions 学到这儿来个小总结&#xff1a;四个map方法的使用 总结不易~ 本章节对我有很大的收获&#xff0c; 希望对你也是&#xff01;&#xff01;&#xff01; 本节素材已上传至Gitee&…...

小程序初始化加载时间优化 步骤思考与总结

回想起来&#xff0c;正确的小程序初始加载时间优化步骤应该为&#xff1a; 一、梳理小程序初始化的步骤&#xff0c;以用户点击小程序为开始&#xff08;尽可能靠近&#xff09;&#xff0c;以页面渲染出来的时刻为结束—也就是用户感知到的时间。 二、页面渲染时&#xff0…...

前端弹性布局:用Flexbox构建现代网页的魔法指南

引言&#xff1a;布局的进化史 在网页设计的黑暗时代&#xff08;2010年前&#xff09;&#xff0c;开发者们用float、position和inline-block这些原始工具进行布局&#xff0c;就像用石器时代的工具建造摩天大楼。直到2012年W3C正式推出Flexbox规范&#xff0c;前端世界终于迎…...

Python基于Django的高校教室管理系统【附源码、文档说明】

博主介绍&#xff1a;✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&…...

【金仓数据库征文】_金仓数据库在金融行业的两地三中心容灾架构实践

金仓数据库在金融行业的两地三中心容灾架构实践 &#x1f31f;嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 引言 随着国家对信息技术应用创新&#xff0…...

利用多AI协作实现AI编辑器高效开发:创新架构与实践基本构想

在当今快速发展的科技领域&#xff0c;AI技术正以前所未有的速度重塑软件开发的流程和模式。传统的软件开发过程往往需要不同专业人员协同合作&#xff0c;从需求分析到产品设计&#xff0c;再到技术实现&#xff0c;每个环节都需要耗费大量的时间和人力。然而&#xff0c;随着…...

【字节拥抱开源】字节豆包团队开源首发 Seed-Coder 大模型

我们非常高兴地向大家介绍 Seed-Coder&#xff0c;它是一个功能强大、透明、参数高效的 8B 级开源代码模型系列&#xff0c;包括基础变体、指导变体和推理变体。Seed-Coder 通过以下亮点促进开放代码模型的发展。 以模型为中心&#xff1a;Seed-Coder主要利用大语言模型&#…...

C++GO语言微服务之gorm框架操作MySQL

目录 01 01-gorm介绍 02 02-MySQL操作回顾 03 03-gorm创建表 04 04-MySQL的init函数说明 05 05-gorm框架提供的MySQL连接池 06 06-gorm插入数据 07 07-gorm查询数据 08 08-gorm更新数据 09 09-gorm软删除-创建表 10 10-gorm软删除-实现 11 10-MySQL的8小时时区问题 …...

Webug4.0靶场通关笔记-靶场搭建方法(3种方法)

目录 一、虚拟机绿色版本 1. 开启phpstudy 2. 访问靶场 二、Docker版本 1.拉取镜像 2.启动镜像 三、源码安装版本 1. 搭建环境 &#xff08;1&#xff09;安装PHPStudy &#xff08;2&#xff09;WeBug4.0靶场源码 &#xff08;3&#xff09;安装Navicat &#xff…...

HTTP/3展望、我应该迁移到HTTP/2吗

1. HTTP/3展望 HTTP/3 基于 QUIC 协议&#xff0c;完全解决了“队头阻塞”问题&#xff0c;弱网环境下的表现会优于 HTTP/2&#xff1b;QUIC 是一个新的传输层协议&#xff0c;建立在 UDP 之上&#xff0c;实现了可靠传输&#xff1b;QUIC 内含了 TLS1.3&#xff0c;只能加密通…...

【Linux基础】系统监控和进程管理指令

目录 ps命令 top命令 kill命令 killall命令 1.1 命令介绍 1.2 命令格式 1.3 常用选项 1.4 示例 1.4.1 交互模式确认 1.4.2 指定信号 shutdown命令 ps命令 作用&#xff1a;查看当前进程信息。 常用选项&#xff1a; 作用 -e 显示所有进程&#xff0c;包括其他用户…...

【Linux实践系列】:进程间通信:万字详解共享内存实现通信

&#x1f525; 本文专栏&#xff1a;Linux Linux实践项目 &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 人生就像一场马拉松&#xff0c;重要的不是起点&#xff0c;而是坚持到终点的勇气 ★★★ 本文前置知识&#xff1a; …...

无法更新Google Chrome的解决问题

解决问题&#xff1a;原文链接&#xff1a;【百分百成功】Window 10 Google Chrome无法启动更新检查&#xff08;错误代码为1&#xff1a;0x80004005&#xff09; google谷歌chrome浏览器无法更新Chrome无法更新至最新版本&#xff1f; 下载了 就是更新Google Chrome了...

CenOS7切换使用界面

永久切换 在开始修改之前&#xff0c;我们首先需要查看当前的启动模式。可以通过以下命令来实现&#xff1a; systemctl get-default执行此命令后&#xff0c;系统会返回当前的默认启动模式&#xff0c;例如graphical.target表示当前默认启动为图形界面模式。 获取root权限&…...

# YOLOv3:深度学习中的目标检测利器

YOLOv3&#xff1a;深度学习中的目标检测利器 引言 在计算机视觉领域&#xff0c;目标检测是一项核心任务&#xff0c;它涉及到识别图像或视频中的物体&#xff0c;并确定它们的位置。随着深度学习技术的快速发展&#xff0c;目标检测算法也在不断进步。YOLO&#xff08;You …...

2025数维杯数学建模A题完整参考论文(共36页)(含模型、可运行代码、数据)

2025数维杯数学建模A题完整参考论文 目录 摘要 一、问题重述 二、问题分析 三、模型假设 四、符号定义与说明 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.2问题2模型…...

在 Flink + Kafka 实时数仓中,如何确保端到端的 Exactly-Once

在 Flink Kafka 构建实时数仓时&#xff0c;确保端到端的 Exactly-Once&#xff08;精确一次&#xff09; 需要从 数据消费&#xff08;Source&#xff09;、处理&#xff08;Processing&#xff09;、写入&#xff08;Sink&#xff09; 三个阶段协同设计&#xff0c;结合 Fli…...

Python数据分析

目录 一、数据分析的核心流程 &#xff08;一&#xff09;明确数据分析目标 &#xff08;二&#xff09;数据收集 &#xff08;三&#xff09;数据清洗 1. 处理缺失值 2. 去除重复值 3. 修正错误值和异常值 &#xff08;四&#xff09;数据探索与可视化 1. 计算描述性…...

Java单例模式总结

说明&#xff1a;单例模式的核心是确保一个类只有一个实例&#xff0c;并提供全局访问点。饿汉式和懒汉式是两种常见的实现方式 一、饿汉式和懒汉式 1. 饿汉式&#xff08;Eager Initialization&#xff09; public class EagerSingleton {// 类加载时直接初始化实例private…...

《P7167 [eJOI 2020] Fountain (Day1)》

题目描述 大家都知道喷泉吧&#xff1f;现在有一个喷泉由 N 个圆盘组成&#xff0c;从上到下以此编号为 1∼N&#xff0c;第 i 个喷泉的直径为 Di​&#xff0c;容量为 Ci​&#xff0c;当一个圆盘里的水大于了这个圆盘的容量&#xff0c;那么水就会溢出往下流&#xff0c;直到…...

Pycharm(二十)张量的运算与操作

一、张量的数据类型转换 1.演示data.type(trch.DoubleTensor) #1.创建张量对象 [6 6 6;6 6 6] datatorch.full([2,3],6) print(data.dtype)#默认为torch.int64(LongTensor) #2.转化为double类型 datadata.type(torch.DoubleTensor) print(data.dtype) #3.转换成int类型 datad…...

JVM之内存管理(二)

部分内容来源&#xff1a;JavaGuide二哥Java 说⼀下 JDK1.6、1.7、1.8 内存区域的变化&#xff1f; JDK1.6、1.7/1.8 内存区域发⽣了变化&#xff0c;主要体现在⽅法区的实现&#xff1a; JDK1.6 常量池在方法区 JDK1.7 JDK1.6 使⽤永久代实现⽅法区&#xff1a;JDK1.7 时发…...

蓝桥杯嵌入式第十一届省赛真题

&#xff08;一&#xff09;题目 首先要知道P37对应的CubeMx上面的引脚是PB15,给PB15设置成ADC采集。使用到的PA6和PA7的端口要进行定时器配置 100Hz80 000 000/800 *1000 200Hz80 000 000/400 *1000 ADC采集只需要选择好adc1、adc2 再选择好它的通道就可以了&#xff0c;不…...

LLMs之ChatGPT:《Connecting GitHub to ChatGPT deep research》翻译与解读

LLMs之ChatGPT&#xff1a;《Connecting GitHub to ChatGPT deep research》翻译与解读 导读&#xff1a;这篇OpenAI帮助文档全面介绍了将GitHub连接到ChatGPT进行深度代码研究的方法、优势和注意事项。通过连接GitHub&#xff0c;用户可以充分利用ChatGPT强大的代码理解和生成…...

多环境开发

# 应用环境(公共环境,写一些公共配置) spring:profiles:active: dev --- # 设置环境 # 生产环境 spring:config:activate:on-profile: pro server:port: 80 --- # 开发环境 spring:config:activate:on-profile: dev server:port: 81 --- # 测试环境 spring:config:activate:on-…...

游戏引擎学习第269天:清理菜单绘制

回顾并为今天的工作设定目标 昨天我们对调试系统中的菜单处理做了一些清理工作&#xff0c;今天我想继续对它们的展示和使用方式进行一些打磨和改进。今天的计划还不完全确定&#xff0c;我还没有完全决定要做什么&#xff0c;但是我希望能够完成这部分工作&#xff0c;所以我…...

《解锁React Native与Flutter:社交应用启动速度优化秘籍》

React Native和Flutter作为当下热门的跨平台开发框架&#xff0c;在优化应用启动性能方面各有千秋。今天&#xff0c;我们就深入剖析它们独特的策略与方法。 React Native应用的初始包大小对启动速度影响显著。在打包阶段&#xff0c;通过精准分析依赖&#xff0c;去除未使用的…...

Web3 初学者的第一个实战项目:留言上链 DApp

目录 &#x1f4cc; 项目简介&#xff1a;留言上链 DApp&#xff08;MessageBoard DApp&#xff09; &#x1f9e0; 技术栈 &#x1f536; 1. Solidity 智能合约代码&#xff08;MessageBoard.sol&#xff09; &#x1f537; 2. 前端代码&#xff08;index.html script.js…...