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

Qt 性能优化总结

Qt 性能优化总结

本文简单解析 Qt 应用程序的性能优化策略,涵盖 GUI 渲染、内存管理、信号与槽、QML 性能等核心领域,并通过具体示例展示优化效果。


1. Qt 性能优化简介

性能优化目标是减少资源消耗(如 CPU、内存、GPU)、提高响应速度和流畅度。Qt 应用程序的性能瓶颈可能出现在:

  • GUI 渲染:复杂界面或频繁重绘。
  • 内存管理:对象分配过多或内存泄漏。
  • 信号与槽:大量信号触发或不当连接。
  • QML 性能:复杂绑定或低效 JavaScript。
  • 多线程:线程同步开销或阻塞主线程。

优化策略分为:

  • 通用优化:适用于所有 Qt 应用程序。
  • GUI 优化:针对 Qt Widgets 和 Qt Quick。
  • 内存优化:减少分配和泄漏。
  • 高级优化:多线程和特定场景。

2. 性能优化基本步骤

优化 Qt 应用程序通常遵循以下步骤:

  1. 分析性能瓶颈:使用工具(如 Qt Creator 性能分析器、Valgrind、QML Profiler)定位问题。
  2. 应用优化策略:根据瓶颈选择合适的优化方法。
  3. 验证效果:通过测试和基准比较优化前后的性能。
  4. 迭代优化:重复分析和优化,直到满足性能需求。

2.1 常用性能分析工具

  • Qt Creator Profiler:分析 CPU 和内存使用,内置于 Qt Creator。
  • QML Profiler:分析 QML 应用程序的渲染、绑定和 JavaScript 性能。
  • Valgrind:检测内存泄漏和性能瓶颈(Linux)。
  • Perf:Linux 系统级性能分析。
  • Instruments:macOS 性能分析工具。
  • Visual Studio Profiler:Windows 性能分析。

3. 通用优化策略

以下是适用于所有 Qt 应用程序的基础优化方法。

3.1 减少信号与槽开销

信号与槽是 Qt 的核心机制,但过多或不当使用会影响性能:

  • 避免频繁信号触发:检查信号是否必要,合并多次触发。
  • 使用直接连接:当信号和槽在同一线程时,使用 Qt::DirectConnection 减少排队开销。
  • 断开不必要的连接:动态断开不再需要的信号与槽。
示例:优化信号触发

以下是一个频繁触发信号的低效代码:

#include <QObject>
#include <QTimer>
#include <QDebug>class DataEmitter : public QObject {Q_OBJECT
public:DataEmitter() {QTimer* timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &DataEmitter::emitData);timer->start(10); // 每 10ms 触发一次}signals:void dataChanged(int value);private slots:void emitData() {for (int i = 0; i < 100; ++i) {emit dataChanged(i); // 频繁触发信号}}
};#include "inefficient_signal.moc"

问题:每次定时器触发,发出 100 次信号,导致高 CPU 使用率。

优化版本

#include <QObject>
#include <QTimer>
#include <QDebug>class DataEmitter : public QObject {Q_OBJECT
public:DataEmitter() {QTimer* timer = new QTimer(this);connect(timer, &QTimer::timeout, this, &DataEmitter::emitData);timer->start(100); // 减少触发频率}signals:void dataChanged(const QList<int>& values);private slots:void emitData() {QList<int> values;for (int i = 0; i < 100; ++i) {values.append(i);}emit dataChanged(values); // 单次信号传递所有数据}
};#include "optimized_signal.moc"

优化点

  • 减少信号触发频率(从 10ms 到 100ms)。
  • 合并多次信号为单次信号,使用 QList 传递批量数据。
  • 效果:CPU 使用率显著降低,槽函数调用次数减少。

3.2 优化事件处理

Qt 的事件系统(如鼠标、键盘、定时器事件)可能导致性能问题:

  • 合并事件:避免频繁触发重绘或计算。
  • 延迟处理:使用 QTimer 延迟非紧急事件。
  • 事件压缩:对重复事件(如 QResizeEvent)进行压缩。
示例:优化重绘事件

以下是一个低效的自定义控件,每次窗口调整大小都触发重绘:

#include <QWidget>
#include <QPainter>class CustomWidget : public QWidget {Q_OBJECT
public:CustomWidget(QWidget* parent = nullptr) : QWidget(parent) {}protected:void paintEvent(QPaintEvent*) override {QPainter painter(this);// 复杂绘制逻辑for (int i = 0; i < 1000; ++i) {painter.drawLine(0, i, width(), i);}}void resizeEvent(QResizeEvent*) override {update(); // 每次调整大小都触发重绘}
};

问题:窗口调整大小时,resizeEvent 频繁触发 update(),导致重绘开销大。

优化版本

#include <QWidget>
#include <QPainter>
#include <QTimer>class CustomWidget : public QWidget {Q_OBJECT
public:CustomWidget(QWidget* parent = nullptr) : QWidget(parent) {resizeTimer = new QTimer(this);resizeTimer->setSingleShot(true);connect(resizeTimer, &QTimer::timeout, this, &CustomWidget::delayedUpdate);}protected:void paintEvent(QPaintEvent*) override {QPainter painter(this);for (int i = 0; i < 1000; ++i) {painter.drawLine(0, i, width(), i);}}void resizeEvent(QResizeEvent*) override {resizeTimer->start(50); // 延迟 50ms 重绘}private slots:void delayedUpdate() {update();}private:QTimer* resizeTimer;
};

优化点

  • 使用 QTimer 延迟重绘,合并多次 resizeEvent
  • 效果:减少不必要的重绘,降低 CPU 和 GPU 使用率。

4. GUI 优化

Qt 提供 Qt Widgets 和 Qt Quick 两种 GUI 框架,优化策略有所不同。

4.1 Qt Widgets 优化

  • 减少重绘:仅更新必要区域,使用 update(QRect) 而非 update()
  • 缓存绘制:使用 QPixmap 缓存复杂图形。
  • 优化布局:避免嵌套过多布局,减少计算开销。
示例:缓存复杂绘制

以下是一个低效的控件,每次重绘都重新计算图形:

#include <QWidget>
#include <QPainter>class GraphWidget : public QWidget {Q_OBJECT
public:GraphWidget(QWidget* parent = nullptr) : QWidget(parent) {}protected:void paintEvent(QPaintEvent*) override {QPainter painter(this);// 复杂计算for (int x = 0; x < width(); ++x) {double y = std::sin(x / 10.0) * height() / 2 + height() / 2;painter.drawPoint(x, y);}}
};

问题:每次重绘都重新计算正弦曲线,效率低。

优化版本

#include <QWidget>
#include <QPainter>
#include <QPixmap>class GraphWidget : public QWidget {Q_OBJECT
public:GraphWidget(QWidget* parent = nullptr) : QWidget(parent) {cache = QPixmap(800, 600);cache.fill(Qt::white);redrawCache();}protected:void paintEvent(QPaintEvent*) override {QPainter painter(this);painter.drawPixmap(0, 0, cache);}void resizeEvent(QResizeEvent* event) override {if (cache.size() != size()) {cache = QPixmap(size());cache.fill(Qt::white);redrawCache();}QWidget::resizeEvent(event);}private:void redrawCache() {QPainter painter(&cache);for (int x = 0; x < width(); ++x) {double y = std::sin(x / 10.0) * height() / 2 + height() / 2;painter.drawPoint(x, y);}}QPixmap cache;
};

优化点

  • 使用 QPixmap 缓存绘制结果,仅在窗口大小变化时重新计算。
  • 效果:重绘时间从毫秒级降到微秒级,显著提升流畅度。

4.2 Qt Quick/QML 优化

QML 性能瓶颈通常出现在渲染、绑定和 JavaScript:

  • 减少绑定:避免复杂或循环绑定,使用 Loader 动态加载。
  • 异步加载:使用 LoaderComponent 延迟加载大型组件。
  • 优化渲染:启用硬件加速,使用 Opacityvisible 控制渲染。
  • 高效 JavaScript:避免在高频信号(如 onValueChanged)中执行复杂逻辑。
示例:优化 QML 列表视图

以下是一个低效的 QML 列表视图,每次滚动都重新渲染所有项:

import QtQuick 2.15
import QtQuick.Controls 2.15ApplicationWindow {visible: truewidth: 400height: 600ListView {anchors.fill: parentmodel: 1000delegate: Rectangle {width: parent.widthheight: 50color: "lightblue"Text {anchors.centerIn: parenttext: "Item " + index// 复杂计算property int computed: Math.sin(index) * 100}}}
}

问题:每次滚动都重新计算 computed 属性,渲染开销大。

优化版本

import QtQuick 2.15
import QtQuick.Controls 2.15ApplicationWindow {visible: truewidth: 400height: 600ListView {anchors.fill: parentmodel: 1000cacheBuffer: 200 // 缓存更多项delegate: Component {Rectangle {width: parent.widthheight: 50color: "lightblue"Text {anchors.centerIn: parenttext: "Item " + index}}}clip: true // 裁剪不可见区域}
}

优化点

  • 移除复杂计算,避免绑定开销。
  • 使用 cacheBuffer 缓存渲染项。
  • 启用 clip 裁剪不可见区域。
  • 效果:滚动更流畅,CPU 使用率降低 50%。

5. 内存优化

内存管理不当会导致泄漏或高占用,影响性能。

5.1 减少对象分配

  • 重用对象:避免频繁创建和销毁 QObject 子类。
  • 池化技术:使用对象池管理临时对象。
  • 智能指针:使用 QSharedPointerstd::unique_ptr

5.2 检测和修复内存泄漏

  • 工具:Valgrind、Qt Creator Memory Analyzer。
  • 父子关系:确保 QObject 子对象由父对象管理。
  • 清理连接:断开信号与槽,避免悬空指针。
示例:修复内存泄漏

以下是一个存在内存泄漏的代码:

#include <QApplication>
#include <QObject>class Leaky : public QObject {Q_OBJECT
public:Leaky() {QObject* obj = new QObject; // 没有父对象connect(this, &Leaky::dummy, obj, &QObject::deleteLater);}signals:void dummy();
};int main(int argc, char *argv[]) {QApplication app(argc, argv);for (int i = 0; i < 1000; ++i) {Leaky* leaky = new Leaky;leaky->deleteLater();}return app.exec();
}#include "leaky_code.moc"

问题QObject 没有父对象,且未正确清理,导致内存泄漏。

优化版本

#include <QApplication>
#include <QObject>class Fixed : public QObject {Q_OBJECT
public:Fixed(QObject* parent = nullptr) : QObject(parent) {QObject* obj = new QObject(this); // 设置父对象connect(this, &Fixed::dummy, obj, &QObject::deleteLater);}signals:void dummy();
};int main(int argc, char *argv[]) {QApplication app(argc, argv);for (int i = 0; i < 1000; ++i) {Fixed* fixed = new Fixed;fixed->deleteLater();}return app.exec();
}#include "fixed_code.moc"

优化点

  • QObject 设置父对象,自动管理生命周期。
  • 效果:内存泄漏消除,内存占用稳定。

6. 多线程优化

Qt 支持多线程,但不当使用会导致性能问题。

6.1 避免阻塞主线程

  • 异步任务:将耗时操作移到工作线程。
  • QThreadPool:使用线程池管理任务。
  • 信号与槽:使用 Qt::QueuedConnection 跨线程通信。

6.2 示例:异步数据处理

以下是一个阻塞主线程的代码:

#include <QApplication>
#include <QPushButton>class MainWindow : public QPushButton {Q_OBJECT
public:MainWindow() {setText("Process Data");connect(this, &QPushButton::clicked, this, &MainWindow::processData);}private slots:void processData() {// 耗时操作阻塞主线程for (int i = 0; i < 1000000; ++i) {QString::number(i).toDouble();}setText("Done");}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.show();return app.exec();
}#include "blocking_thread.moc"

问题processData 阻塞主线程,导致界面卡顿。

优化版本

#include <QApplication>
#include <QPushButton>
#include <QThread>
#include <QObject>class Worker : public QObject {Q_OBJECT
public slots:void processData() {for (int i = 0; i < 1000000; ++i) {QString::number(i).toDouble();}emit finished();}signals:void finished();
};class MainWindow : public QPushButton {Q_OBJECT
public:MainWindow() {setText("Process Data");worker = new Worker;thread = new QThread(this);worker->moveToThread(thread);thread->start();connect(this, &QPushButton::clicked, worker, &Worker::processData);connect(worker, &Worker::finished, this, &MainWindow::onFinished);}private slots:void onFinished() {setText("Done");}private:Worker* worker;QThread* thread;
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.show();return app.exec();
}#include "async_thread.moc"

优化点

  • 将耗时任务移到工作线程,保持主线程响应。
  • 使用信号与槽通信,线程安全。
  • 效果:界面保持流畅,任务异步完成。

7. 高级优化技巧

以下是一些高级优化策略,适用于复杂 Qt 应用程序。

7.1 数据库优化

  • 批量操作:使用事务减少数据库写入开销。
  • 索引:为频繁查询的字段添加索引。
  • 异步查询:使用 QSqlQuery 的异步模式。

7.2 网络优化

  • 压缩数据:使用 qCompress 压缩网络传输数据。
  • 缓存响应:缓存频繁访问的网络资源。
  • 异步请求:使用 QNetworkAccessManager 异步处理。

7.3 硬件加速

  • OpenGL/Vulkan:为 Qt Quick 启用硬件加速(默认启用)。
  • Scene Graph:优化 QML 渲染,使用 ShaderEffect 自定义效果。

8. 学习路径

  1. 入门
    • 学习基本性能分析工具(如 Qt Creator Profiler)。
    • 优化信号与槽和简单 GUI 渲染。
    • 修复内存泄漏,减少对象分配。
  2. 进阶
    • 优化 Qt Widgets 和 QML 应用程序,减少重绘和绑定。
    • 使用多线程处理耗时任务。
    • 分析复杂场景的性能瓶颈。
  3. 精通
    • 结合数据库和网络优化,构建高性能应用。
    • 使用硬件加速和自定义渲染。
    • 自动化性能测试,集成到 CI/CD。

9. 总结

Qt 性能优化是一个系统性过程,涵盖信号与槽、GUI 渲染、内存管理和多线程等多个方面。通过分析工具定位瓶颈、应用针对性优化策略,可以显著提升应用程序的响应速度和资源效率。

相关文章:

Qt 性能优化总结

Qt 性能优化总结 本文简单解析 Qt 应用程序的性能优化策略&#xff0c;涵盖 GUI 渲染、内存管理、信号与槽、QML 性能等核心领域&#xff0c;并通过具体示例展示优化效果。 1. Qt 性能优化简介 性能优化目标是减少资源消耗&#xff08;如 CPU、内存、GPU&#xff09;、提高响…...

亚马逊关键字搜索数据通过 Product Advertising API 来获取

亚马逊关键字搜索数据主要通过 Product Advertising API 来获取。 以下是使用该接口进行关键字搜索的一般步骤&#xff1a; &#xff08;测试示例&#xff09; 注册开发者账号&#xff1a;访问亚马逊开发者中心&#xff0c;完成三方供应商注册并同意相关开发者协议&#xff0…...

现代C++的范式演进与工程实践深度解析(本文序号不知道怎么整的,有点问题)

引言:C++的复兴时代 在经历了"已死语言"的质疑后,现代C++正迎来前所未有的复兴。据2024年TIOBE指数显示,C++以8.33%的占比稳居第三,较2020年上升2.1个百分点。这种复兴并非偶然——随着C++20标准的全面落地和C++23特性的逐步实现,这门已有40年历史的语言正在系…...

第二十五天 - Web安全防护 - WAF原理与实现 - 练习:请求过滤中间件

一、Celery核心机制解析 1.1 分布式架构四要素 # celery_config.py BROKER_URL redis://:passwordlocalhost:6379/0 # 消息中间件 RESULT_BACKEND redis://:passwordlocalhost:6379/1 # 结果存储 TASK_SERIALIZER json ACCEPT_CONTENT [json] TIMEZONE Asia/Shanghai核…...

springboot自定义starter(避坑教学)

在实际开发中&#xff0c;经常会定义一些公共组件&#xff0c;提供给各个项目团队使用。而在springboot的项目中&#xff0c;一般会将这些公共组件封装为springboot的starter。 1.命名规范 Spring官方Starter通常命名为 spring-boot-starter-{name} 如&#xff1a;spr…...

Python 实现日志备份守护进程

实训背景 假设你是一名运维工程师&#xff0c;需要为公司的监控系统开发一个简单的日志备份守护进程。该进程需满足以下需求&#xff1a; 后台运行&#xff1a;脱离终端&#xff0c;长期监控指定目录&#xff08;如 /var/log/app/&#xff09;中的日志文件。自动备份&#xf…...

详解JVM的底层原理

目录 1.JVM的内存区域划分 1&#xff09;程序计数器&#xff08;Program Counter Register&#xff09; 2&#xff09;元数据区&#xff08;Metaspace&#xff09; 3&#xff09;虚拟机栈&#xff08;Java Virtual Machine Stacks&#xff09; 4&#xff09;堆&#xff08…...

制表符是什么?与.txt文件的关系?

李升伟 整理 制表符&#xff08;Tab&#xff09;是一种控制字符&#xff08;ASCII码为9&#xff0c;Unicode为\u0009&#xff09;&#xff0c;用于在文本中创建水平间距。它的作用类似于键盘上的 Tab 键&#xff0c;通常表现为光标跳转到下一个预设的“制表位”&#xff08;一…...

【专题刷题】双指针(三):两数之和,三数之和,四数之和

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…...

Java八种常见的设计模式

一、单例模式 单例模式是&#xff08;Singleton Pattern&#xff09;Java中最常用的设计模式之一&#xff0c;它保证一个类仅有一个实例&#xff0c;并提供一个全局访问点。 实现单例模式的核心是将类的构造方法私有化&#xff0c;以防止外部直接通过构造函数创建实例。同时&am…...

用Prompt 技术【提示词】打造自己的大语言智能体

机器如何按照人类的指令执行任务的探索 机器需具备理解任务叙述的能力&#xff0c;以便能够按照人类的指令执行任务&#xff0c;为机器提供一些范例作为参考&#xff0c;使其能够理解该执行的任务类型。这样的学习方式称为“Instruction learning”&#xff0c;透过精心设计的…...

灵鉴 AI五大核心能力洞穿 “数据黑箱”云取证深度支持8大核心应用

本文关键词&#xff1a;灵鉴AI 、电子数据取证分析AI助手、云取证、DeepSeek大模型 1.灵鉴AI &#xff0c;V1.0深度融合DeepSeek大模型技术&#xff0c;破解行业痛点&#xff0c;5大核心能力&#xff0c;让大模型真正“懂”电子数据分析。 2.LX-A216云取证系统&#xff0c;V2.…...

了解高速设计的信号完整性仿真

高速设计需要精确的信号传输&#xff0c;以确保最佳性能。信号完整性差会导致关键应用中的误码、数据损坏甚至系统故障等问题。介电常数、损耗角正切和插入损耗等因素会显著影响信号质量。通过使用信号完整性仿真&#xff0c;您可以及早发现并解决这些挑战。这种主动方法有助于…...

用 Deepseek 写的html油耗计算器

在油价高企的今天&#xff0c;了解自己爱车的真实油耗情况对每位车主来说都至关重要。本文将介绍一个简单实用的油耗计算方法&#xff0c;并提供一个可以直接使用的HTML油耗计算器。 为什么要计算油耗&#xff1f; 计算油耗不仅能帮助我们&#xff1a; 了解车辆的真实燃油经济…...

SAP系统青果糖无法报工

问题:班长说工单号4100000101青果糖工单 无法报工 原因排查:工单4100000101的工艺路线版本错误,选了版本1的,版本1是委外的工艺,本厂生产应该选版本2. 解决&#xff1a; 1&#xff1a;重读主数据,更改工单4100000101的工艺路线版本. 2&#xff1a;工单成品已交库,不能直接更改工…...

GPU 招投标全流程分析与总结

GPU 招投标全流程分析与总结 招投标流程概述 以下是通过代理商采购Nvidia H20-GPU 141G的招投标全流程分析: #mermaid-svg-hMPPfkCpGj8GKXfV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hMPPfkCpGj8GKXfV .er…...

Centos7.6安装JDK 1.8教程

前提&#xff1a;先把jdk1.8文件上传到usr/local目录下&#xff0c;文件名如&#xff1a;jdk-8u151-linux-x64.tar.gz 1. 解压 JDK 压缩包 假设 jdk-8u151-linux-x64.tar.gz 文件位于 /usr/local 目录下。 进入 /usr/local 目录&#xff1a; cd /usr/local 解压文件&#…...

Golang errors 包快速上手

文章目录 1.变量2.类型3.函数3.1 New3.2 Is简介函数签名核心功能示例代码使用场景注意事项小结 3.3 As简介函数签名核心功能示例代码使用场景注意事项小结 3.4 Unwrap简介函数签名核心功能使用示例使用场景注意事项小结 3.5 Join简介函数签名核心功能使用场景注意事项小结 4.小…...

新型多机器人协作运输系统,轻松应对复杂路面

受到鱼类、鸟类和蚂蚁等微小生物体协作操纵的启发&#xff0c;研究人员开发了多机器人协作运输系统&#xff08;Multirobot Cooperative Transportation Systems&#xff0c;MRCTS&#xff09;运输单个机器人无法处理的重型超大物体&#xff0c;可用于搜救行动、灾难响应、军事…...

易境通国际货代系统:如何解决货代物流行业的棘手难题

国际货代行业作为全球贸易的重要纽带&#xff0c;面临着日益复杂的市场环境和客户需求。然而&#xff0c;随着业务规模的扩张和多变的市场需求&#xff0c;传统的粗放式管理模式逐渐暴露出效率低下、成本失控、风险难控等问题。尤其在跨境电商高速发展的背景下&#xff0c;货代…...

基于springboot医药连锁店管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统医药连锁店管理采取了人工的管理方法&…...

Vue 3 reactive 和 ref 区别及 失去响应性问题

在 Vue 3 中&#xff0c;reactive 和 ref 是实现响应式数据的两个核心 API&#xff0c;它们的设计目标和使用场景有所不同。以下是两者的详细对比&#xff1a; 1. 基本定义与核心功能 特性reactiveref作用创建对象类型的响应式代理&#xff08;对象、数组、Map 等&#xff09…...

d3.js绘制单/多面板组合箱线图

用d3.js研发了个可以单面板、多面板展示的组合箱线图&#xff1b; 组合箱线图中包括普通散点、蜂群散点、小提琴图、小提琴箱线图、柱状图、误差棒、离群点等等&#xff0c;其中大部分你能想到的配置都是自行传参调整的&#xff0c;你想不到的也能稍作修改然后自行调整&#x…...

第二十四天 - 分布式任务队列 - Celery高级应用 - 练习:分布式监控任务系统

一、Celery核心机制解析 1.1 分布式架构四要素 # celery_config.py BROKER_URL redis://:passwordlocalhost:6379/0 # 消息中间件 RESULT_BACKEND redis://:passwordlocalhost:6379/1 # 结果存储 TASK_SERIALIZER json ACCEPT_CONTENT [json] TIMEZONE Asia/Shanghai核…...

IDEA使用jclasslib Bytecode Viewer查看jvm字节码

学习jvm的时候&#xff0c;想查看字节码和局部变量表&#xff0c;可以使用idea安装jclasslib Bytecode View插件查看。 &#xff08;1&#xff09;安装工具&#xff1a; 安装完成后需要重启idea. &#xff08;2&#xff09;准备一段代码&#xff0c;编译运行 package com.te…...

list.

列表类型是用来存储多个有序的字符串&#xff0c;列表中的每个字符串称为元素&#xff08;element&#xff09;&#xff0c;⼀个列表最多可以存储个元素 在 Redis 中&#xff0c;可以对列表两端插入&#xff08;push&#xff09;和弹出&#xff08;pop&#xff09;&#xff0c;…...

202520读书笔记|《我要按自己喜欢的方式去生活》——面对可能到来的裁员,那就等正式通知吧

《我要按自己喜欢的方式去生活》作者宝夏夏&#xff0c;很赞的一本书&#xff0c;通透真实&#xff0c;不矫揉造作&#xff0c;直击内心。 因为第一个故事&#xff0c;裁员而进来的。早晨睡眼惺忪醒来&#xff0c;闺蜜半夜发来一大段话&#xff0c;大意是公司在缩减成本裁员&am…...

Linux 文件传输:系统数据交互的动脉

前言&#xff1a;sshd 在Linux系统中&#xff0c;文件传输常依赖于SSH协议&#xff08;Secure Shell&#xff09;&#xff0c;而sshd&#xff08;OpenSSH Daemon&#xff09;是负责处理SSH连接的后台服务程序。通过sshd&#xff0c;用户可以在加密的通道中进行安全的远程登录、…...

Rust + WebAssembly 生产部署指南

1 最小可行部署&#xff08;MVP&#xff09; 前端打包wasm-pack build --target web --release # 生成 .wasm JS 包装器 npm run build / vite build / webpack … # 打包 HTML/CSS/JS 资源拷贝产物 到生产服务器的站点目录dist/ ├── index.html ├── pkg…...

git忽略已跟踪的文件/指定文件

在项目开发中&#xff0c;有时候我们并不需要git跟踪所有文件&#xff0c;而是需要忽略掉某些指定的文件或文件夹&#xff0c;怎么操作呢&#xff1f;我们分两种情况讨论&#xff1a; 1. 要忽略的文件之前并未被git跟踪 这种情况常用的方法是在项目的根目录下创建和编辑.gitig…...

基于Django实现的图书分析大屏系统项目

图书分析大屏展示系统项目大纲与启动教程 一、项目概述 图书分析大屏展示系统是一个基于Django框架开发的Web应用&#xff0c;主要用于图书数据的可视化分析与展示。该系统采用MVT&#xff08;Model-View-Template&#xff09;架构模式&#xff0c;结合MySQL数据库&#xff0…...

【OSCP-vulnhub】GoldenEye

目录 端口扫描 查找源代码 目录扫描 POP3邮件枚举 1.先枚举用户名 2.hydra爆破 3.nc连接 boris&#xff1a; natalya&#xff1a; 设置本地hosts文件 doak&#xff1a; 解析图片 exiftool for-007.jpg strings for-007.jpg 使用MSF去搜索内核版本 漏洞利用 ---…...

OpenAI发布GPT-4.1系列模型,主打编程能力提升

OpenAI在本周一推出了全新一代模型家族——GPT-4.1系列。没错&#xff0c;就是“4.1”&#xff0c;尽管OpenAI的命名方式已经让人有些摸不着头脑。 这一系列包括三个型号&#xff1a;GPT-4.1、GPT-4.1 mini和GPT-4.1 nano。据OpenAI介绍&#xff0c;这些模型在编程任务和指令遵…...

压缩包网页预览(zip-html-preview)

zip-html-preview 项目介绍 这是一个基于 Spring Boot 开发的在线 ZIP 文件预览工具,主要用于预览 ZIP 压缩包中的 HTML 文件及其相关资源。 主要功能 支持拖拽上传或点击选择多个 ZIP 文件自动解压并提取 ZIP 文件中的 HTML 文件在线预览 HTML 文件及其相关的 CSS、JavaSc…...

OpenCV 图形API(41)颜色空间转换----- BGR 图像转换为灰度图像函数BGR2Gray()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从BGR色彩空间转换为灰度。 B、G和R通道值的传统范围是0到255。结果的灰度颜色值计算为&#xff1a; dst ( I ) 0.114 ∗ src ( I ) . B…...

影视产业链中的律师角色以及合规风控要点

影视产业链中的律师角色以及合规风控要点 在影视娱乐业务中&#xff0c;律师服务贯穿项目全生命周期&#xff0c;涵盖创意开发、投z制作、发行传播、艺人管理及争议等多个领域 一、影视项目全流程合同法律事务 ✔️项目开发阶段 剧本合作&#xff1a;剧本委托创作、改编、版权…...

Java工具类——实体类列表写入excel

Java工具类——实体类列表写入excel /*** 将实体类 List 数据写入 Excel 文件* param dataList 实体类对象列表* param filePath Excel 文件路径* param sheetName Sheet 名称* param <T> 泛型类型* throws IOException 文件操作异常* throws IllegalAccessException 反…...

C++23 新预处理器指令详解:#elifdef、#elifndef 和 #warning

文章目录 1. #elifdef 和 #elifndef&#xff1a;更灵活的条件编译1.1 背景与动机1.2 语法与示例示例代码&#xff1a; 1.3 编译器支持 2. #warning&#xff1a;发出编译警告2.1 背景与动机2.2 语法与示例示例代码&#xff1a; 2.3 编译器支持 3. 总结 C23 标准引入了多项改进&a…...

书写API文档的最佳实践[特殊字符]

API文档对于API的可用性和成功至关重要。完善的API文档能显著提高开发者体验&#xff0c;加速采用&#xff0c;并培养强大的开发者社区。反之&#xff0c;糟糕的文档可能导致困惑、挫败感和错误&#xff0c;从而降低采用率。本文将探讨编写清晰、全面、开发者友好的API文档的高…...

【Maven】手动安装依赖到本地仓库

【Maven】手动安装依赖到本地仓库 【一】下载依赖【二】安装 JAR 文件到本地仓库【三】验证安装【四】在项目中使用该依赖【1】注意事项【2】额外提示 【一】下载依赖 登录到中央仓库下载依赖&#xff0c;中央仓库地址&#xff1a;https://mvnrepository.com/ 搜搜你的依赖的a…...

kali下maven 的安装与配置

1、下载 maven 安装包 wget https://dlcdn.apache.org/maven/maven-3/3.9.4/binaries/apache-maven-3.9.4-bin.tar.gz 2、解压 apache-maven-3.9.4-bin.tar.gz tar -zxvf apache-maven-3.9.4-bin.tar.gz 找到文件解压到的位置&#xff0c;由于解压时我们没有指定路径&#x…...

list的模拟实现和反向迭代器的底层

1&#xff1a;list的模拟实现 1&#xff1a;链表的节点 对于list的模拟实现&#xff0c;我们需要先定义一个节点的类可以使用&#xff08;class也可以使用struct&#xff09; // List的节点类 template<class T> struct ListNode {ListNode(const T& val T()){_p…...

OpenHarmony - 小型系统内核(LiteOS-A)(七)

OpenHarmony - 小型系统内核&#xff08;LiteOS-A&#xff09;&#xff08;七&#xff09; 八、文件系统 适配新的文件系统 基本概念 所谓对接VFS层&#xff0c;其实就是指实现VFS层定义的若干接口函数&#xff0c;可根据文件系统的特点和需要适配其中部分接口。一般情况下&…...

四层板的时钟线设计:关键要点与实用策略

在电子电路设计领域&#xff0c;四层板凭借其出色的电气性能和合理的空间布局&#xff0c;广泛应用于各类电子产品中。而时钟线作为系统的 “心跳”&#xff0c;为整个电路提供同步信号&#xff0c;其设计质量直接关系到系统的稳定性、可靠性和性能表现。因此&#xff0c;深入探…...

【TypeScript类型系统解析:一次真实的类型检查修复经历】

TypeScript类型系统解析&#xff1a;一次真实的类型检查修复经历 在最近的管理系统开发过程中&#xff0c;我遇到了一个值得深入探讨的TypeScript类型问题。通过解决这个问题&#xff0c;我更深入地理解了TypeScript的类型系统工作原理&#xff0c;以及如何在Vue项目中正确处理…...

全视通无感护理巡视系统方案及产品,助力医院护士巡视病房到位

传统的护理工作中&#xff0c;护理巡视是一项重要且繁琐的任务。护士们需要根据不同的护理级别&#xff0c;定时对患者进行巡视&#xff0c;并手工填写巡视记录表&#xff0c;登记巡视时间、人员等信息。月末时&#xff0c;还需进行人工数据统计&#xff0c;这一过程不仅效率低…...

初识Redis · 命令、数据结构补充、协议

目录 前言&#xff1a; 数据结构补充 stream geospaital Hyperloglog bitmap bitfield 渐进式遍历命令等 认识Redis客户端及协议 前言&#xff1a; 在前文&#xff0c;我们总览一下&#xff0c;我们已经介绍了什么是Redis&#xff0c;Redis的应用场景是什么&#xff…...

DBA工作常见问题整理

MVCC机制: PostgreSQL的多版本并发控制(MVCC)是其核心特性之一&#xff0c;它允许数据库在高并发环境下保持高性能的同时提供事务隔离。 MVCC通过维护数据的多个版本实现&#xff1a; 读操作不阻塞写操作写操作不阻塞读操作避免使用锁实现并发控制 PostgreSQL的MVCC特点 写时…...

云转型(cloud transformation)——不仅仅是简单的基础设施迁移

李升伟 编译 云转型不仅仅是迁移基础设施&#xff0c;更是重塑企业运营、创新及价值交付的方式。它具有战略性、持续性&#xff0c;并影响着人员、流程和平台。 ☁️ 云转型涉及以下内容&#xff1a; &#x1f504; 应用现代化——从单体架构转向微服务架构。 ⚙️ 运营自动…...

SpringBoot 定时任务

启用定时任务‌ 首先确定需要启用定时任务的SpringBoot类&#xff0c;然后添加注解&#xff08;EnableScheduling&#xff09;以启用定时任务 package com.mt.visitorauth.anjian.service;import org.springframework.scheduling.annotation.EnableScheduling;EnableScheduli…...