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

Linux测试处理fps为30、1920*1080、一分钟的视频性能

前置条件

模拟fps为30、1920*1080、一分钟的视频

项目CMakeLists.txt

cmake_minimum_required(VERSION 3.30)
project(testOpenGl)set(CMAKE_CXX_STANDARD 11)add_executable(testOpenGl main.cpptestOpenCl.cpptestOpenCl.hTestCpp.cppTestCpp.hTestCppThread.cppTestCppThread.hTestSIMD.cppTestSIMD.h)# 查找OpenCL
find_package(OpenCL REQUIRED)# 链接OpenCl库
target_include_directories(testOpenGl PRIVATE ${OpenCL_INCLUDE_DIRS})
target_link_libraries(testOpenGl PRIVATE ${OpenCL_LIBRARIES})# 检测SIMD支持并添加编译选项
include(CheckCXXCompilerFlag)check_cxx_compiler_flag("-mavx" COMPILER_SUPPORTS_AVX)
check_cxx_compiler_flag("-mavx2" COMPILER_SUPPORTS_AVX2)if(COMPILER_SUPPORTS_AVX2)target_compile_options(testOpenGl PRIVATE -mavx2)
elseif (COMPILER_SUPPORTS_AVX)target_compile_options(testOpenGl PRIVATE -mavx)
else ()message(FATAL_ERROR "AVX or AVX2 is not supported by compiler")
endif ()

C++代码

//
// Created by lai on 2025/1/17.
//#include "TestCpp.h"#include <iostream>
#include <vector>
#include <random>
#include <chrono>// 灰度转换函数
void to_gray(const std::vector<unsigned char>& input, std::vector<unsigned char>& output, int width, int height) {for (int i = 0; i < width * height; ++i) {int offset = i * 3;  // RGB 分量unsigned char r = input[offset];unsigned char g = input[offset + 1];unsigned char b = input[offset + 2];// 灰度公式output[i] = static_cast<unsigned char>(0.299f * r + 0.587f * g + 0.114f * b);}
}
void TestCpp::runTest() {const int width = 1920;         // 视频宽度const int height = 1080;        // 视频高度const int fps = 30;             // 帧率const int duration = 60;        // 视频持续时间(秒)const int frameCount = fps * duration; // 总帧数// 模拟视频帧数据:随机生成每帧的 RGB 数据std::vector<unsigned char> inputFrame(width * height * 3);std::vector<unsigned char> outputFrame(width * height);std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, 255);// 开始处理auto startTime = std::chrono::high_resolution_clock::now();for (int frame = 0; frame < frameCount; ++frame) {// 随机生成模拟的 RGB 数据for (auto& pixel : inputFrame) {pixel = dis(gen);}// 调用灰度转换函数to_gray(inputFrame, outputFrame, width, height);// 打印进度if (frame % 30 == 0) {std::cout << "Processed frame: " << frame + 1 << "/" << frameCount << std::endl;}}auto endTime = std::chrono::high_resolution_clock::now();double elapsedTime = std::chrono::duration<double>(endTime - startTime).count();// 打印处理时间std::cout << "Processed " << frameCount << " frames in " << elapsedTime << " seconds." << std::endl;std::cout << "Average time per frame: " << (elapsedTime / frameCount) << " seconds." << std::endl;}

C++多线程

//
// Created by lai on 2025/1/17.
//#include "TestCppThread.h"#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <thread>// 灰度转换函数,每个线程处理一部分图像
void to_gray_chunk(const std::vector<unsigned char>& input, std::vector<unsigned char>& output, int width, int height, int start, int end) {for (int i = start; i < end; ++i) {int offset = i * 3;  // RGB 分量unsigned char r = input[offset];unsigned char g = input[offset + 1];unsigned char b = input[offset + 2];// 灰度公式output[i] = static_cast<unsigned char>(0.299f * r + 0.587f * g + 0.114f * b);}
}void TestCppThread::runTest() {const int width = 1920;         // 视频宽度const int height = 1080;        // 视频高度const int fps = 30;             // 帧率const int duration = 60;        // 视频持续时间(秒)const int frameCount = fps * duration; // 总帧数const int numThreads = std::thread::hardware_concurrency(); // 获取可用线程数// 模拟视频帧数据:随机生成每帧的 RGB 数据std::vector<unsigned char> inputFrame(width * height * 3);std::vector<unsigned char> outputFrame(width * height);std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, 255);// 开始处理auto startTime = std::chrono::high_resolution_clock::now();for (int frame = 0; frame < frameCount; ++frame) {// 随机生成模拟的 RGB 数据for (auto& pixel : inputFrame) {pixel = dis(gen);}// 启动多个线程来处理图像std::vector<std::thread> threads;int chunkSize = width * height / numThreads; // 每个线程处理的像素块大小for (int t = 0; t < numThreads; ++t) {int start = t * chunkSize;int end = (t == numThreads - 1) ? (width * height) : (start + chunkSize); // 最后一个线程处理剩余的像素threads.emplace_back(to_gray_chunk, std::cref(inputFrame), std::ref(outputFrame), width, height, start, end);}// 等待所有线程完成for (auto& t : threads) {t.join();}// 打印进度if (frame % 30 == 0) {std::cout << "Processed frame: " << frame + 1 << "/" << frameCount << std::endl;}}auto endTime = std::chrono::high_resolution_clock::now();double elapsedTime = std::chrono::duration<double>(endTime - startTime).count();// 打印处理时间std::cout << "Processed " << frameCount << " frames in " << elapsedTime << " seconds." << std::endl;std::cout << "Average time per frame: " << (elapsedTime / frameCount) << " seconds." << std::endl;}

CPU版本的Opencl

cmake中添加

# 查找OpenCL
find_package(OpenCL REQUIRED)# 链接OpenCl库
target_include_directories(testOpenGl PRIVATE ${OpenCL_INCLUDE_DIRS})
target_link_libraries(testOpenGl PRIVATE ${OpenCL_LIBRARIES})

测试代码

//
// Created by lai on 2025/1/16.
//
#include "testOpenCl.h"#include <chrono>
#include <CL/cl.h>
#include <iostream>
#include <vector>
#include <random>// OpenCL 内核代码
const char* kernelSource = R"(
__kernel void to_gray(__global unsigned char* input,__global unsigned char* output,const int width,const int height)
{int id = get_global_id(0);  // 每个线程处理一个像素if (id < width * height) {int offset = id * 3;  // RGB 分量unsigned char r = input[offset];unsigned char g = input[offset + 1];unsigned char b = input[offset + 2];// 灰度公式output[id] = (unsigned char)(0.299f * r + 0.587f * g + 0.114f * b);}
}
)";
void TestOpenCl::runTests() {const int width = 1920;         // 视频宽度const int height = 1080;        // 视频高度const int fps = 30;             // 帧率const int duration = 60;        // 视频持续时间(秒)const int frameCount = fps * duration; // 总帧数// 模拟视频帧数据:随机生成每帧的 RGB 数据std::vector<unsigned char> inputFrame(width * height * 3);std::vector<unsigned char> outputFrame(width * height);std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, 255);// 初始化 OpenCLcl_int err;cl_platform_id platform;clGetPlatformIDs(1, &platform, nullptr);cl_device_id device;clGetDeviceIDs(platform, CL_DEVICE_TYPE_CPU, 1, &device, nullptr);cl_context context = clCreateContext(nullptr, 1, &device, nullptr, nullptr, &err);cl_command_queue queue = clCreateCommandQueue(context, device, 0, &err);cl_program program = clCreateProgramWithSource(context, 1, &kernelSource, nullptr, &err);clBuildProgram(program, 1, &device, nullptr, nullptr, nullptr);cl_kernel kernel = clCreateKernel(program, "to_gray", &err);// 创建 OpenCL 缓冲区cl_mem inputBuffer = clCreateBuffer(context, CL_MEM_READ_ONLY, inputFrame.size(), nullptr, &err);cl_mem outputBuffer = clCreateBuffer(context, CL_MEM_WRITE_ONLY, outputFrame.size(), nullptr, &err);// 开始处理auto startTime = std::chrono::high_resolution_clock::now();for (int frame = 0; frame < frameCount; ++frame) {// 随机生成模拟的 RGB 数据for (auto& pixel : inputFrame) {pixel = dis(gen);}// 写入数据到 OpenCL 缓冲区clEnqueueWriteBuffer(queue, inputBuffer, CL_TRUE, 0, inputFrame.size(), inputFrame.data(), 0, nullptr, nullptr);// 设置内核参数clSetKernelArg(kernel, 0, sizeof(cl_mem), &inputBuffer);clSetKernelArg(kernel, 1, sizeof(cl_mem), &outputBuffer);clSetKernelArg(kernel, 2, sizeof(int), &width);clSetKernelArg(kernel, 3, sizeof(int), &height);// 定义工作区大小size_t globalSize = width * height;// 执行内核clEnqueueNDRangeKernel(queue, kernel, 1, nullptr, &globalSize, nullptr, 0, nullptr, nullptr);// 读取处理后的灰度数据clEnqueueReadBuffer(queue, outputBuffer, CL_TRUE, 0, outputFrame.size(), outputFrame.data(), 0, nullptr, nullptr);// 打印进度if (frame % 30 == 0) {std::cout << "Processed frame: " << frame + 1 << "/" << frameCount << std::endl;}}auto endTime = std::chrono::high_resolution_clock::now();double elapsedTime = std::chrono::duration<double>(endTime - startTime).count();// 打印处理时间std::cout << "Processed " << frameCount << " frames in " << elapsedTime << " seconds." << std::endl;std::cout << "Average time per frame: " << (elapsedTime / frameCount) << " seconds." << std::endl;// 释放 OpenCL 资源clReleaseMemObject(inputBuffer);clReleaseMemObject(outputBuffer);clReleaseKernel(kernel);clReleaseProgram(program);clReleaseCommandQueue(queue);clReleaseContext(context);
}

内存对齐的SIMD指令集

cmake添加

# 检测SIMD支持并添加编译选项
include(CheckCXXCompilerFlag)check_cxx_compiler_flag("-mavx" COMPILER_SUPPORTS_AVX)
check_cxx_compiler_flag("-mavx2" COMPILER_SUPPORTS_AVX2)if(COMPILER_SUPPORTS_AVX2)target_compile_options(testOpenGl PRIVATE -mavx2)
elseif (COMPILER_SUPPORTS_AVX)target_compile_options(testOpenGl PRIVATE -mavx)
else ()message(FATAL_ERROR "AVX or AVX2 is not supported by compiler")
endif ()
//
// Created by lai on 2025/1/17.
//#include "TestSIMD.h"#include <iostream>
#include <vector>
#include <random>
#include <chrono>
#include <immintrin.h> // SIMD 指令集
#include <cstdlib>  // 用于posix_memalignvoid to_gray_simd(const unsigned char* input, unsigned char* output, int width, int height) {const int pixelCount = width * height;const __m256 scale_r = _mm256_set1_ps(0.299f); // 红色通道的权重const __m256 scale_g = _mm256_set1_ps(0.587f); // 绿色通道的权重const __m256 scale_b = _mm256_set1_ps(0.114f); // 蓝色通道的权重int i = 0;for (; i <= pixelCount - 8; i += 8) {// 加载 8 组 RGB 像素__m256i pixel_r = _mm256_loadu_si256((__m256i*)&input[i * 3]);  // 确保内存对齐__m256i pixel_g = _mm256_loadu_si256((__m256i*)&input[i * 3 + 1]);__m256i pixel_b = _mm256_loadu_si256((__m256i*)&input[i * 3 + 2]);// 转换为浮点数以便计算__m256 r_f = _mm256_cvtepi32_ps(pixel_r);__m256 g_f = _mm256_cvtepi32_ps(pixel_g);__m256 b_f = _mm256_cvtepi32_ps(pixel_b);// 灰度转换公式__m256 gray_f = _mm256_add_ps(_mm256_add_ps(_mm256_mul_ps(r_f, scale_r), _mm256_mul_ps(g_f, scale_g)),_mm256_mul_ps(b_f, scale_b));// 转回整数__m256i gray_i = _mm256_cvtps_epi32(gray_f);// 存储结果_mm256_storeu_si256((__m256i*)&output[i], gray_i);}// 处理剩余像素(非对齐部分)for (; i < pixelCount; ++i) {int offset = i * 3;unsigned char r = input[offset];unsigned char g = input[offset + 1];unsigned char b = input[offset + 2];output[i] = static_cast<unsigned char>(0.299f * r + 0.587f * g + 0.114f * b);}
}void TestSIMD::runTest() {const int width = 1920;         // 视频宽度const int height = 1080;        // 视频高度const int fps = 30;             // 帧率const int duration = 60;        // 视频持续时间(秒)const int frameCount = fps * duration; // 总帧数size_t size = width * height * 3 * sizeof(unsigned char);// 模拟视频帧数据:随机生成每帧的 RGB 数据// 使用posix_memalign分配对齐内存unsigned char* inputFrame;unsigned char* outputFrame;int alignment = 32; // 使用32字节对齐int resultInput = posix_memalign((void**)&inputFrame, alignment, size);int resultOutput = posix_memalign((void**)&outputFrame, alignment, size);if (resultInput != 0 || resultOutput != 0) {std::cerr << "memory allocation failed" << std::endl;return;}std::random_device rd;std::mt19937 gen(rd());std::uniform_int_distribution<> dis(0, 255);// 开始处理auto startTime = std::chrono::high_resolution_clock::now();for (int frame = 0; frame < frameCount; ++frame) {// 随机生成模拟的 RGB 数据for (int i = 0; i < width * height * 3; ++i) {inputFrame[i] = dis(gen);}// 使用 SIMD 转换灰度to_gray_simd(inputFrame, outputFrame, width, height);// 打印进度if (frame % 30 == 0) {std::cout << "Processed frame: " << frame + 1 << "/" << frameCount << std::endl;}}auto endTime = std::chrono::high_resolution_clock::now();double elapsedTime = std::chrono::duration<double>(endTime - startTime).count();// 打印处理时间std::cout << "Processed " << frameCount << " frames in " << elapsedTime << " seconds." << std::endl;std::cout << "Average time per frame: " << (elapsedTime / frameCount) << " seconds." << std::endl;
}

结论

C++
Processed 1800 frames in 251.789 seconds.
Average time per frame: 0.139883 seconds.C++ thread
Processed 1800 frames in 229.571 seconds.
Average time per frame: 0.12754 seconds.CPU版本POCL的OPENCL
Processed 1800 frames in 233.25 seconds.
Average time per frame: 0.129583 seconds.SIMD 内存对齐以后
Processed 1800 frames in 191.015 seconds.
Average time per frame: 0.106119 seconds.

SIMD的性能明显由于其他几项,但是还需要测试GPU版本的OPencl和多线程指令集优化对性能的提升

相关文章:

Linux测试处理fps为30、1920*1080、一分钟的视频性能

前置条件 模拟fps为30、1920*1080、一分钟的视频 项目CMakeLists.txt cmake_minimum_required(VERSION 3.30) project(testOpenGl)set(CMAKE_CXX_STANDARD 11)add_executable(testOpenGl main.cpptestOpenCl.cpptestOpenCl.hTestCpp.cppTestCpp.hTestCppThread.cppTestCppTh…...

kubeneters-循序渐进Ingress

文章目录 overviewIngress 是什么&#xff1f;为什么使用 Ingress&#xff1f;我们会在这里做些什么&#xff1f;HTTP 服务器&#xff08;Nginx&#xff09;还能做什么&#xff1f;Kubernetes 中的简单示例&#xff1a;A) 使用 Service ClusterIPB) 手动配置 Nginx 服务作为代理…...

Shell控监Kafka积压

1、获取Kafka消息堆积情况 vi check-kafka-lag.sh #&#xff01;/bin/bashTOPIC"total_random" GROUP_ID"etl-dw" BOOTSTRAP_SERVER"node-01:9092,node-02:9092,node-03:9092"# 检查第一个参数是否为数字 if ! [[ $1 ~ ^[0-9]$ ]]; thenecho &…...

USB3020任意波形发生器4路16位同步模拟量输出卡1MS/s频率 阿尔泰科技

信息社会的发展&#xff0c;在很大程度上取决于信息与信号处理技术的先进性。数字信号处理技术的出现改变了信息 与信号处理技术的整个面貌&#xff0c;而数据采集作为数字信号处理的必不可少的前期工作在整个数字系统中起到关键 性、乃至决定性的作用&#xff0c;其应用已经深…...

MongoDB 学习指南与资料分享

MongoDB学习资料 MongoDB学习资料 MongoDB学习资料 在数据爆炸的当下&#xff0c;MongoDB 作为非关系型数据库的佼佼者&#xff0c;以其独特优势在各领域发光发热。无论是海量数据的存储&#xff0c;还是复杂数据结构的处理&#xff0c;MongoDB 都能轻松应对。接下来&#xf…...

Web端实时播放RTSP视频流(监控)

一、安装ffmpeg: 1、官网下载FFmpeg: Download FFmpeg 2、点击Windows图标,选第一个:Windows builds from gyan.dev 3、跳转到下载页面: 4、下载后放到合适的位置,不用安装,解压即可: 5、配置path 复制解压后的\bin路径,配置环境变量如图: <...

23- TIME-LLM: TIME SERIES FORECASTING BY REPRO- GRAMMING LARGE LANGUAGE MODELS

解决问题 用LLM来解决时序预测问题&#xff0c;并且能够将时序数据映射&#xff08;reprogramming&#xff09;为NLP token&#xff0c;并且保持backbone的大模型是不变的。解决了时序序列数据用于大模型训练数据稀疏性的问题。 方法 Input Embedding 输入&#xff1a; X …...

【Go】Go数据类型详解—数组与切片

1. 前言 今天需要学习的是Go语言当中的数组与切片数据类型。很多编程语言当中都有数组这样的数据类型&#xff0c;Go当中的切片类型本质上也是对 数组的引用。但是在了解如何定义使用数组与切片之前&#xff0c;我们需要思考为什么要引入数组这样的数据结构。 1.1 为什么需要…...

微服务中引入消息队列的利弊

微服务中引入消息队列的利弊 1、微服务架构中引入消息队列(Message Queue)的主要优势&#xff1a; 1.1 解耦(Decoupling) 服务之间不需要直接调用&#xff0c;通过消息队列实现松耦合 生产者和消费者可以独立扩展和维护 降低系统间的依赖性 1.2 异步处理(Asynchronous Proc…...

如何使用策略模式并让spring管理

1、策略模式公共接口类 BankFileStrategy public interface BankFileStrategy {String getBankFile(String bankType) throws Exception; } 2、策略模式业务实现类 Slf4j Component public class ConcreteStrategy implements BankFileStrategy {Overridepublic String ge…...

骑砍2霸主MOD开发(11)-可编程渲染管线Shader编程

一.固定渲染管线&可编程渲染管线 固定渲染管线:GPU常规渲染算法,将3D模型经过四大变换计算得到2D屏幕图像 可编程渲染管线:定制化GPU渲染算法,需要提交Shader至GPU中,GPU根据定制化算法得到2D屏幕图像 二.CoreShader&TerrainShader CoreShader:游戏中使用的静态shader…...

【PowerQuery专栏】PowerQuery 函数之CSV文件处理函数

CSV.Document 函数是进行CSV文件解析功能的函数,函数目前包含4个参数: 参数1为文件的数据源,数据类型为二进制类型,值为需要读取的文本数据参数2为列名称,数据类型为字符串类型,值为分割后的列名称参数3为分隔符,数据类型为任意类型,值为分割数据的分隔符参数4为文件编…...

【FAQ】HarmonyOS SDK 闭源开放能力 —Map Kit(4)

1.问题描述&#xff1a; 添加了很多的marker点&#xff0c;每个marker点都设置了customInfoWindow&#xff0c;但是每次只能显示一个customInfoWindow吗&#xff1f; 解决方案&#xff1a; Marker的InfoWindow每次只能显示一个。 2.问题描述&#xff1a; 在地图选型中&…...

通过ffmpeg将FLV文件转换为MP4

使用 ffmpeg 将 FLV 文件转换为 MP4 文件是一个常见的操作。ffmpeg 是一个强大的多媒体处理工具&#xff0c;支持多种格式的转换、剪辑、合并等操作。以下是详细的步骤和命令示例&#xff0c;帮助你完成这一任务。 安装 FFmpeg 如果你还没有安装 ffmpeg&#xff0c;可以根据你…...

深入分析Java中的重载与重写:理解多态的两个面向

深入分析Java中的重载与重写&#xff1a;理解多态的两个面向 之前其实写过一篇文章来探讨Java当中的方法重载与方法重写但当时学的还不够通透&#xff0c;分析有点片面&#xff0c;这次我从多态的角度对其进行分析&#xff0c;有问题欢迎大家来评论区一起探讨 在Java编程中&a…...

STM32的集成开发环境STM32CubeIDE安装

STM32CubeIDE - STM32的集成开发环境 - 意法半导体STMicroelectronics...

【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)

&#xff1a; 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中&#xff0c;博主将带大家去学习所谓的…...

25/1/13 嵌入式笔记 继续学习Esp32

PWM&#xff08;Pulse Width Modulation&#xff0c;脉宽调制&#xff09; 是一种通过快速切换高低电平来模拟中间电压值的技术。它广泛应用于控制 LED 亮度、电机速度、音频生成等场景。 analogWrite函数:用于在微控制器&#xff08;如 Arduino&#xff09;上生成模拟信号。 …...

C语言的语法糖

C语言的语法糖 引言 在程序开发的过程中&#xff0c;语言的设计和编写风格往往会直接影响开发效率和代码可读性。C语言作为一种广泛应用于系统编程和嵌入式开发的编程语言&#xff0c;其设计虽然追求简洁与高效&#xff0c;但在某些方面同样存在可以提高编程体验的“语法糖”…...

客户案例:致远OA与携程商旅集成方案

一、前言 本项目原型客户公司创建于1992年,主要生产并销售包括糖果系列、巧克力系列、烘焙系列、卤制品系列4大类,200多款产品。公司具有行业领先的生产能力,拥有各类生产线100条,年产能超过10万吨。同时,经过30年的发展,公司积累了完善的销售网络,核心经销商已经超过1200个,超…...

浔川 AI 翻译已修复,可正常使用

浔川 AI 翻译已修复&#xff0c;可正常使用 亲爱的用户们&#xff1a; 大家好&#xff01;经过技术团队的不懈努力&#xff0c;浔川 AI 翻译平台已完成修复&#xff0c;目前各项功能均已恢复正常&#xff0c;可流畅使用。在此&#xff0c;我们向一直以来关心和支持浔川 AI 翻译…...

【Python】深入探讨Python中的单例模式:元类与装饰器实现方式分析与代码示例

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 单例模式&#xff08;Singleton Pattern&#xff09;是一种常见的设计模式&#xff0c;它确保一个类只有一个实例&…...

D. Paint the Tree

https://codeforces.com/problemset/problem/1975/D 分析&#xff1a; 观察样例可以发现&#xff0c;对于PB第一次在位置 r 接触到红点之后&#xff0c;接下来的怎么走完全可以有PB说了算&#xff0c;情况不会更差。同时还能发现&#xff0c;大部分边都是需要走两遍的&#xff…...

ScratchLLMStepByStep:训练自己的Tokenizer

1. 引言 分词器是每个大语言模型必不可少的组件&#xff0c;但每个大语言模型的分词器几乎都不相同。如果要训练自己的分词器&#xff0c;可以使用huggingface的tokenizers框架&#xff0c;tokenizers包含以下主要组件&#xff1a; Tokenizer: 分词器的核心组件&#xff0c;定…...

【Linux】Socket编程-TCP构建自己的C++服务器

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; Socket 编程 TCP &#x1f98b; TCP socket API 详解&#x1f98b; 多线程远程命令执行&#x1f98b; 网络版计算器&#xff08;应用层自定义协议与序列化…...

数据结构——线性表和顺序表

1、线性表的基本概念 1.1 定义 线性结构是简单且常用的数据结构&#xff0c;而线性表则是一种典型的线性结构 存储数据&#xff0c;最简单&#xff0c;最有效的方法是吧它们存储在一个线性表中 一个线性表是n个元素的有限序列。每个元素在不同的情况下有不同的含义&#xff0c…...

FunASR 在Linux/Unix 平台编译

第一步拉取镜像并生成容器&#xff1a; ### 镜像启动 通过下述命令拉取并启动FunASR软件包的docker镜像&#xff1a; shell sudo docker pull \ registry.cn-hangzhou.aliyuncs.com/funasr_repo/funasr:funasr-runtime-sdk-online-cpu-0.1.12 mkdir -p ./funasr-runtime-…...

AIP-200 先例

编号200原文链接AIP-200: Precedent状态批准创建日期2018-06-28更新日期2018-06-28 很多时候&#xff0c;API的编写方式会违反新的指导原则。此外&#xff0c;有时出于特定原因也需要打破标准&#xff0c;例如与现有系统保持一致、满足严格的性能要求或其他因素。最后&#xf…...

SAP五大核心模块:塑造企业数字化未来

在数字化转型的浪潮中&#xff0c;SAP&#xff08;Systems, Applications and Products in Data Processing&#xff09;以其强大的企业资源规划&#xff08;ERP&#xff09;系统&#xff0c;成为众多企业信赖的伙伴。SAP系统通过五大核心模块&#xff0c;即财务管理&#xff0…...

【UE5.3】fix DONET报错

新的机器 4070 gpu 运行ue项目, 可能是epic 启动器是vs安装的, vs安装的epic 启动器自己更新了一波,导致了.NET的问题? ue项目是拷贝远程的windows的电脑里面的,应该不会导致ue源码里的cs出问题? 【UE5.3】UnrealLink 安装:fix Detected compiler newer than Visual Stu…...

【0393】Postgres内核 checkpointer process ③ 构建 WAL records 工作缓存区

1. 初始化 ThisTimeLineID、RedoRecPtr 函数 InitXLOGAccess() 内部会初始化 ThisTimeLineID、wal_segment_size、doPageWrites 和 RedoRecPtr 等全局变量。 下面是这四个变量初始化前的值: (gdb) p ThisTimeLineID $125 = 0 (gdb) p wal_segment_size $126 = 16777216 (gdb…...

pc 端 TensorRT API 实现 YOLOv11 的 C++ 小白部署经验

标题1 模型转化 python 先下载项目 https://github.com/ultralytics/ultralytics 同时下载模型 https://github.com/ultralytics/assets/releases/download/v8.3.0/yolo11n.pt pythonconda虚拟环境&#xff0c;主要是以下三个&#xff0c;其余缺什么直接pip anaconda…...

LLM - 大模型 ScallingLaws 的 C=6ND 公式推导 教程(1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/145185794 Scaling Laws (缩放法则) 是大模型领域中&#xff0c;用于描述 模型性能(Loss) 与 模型规模N、数据量D、计算资源C 之间关系的经验规律…...

【机器学习实战】kaggle 欺诈检测---使用生成对抗网络(GAN)解决欺诈数据中正负样本极度不平衡问题

【机器学习实战】kaggle 欺诈检测---如何解决欺诈数据中正负样本极度不平衡问题https://blog.csdn.net/2302_79308082/article/details/145177242 本篇文章是基于上次文章中提到的对抗生成网络&#xff0c;通过对抗生成网络生成少数类样本&#xff0c;平衡欺诈数据中正类样本极…...

C++ 之多线程相关总结

C 之多线程相关总结 1.多线程相关基础知识 1.1 线程的创建和管理 1. std::thread 类&#xff1a; 用于创建和管理线程。通过将可调用对象&#xff08;如函数、函数对象、lambda 表达式&#xff09;作为参数传递给 std::thread 的构造函数&#xff0c;可以创建一个新的线程。…...

基于机器学习随机森林算法的个人职业预测研究

1.背景调研 随着信息技术的飞速发展&#xff0c;特别是大数据和云计算技术的广泛应用&#xff0c;各行各业都积累了大量的数据。这些数据中蕴含着丰富的信息和模式&#xff0c;为利用机器学习进行职业预测提供了可能。机器学习算法的不断进步&#xff0c;如深度学习、强化学习等…...

性能测试 - Locust WebSocket client

Max.Bai 2024.10 0. 背景 Locust 是性能测试工具&#xff0c;但是默认只支持http协议&#xff0c;就是默认只有http的client&#xff0c;需要其他协议的测试必须自己扩展对于的client&#xff0c;比如下面的WebSocket client。 1. WebSocket test Client “”“ Max.Bai W…...

量子计算将彻底改变商业分析

虽然量子计算听起来颇具未来感&#xff0c;但这项技术正迅速走向成熟 —— 就如同 ChatGPT 这类人工智能&#xff08;AI&#xff09;工具一样。我相信&#xff0c;量子计算技术所产生的连锁反应很快就会对业务分析领域产生巨大影响。 什么是量子计算&#xff1f; 尽管名字听起…...

爬山算法与模拟退火算法的全方面比较

一、基本概念与原理 1. 爬山算法 爬山算法是一种基于启发式的局部搜索算法,通过不断地向当前解的邻域中搜索更优解来逼近全局最优解。它的核心思想是,从当前解出发,在邻域内找到一个使目标函数值更大(或更小)的解作为新的当前解,直到找不到更优的解为止。 2.模拟退火算…...

【深度学习】用RML2018训练好模型去识别RML2016的数据会遇到输入维度不匹配的问题,如何解决?

文章目录 问题解决办法1. 调整输入数据长度2. 修改模型结构(我个人比较推崇的方法)3. 迁移学习4. 重新训练模型5. 数据增强6. 其他差异问题 经常会有人问的一个问题: 我用RML2018跑的调制识别模型,用RML2016数据集能直接识别吗?(2018数据集信号样本的长度是1024,2016数据集…...

2025年1月17日(点亮一个 LED)

系统信息&#xff1a; Raspberry Pi Zero 2W 系统版本&#xff1a; 2024-10-22-raspios-bullseye-armhf Python 版本&#xff1a;Python 3.9.2 已安装 pip3 支持拍摄 1080p 30 (1092*1080), 720p 60 (1280*720), 60/90 (640*480) 已安装 vim 已安装 git 学习目标&#xff1a;…...

商用车电子电气零部件电磁兼容条件和试验(8)—辐射抗干扰(ALSE)和便携式发射机抗干扰(HPT)

写在前面 本系列文章主要讲解商用车电子/电气零部件或系统的传导抗干扰、传导发射和辐射抗干扰、电场辐射发射以及静电放电等试验内容及要求,高压试验项目内容及要求。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 目录 商用车电子电气零部件电磁兼容条件和试验—目录…...

NumPy;NumPy在数据分析中的应用;NumPy与其他库的搭配使用

NumPy&#xff1b;NumPy在数据分析中的应用&#xff1b;NumPy与其他库的搭配使用 NumPy&#xff1a;Python 数据分析的核心工具什么是 NumPy&#xff1f;NumPy 的主要优势 NumPy 在数据分析中的应用1. 数据处理与清洗2. 数学和统计分析3. 数组变换与矩阵运算 NumPy 与其他库的搭…...

机器学习经典无监督算法——聚类K-Means算法

目录 算法原理 算法步骤 算法API 算法导入 API参数理解 算法实现 算法原理 Kmeans 算法是一种无监督的聚类算法&#xff0c;目的是将数据集中的样本划分到 K 个不同的簇中。 聚类&#xff1a;将数据集中相似的数据点归为一组或一个簇的过程。 数据集&#xff1a;一组相…...

网络变压器的分类

网络变压器是局域网(LAN)中各级网络设备中必备的元件。它们的主要功能是传输数据&#xff0c;增强信号&#xff0c;并提供电气隔离&#xff0c;以防雷保护和匹配阻抗。网络变压器也被称为数据泵或网络隔离变压器。它们广泛应用于网络交换机、路由器、网卡、集线器等设备中。 网…...

【MySQL】复合查询+表的内外连接

复合查询表的内外连接 1.基本查询回顾2.多表查询3.自连接4.子查询4.1单列子查询4.2多列子查询 5.在from子句中使用子查询6.合并查询7.表的内连和外连7.1内连接7.2外连接7.2.1左外连接7.2.2右外连接 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f…...

创建模式、结构模式及行为模式

谁在什么地方提供什么功能&#xff1f; 要设计几个类?这些类各个是什么功能&#xff1f;相互间的关系是什么&#xff1f; 创建模式指的是对象那么多&#xff0c;怎么把它"生"出来&#xff1f;生几个&#xff1f;从这个角度上来说数组就是一种另类的创建模式。主要…...

警惕IDEA 2024版重大Bug问题:LomBok失效、Gradle冲突、Spring Boot启动错误

一直以来我认为工具类的软件是越新越好&#xff0c;因为工具代表着一定的先进性&#xff1b;但是IDEA 2024好好的给我上了一课&#xff0c;比如lombok 不起作用、比如Spring Boot 3.4.x 启动报错、再比如MyBatis log plus冲突、再比如Gradle插件冲突. 一、Lombok 失效问题 请不…...

C语言中char str和char str[]的区别

char* str和char* str[]的区别&#xff1a;C语言中char *str[] 和char *str有什么区别-CSDN博客 char str 和 char str[] 在 C 语言中也有不同的含义和用途&#xff0c;以下是它们的区别&#xff1a; 1. char str 类型&#xff1a;这是一个单一的字符变量。 用途&#xff1a…...

(学习总结20)C++11 可变参数模版、lambda表达式、包装器与部分新内容添加

C11 可变参数模版、lambda表达式、包装器与部分新内容添加 一、可变参数模版基本语法及原理包扩展emplace系列接口 二、lambda表达式lambda表达式语法捕捉列表lambda的原理lambda的应用 三、包装器bindfunction 四、部分新内容添加新的类功能1.默认的移动构造和移动赋值2.声明时…...