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

中国500强企业排名表/网站优化排名易下拉效率

中国500强企业排名表,网站优化排名易下拉效率,wordpress内涵主题,wordpress创建搜索框矩阵平方和的计算 矩阵平方和的定义 矩阵平方和的定义是对矩阵中的每一个元素进行平方,然后求和。 对于一个矩阵 A A A,其平方和定义为: sum ∑ i 1 m ∑ j 1 n A ( i , j ) 2 \text{sum} \sum_{i1}^{m}\sum_{j1}^{n} A(i,j)^2 sumi1∑…

在这里插入图片描述

矩阵平方和的计算

矩阵平方和的定义

矩阵平方和的定义是对矩阵中的每一个元素进行平方,然后求和。

对于一个矩阵 A A A,其平方和定义为:

sum = ∑ i = 1 m ∑ j = 1 n A ( i , j ) 2 \text{sum} = \sum_{i=1}^{m}\sum_{j=1}^{n} A(i,j)^2 sum=i=1mj=1nA(i,j)2

这个平方和计算,在某些机器学习的算法中、或者特殊的优化问题中都会涉及到。

矩阵平方和的计算方法

通常而言,前面的公式就给出了计算的方法,无论怎么做,都会涉及到对矩阵中的每一个元素进行平方,然后求和。
因此算法的时间复杂度是 O ( m ∗ n ) O(m*n) O(mn),其中 m m m是矩阵的行数, n n n是矩阵的列数,当 A A A是方阵时, m = n m=n m=n
最终,算法的效率取决于矩阵的表示形式和对矩阵元素的访问方式。
当然,还有可能会有一些特殊的优化方法,比如矩阵的特殊性质,可以通过一些特殊的方法来计算,这里不做考虑。

最后,就是并行指令集的使用,比如SIMD指令集,这里也不进行相关的讨论。

下面,就主要是对在Matlab中实现矩阵平方和的几种方法进行比较。其实比较的是Matlab中访问矩阵元素的方式的性能差异。

Matlab的若干实现

我们非常随意的实现了一些方法。

其中最重要的就是所谓的基线方法。这个方法通常选择一个最简单/直观的方法,便于抓住算法中的核心要素。
然后作为对比的基准,也能够对不同算法的性能进行比较。

这种研究办法,是一种常见的研究方法。例如,在优化算法中,通常选择格子搜索或者随机搜索作为基线方法。
提出一种新的方法,通常希望能够对比基线方法有更好的性能,并且这种性能提升是显著的。
此外,也会结合新算法与基线算法的执行过程来解释算法优势的原理,这就是一般算法研究文章中非常重要的理论分析。

function sumRet = bench_loop_row_column(A)% 按照行、列的方式进行循环求和,基线算法% 内存:O(1)% 时间:O(m*n) ~ O(n^2)[m, n] = size(A);sumRet = 0;% 对行进行循环for i = 1:m% 对列进行循环for j = 1:nsumRet = sumRet + A(i, j) ^ 2;end% 列循环结束end% 行循环结束,
end

上面这个最为直观的算法,就是对矩阵的每一行进行遍历,然后对每一行的每一个元素进行平方,然后求和。
这个作为基线是一个恰当的选择。

相应的,我们就会想到先循环列,再循环行来作为对基线算法的改进。

function sumRet = bench_loop_column_row(A)% 按照列、行的方式进行循环求和,第一次改进的算法% 充分考虑到矩阵的存储方式:列优先% 内存:O(1)% 时间:O(m*n) ~ O(n^2)[m, n] = size(A);sumRet = 0;for i = 1:nfor j = 1:msumRet = sumRet + A(j, i) ^ 2;endendend

考虑到Matlab能够直接索引列,我们就可以考虑对每列进行循环,直接对列进行操作。或者,换成对行进行操作。
下面几个算法就是行、列操作的形式,这里又有一个小小的差别,就是使用更多内存来直接进行向量加法,最后调用sum求和。
或者还可以在循环内部调用sum函数,这样内存的使用会从 O ( n ) \mathcal{O}(n) O(n)降低到

function s = bench_loop_column_sum(A)% 直接循环列,采用向量化的方式访问每个列% 用一个向量来存储每一列和% 最终调用sum函数求和% 内存:O(n)% 时间:考虑到,向量加法的时间复杂度是O(n)% 所以,这里的时间复杂度依然是O(m*n) ~ O(n^2)N = size(A, 2);v = zeros(size(A, 1), 1);for i = 1:Nv = v + A(:, i) .^ 2;ends = sum(v);
end
function s = bench_loop_sum_column(A)% 直接循环列,采用向量化的方式访问每个列% 直接对列调用sum函数求列和,最终累加求和% 内存:O(1)% 时间:O(m*n) ~ O(n^2),这里同样认为.^ 的时间复杂度是O(n)s = 0;N = size(A, 2);for i = 1:Ns = s + sum(A(:, i) .^ 2);endend
function s = bench_loop_row_sum(A)% 直接循环行,采用向量化的方式访问每行% 用一个向量来存储行和% 最终调用sum函数求和% 内存:O(n)% 时间:考虑到,向量加法的时间复杂度是O(n)% 所以,这里的时间复杂度依然是O(m*n) ~ O(n^2)N = size(A, 1);v = zeros(1, size(A, 2));for i = 1:Nv = v + A(i, :) .^ 2;ends = sum(v);
end
function s = bench_loop_sum_row(A)% 直接循环行,采用向量化的方式访问每个行% 直接对行调用sum函数求行和,最终累加求和% 内存:O(1)% 时间:O(m*n) ~ O(n^2),这里同样认为.^ 的时间复杂度是O(n)s = 0;N = size(A, 1);for i = 1:Ns = s + sum(A(i, :) .^ 2);endend

接下来,我们利用矩阵的向量访问方式来构造一个算法。

function s = bench_loop_vec(A)% 直接将矩阵展开成一个向量,循环求和% 内存:O(1)% 时间:O(m*n) ~ O(n^2)s = 0;N = numel(A);for i = 1:Ns = s + A(i) .^ 2;endend

此外,sum函数也提供了两个算法变体,一个是调用两次(默认对行求和)

function s = bench_sum_sum(A)% 直接两次调用sum函数,对矩阵进行求和s = sum(sum(A .^ 2));
end
function s = bench_sum_all(A)% 直接调用一次sum函数,对矩阵进行求和s = sum(A .^ 2, 'all');
end

还可以把sum与矩阵列向量访问形式结合起来,构成一种算法。

function s = bench_sum_vec(A)% 直接将矩阵展开成一个向量% 进行元素.^计算,调用sum函数求和s = sum(A(:) .^ 2);
end

最后还是利用矩阵的向量展开方式,就是两个其实一样的算法,因为dot函数内部就是调用矩阵乘法。

function s = bench_vec_dot(A)% 直接将矩阵展开成一个向量,进行点积计算s = dot(A(:), A(:));
end
function s = bench_matrix_mul(A)% 直接将矩阵展开成一个向量,进行矩阵乘法计算s = A(:).' * A(:);
end

这些算法都非常平常,但是,通过上面的联系,也能提升我们对Matlab的矩阵操作的理解。
接下来就是对这些算法的性能进行比较。

性能比较

性能比较方法

时间性能比较,一般可以直接利用timeit函数来完成,这个函数会对一个函数进行多次调用,然后求中位数。
这个函数还能包括输出变量的构造时间。

利用这个函数,我们编了一个工具,对不同规模的矩阵进行比较。
这里代码的注释非常清楚,无需赘述。

%% Benchmark functions helper
function [n, result] = bench_f_n(n, f)% 按照给定的参数,对函数进行测试% n: 矩阵大小% f: 函数句柄% 返回值:n, result% n: 矩阵大小的向量, result: 运行时间的向量argumentsn (:, :) {mustBePositive}f function_handleend% 保证n是一个向量,并且是正整数n = round(n(:));result = zeros(1, numel(n));%  对每一个n进行测试,直接采用for循环,不使用arrayfunfor i = 1:numel(n)A = rand(n(i), n(i));result(i) = timeit(@()f(A));end% result = arrayfun(@(x) timeit(@()f(rand(x, x))), n);% 这样也是可以的,但是,对于此处,上面的写法更加直观% 这就是采用for循环的地方% 为了代码的可读性,并且对性能的影响不大,因为这里的循环次数不多
end

性能比较代码

我们把前面的算法代码和上面的性能比较代码放在一个+benchobjs的目录中,就构成一个namespace命名空间,通过import benchobjs.*来导入这些函数。
编写如下的测试脚本:

  • Matlab code
    • 设置测试范围
    • 运行测试获取数据
    • 可视化测试结果
%% import functions in benchobjs
import benchobjs.*;%% setup problem
n = round(logspace(3, 4, 10));
functions = {@bench_loop_row_column, @bench_loop_column_row, ...@bench_loop_column_sum, @bench_loop_sum_column, ...@bench_loop_row_sum, @bench_loop_sum_row, ...@bench_loop_vec, @bench_sum_sum, ...@bench_sum_all, @bench_sum_vec, ...@bench_vec_dot, @bench_matrix_mul};
markers = {'o', 'x', '+', '*', 's', 'd', '^', 'v', '>', '<', 'p', 'h'};
% 这里是常见的小技巧,将函数的句柄存储在一个cell数组中
% 这样可以方便的对这些函数进行遍历
% 同时,把线型标签也存储在一个cell数组中,这样可以方便的对这些线型进行遍历%% calculation
results = cell(numel(functions), 2);for i = 1:numel(functions)[n, result] = bench_f_n(n, functions{i});results{i, 1} = n;results{i, 2} = result;fprintf('%s: %s: %s\n', func2str(functions{i}), ...mat2str(n), mat2str(result));
endcmd = sprintf('save compareMatrixSquareSum%d  results', maxNumCompThreads);
eval(cmd);% 这里试图考虑到多线程的影响,目前在12核心的及其上进行了不同线程数的测试
% 发现对于这个问题,多线程并没有展现出过大的差别
%% Visualize
% 一般也会把原始数据画出来稍微看一下
% 为了确保数据的正确性,并且可以对数据进行初步的分析
figure;
clf;for i = 1:numel(functions)[n, result] = results{i, :};plot(n, result, 'LineWidth', 2, 'Marker', markers{i});yscale('log');hold on;fprintf('%s: %s: %s\n', func2str(functions{i}), ...mat2str(n), mat2str(result));
endlegend(cellfun(@(f)cellref(split(func2str(f), '.'), 2), ...functions, 'UniformOutput', false), ...'Location', 'BestOutSide', "interpreter", "none");
xlabel('Matrix size');
ylabel('Time (s)');
grid on% exportgraphics(gcf, '../matlab-img/compareMatrixSquareSum-time.png', ...
%   'Resolution', 600);%% Visualize 2
% 针对基准的加速比,这是最常见的基准测试结果的展示方式
figure;
clf;for i = 2:numel(functions)[n, result] = results{i, :};plot(n, results{1, 2} ./ result, ...'LineWidth', 2, 'Marker', markers{i});hold on;fprintf('%s: %s: %s\n', func2str(functions{i}), ...mat2str(n), mat2str(result));
endlegend(cellfun(@(f)cellref(split(func2str(f), '.'), 2), ...functions(2:numel(functions)), 'UniformOutput', false), ...'Location', 'BestOutSide', "interpreter", "none");
xlabel('Matrix size');
ylabel('Time (s)');
grid on% exportgraphics(gcf, '../matlab-img/compareMatrixSquareSum-acc.png', ...
%   'Resolution', 600);%% Visualize 2
% 去掉基准和两个最好的函数,这样可以进行更加细节的比较和分析
% 这里必要性不太大,主要是为了展示这种方式
figure;
clf;for i = 2:numel(functions) - 2[n, result] = results{i, :};plot(n, results{1, 2} ./ result, ...'LineWidth', 2, 'Marker', markers{i});hold on;fprintf('%s: %s: %s\n', func2str(functions{i}), ...mat2str(n), mat2str(result));
endlegend(cellfun(@(f)cellref(split(func2str(f), '.'), 2), ...functions(2:numel(functions) - 2), 'UniformOutput', false), ...'Location', 'BestOutSide', "interpreter", "none");
xlabel('Matrix size');
ylabel('Time (s)');
grid on% exportgraphics(gcf, '../matlab-img/compareMatrixSquareSum-acc-2.png',...
%    'Resolution', 600);```

性能比较结果

最终,可以得到如下的性能比较结果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

首先,不同算法的性能有一定差异。基本上,算法分为两组,也可以视为三组。

  • 第一组是基线算法,对每一行进行遍历,然后对每一个元素进行平方,然后求和。
  • 第二组是向量展开访问并调用矩阵乘法(mtimes直接调用BLAS二进制库)的两个算法,性能相当。
  • 其他就是各种循环的组合以及sum函数的组合。

这个分组,按照加速比来看,更加明显。
向量展开+矩阵乘法的算法在1000~10000的规模下,性能均有显著提升,从15倍到40倍。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

除去基线算法和向量化算法,其他算法的关系较为复杂,但是也能通过进行列访问、部分向量化来获得几倍的性能提升。
这充分显示了列优先矩阵访问对与计算效率的影响。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

总结

  • 进行算法开发,一定要按照基线算法、算法优化的思路来考虑。
  • 对算法的效率进行比较,最好选择不同的规模来分析问题。
  • 加速比是一个很好的指标,能够直观的看出算法的性能提升。

相关文章:

041_Compare_Matrix_Squre_Sum_in_MATLAB中矩阵平方和的比较

矩阵平方和的计算 矩阵平方和的定义 矩阵平方和的定义是对矩阵中的每一个元素进行平方&#xff0c;然后求和。 对于一个矩阵 A A A&#xff0c;其平方和定义为&#xff1a; sum ∑ i 1 m ∑ j 1 n A ( i , j ) 2 \text{sum} \sum_{i1}^{m}\sum_{j1}^{n} A(i,j)^2 sumi1∑…...

TimeXplusplus——提高时间序列数据的可解释性,避免琐解和分布偏移问题的深度学习可解释性的框架

摘要 论文地址&#xff1a;https://arxiv.org/abs/2405.09308 源码地址&#xff1a;https://github.com/zichuan-liu/timexplusplus 信号传输技术的优化对于推动光通信的发展至关重要。本文将详细探讨线路编码技术的目标及其实现方式。线路编码旨在提高带宽和功率效率&#xf…...

批处理读取文本第n行并赋值给变量?--遍历所有行并赋值给变量数组

::TraceLines.bat goto :test1http://www.bathome.net/thread-27229-1-1.html#批处理如何获取txt文本中某行某列的内容/指定行指定列的内容 http://www.bathome.net/thread-47304-1-1.html#如何用批处理读取文本第二行并赋值给变量&#xff1f; https://github.com/npocmaka/ba…...

嵌入式入门Day26

IO Day2 IO相关函数标准文件流指针缓冲区刷新时机作业 IO相关函数 time #include <time.h>time_t time(time_t *tloc);功能&#xff1a;返回1970年到现在的秒数参数&#xff1a;计算出来的秒数&#xff1b;返回值&#xff1b;成功返回1970年到现在的秒数&#xff0c;失…...

【Vue3项目实战系列一】—— 从零开始一个vue3项目 vue3+javascript+vite 非常详细 手把手教学

&#x1f609; 你好呀&#xff0c;我是爱编程的Sherry&#xff0c;很高兴在这里遇见你&#xff01;我是一名拥有十多年开发经验的前端工程师。这一路走来&#xff0c;面对困难时也曾感到迷茫&#xff0c;凭借不懈的努力和坚持&#xff0c;重新找到了前进的方向。我的人生格言是…...

Python_Flask04(牛马问答平台01)

项目名称&#xff1a;牛马问答平台 项目简介&#xff1a;1.主要用来给社会上的牛马们探讨老板的恶心之处。 2. 用来学习交流。 技术手段&#xff1a;Python3.x Flask render_template pymysql flask_sqlalchemy........ 注意该博客为迭代项目&#xff0c;于最后一期展示完整…...

Java转C之并发和多线程

提纲&#xff1a; 概念介绍与对比概述 简述Java与C在并发和多线程方面的核心区别解释C11标准、POSIX、C11 <threads.h>、Pthread等名词 Java多线程与并发回顾 线程、Runnable、ExecutorService概念说明同步关键字与工具类含义 C并发基础 没有Java式的内置线程类&#xf…...

针对一个系统的权限管理这样的业务场景,使用各设计模式解说

通义灵码 下面将介绍如何在Java中使用不同的设计模式来实现权限管理系统。每个设计模式都有其特定的应用场景和实现方式&#xff0c;我们将逐一讲解。 1. 单例模式 (Singleton Pattern) 应用场景&#xff1a;确保权限管理服务在整个系统中只有一个实例&#xff0c;避免重复创…...

Android AppCompatImageView View.Gone状态切换到View.VISIBLE重新layout,Kotlin

Android AppCompatImageView View.Gone状态切换到View.VISIBLE重新layout&#xff0c;Kotlin import android.content.Context import android.util.AttributeSet import android.util.Log import androidx.appcompat.widget.AppCompatImageViewclass MyImageView : AppCompatI…...

在云上轻松部署达梦数据库

达梦数据库&#xff08;DM Database&#xff09;是由达梦数据库有限公司开发的一款关系型数据库管理系统&#xff08;RDBMS&#xff09;。作为国内领先的数据库产品&#xff0c;达梦数据库在政府、金融、能源、电信、交通、医疗、教育等多个行业得到广泛应用&#xff0c;尤其在…...

什么是厄尔米特(Hermitian)矩阵?

厄米矩阵&#xff08;Hermitian Matrix&#xff09;定义 在数学和物理中&#xff0c;厄米矩阵是满足以下条件的复方阵&#xff1a; A A † \mathbf{A}\mathbf{A}^\dagger AA† 其中&#xff0c; A † \mathbf{A}^\dagger A†表示矩阵 A \mathbf{A} A的共轭转置&#xff0c;即…...

React - useActionState、useFormStatus与表单处理

参考文档&#xff1a;react18.3.1官方文档 一些概念&#xff1a; React 的 Canary 和 Experimental 频道是 React 团队用于发布和测试新功能的渠道。 useActionState useActionState 是一个可以根据某个表单动作的结果更新 state 的 Hook。 const [state, formAction, isPe…...

v3账号密码登录随机图片验证码

安装插件 pnpm i identify --save图形验证码组件 <template><div class"s-canvas"><!-- 图形验证码的宽和高都来自于父组件的传值&#xff0c;若父组件没有传值&#xff0c;那么就按当前子组件的默认值进行渲染 --><canvas id"s-canvas&…...

不只是请求和响应:使用Fiddler解读Cookie与状态码全指南(下)

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 不只是请求和响应&#xff1a;使用Fiddler抓包HTTP协议全指南(上)_fiddler 获取响应脚本-CSDN博客https://blog.csdn.net/Chunfeng6yugan/article/details/144005872?spm1001.2014.3001.5501 不只是请求和响…...

java+springboot+mysql游乐园管理系统

项目介绍&#xff1a; 使用javaspringbootmysql开发的游乐园管理系统&#xff0c;系统包含管理员、员工、用户角色&#xff0c;功能如下&#xff1a; 管理员&#xff1a;登录后台&#xff1b;首页数据统计&#xff1b;员工管理&#xff1b;用户管理&#xff1b;游乐项目管理&…...

@RequestBody,getparameter,@RequestParam,@PathVariable之间的区别和联系

RequestBody、RequestParam、PathVariable和getParameter&#xff08;你提到的可能是Java Servlet API中的方法&#xff09;是用于处理HTTP请求参数的不同机制。它们各自有不同的用途和适用场景&#xff0c;下面将详细解释它们之间的区别和联系。 1. RequestBody 用途&#xf…...

Linx下自动化之路:Redis安装包一键安装脚本实现无网极速部署并注册成服务

目录 简介 安装包下载 安装脚本 服务常用命令 简介 通过一键安装脚本实现 Redis 安装包的无网极速部署&#xff0c;并将其成功注册为系统服务&#xff0c;开机自启。 安装包下载 redis-7.0.8.tar.gzhttp://download.redis.io/releases/redis-7.0.8.tar.gz 安装脚本 修…...

VMware虚拟机搭建和镜像配置

VMware虚拟机搭建和镜像配置 下载安装VMware 开始下载 更改安装路径&#xff0c;需要一个大空间的盘 更改后下一步 下一步后&#xff0c;选择不主动升级更新 一直下一步 直到安装完毕 输入许可密钥&#xff0c;我下载的版本是12&#xff0c;输入完成点击输入&#xff…...

红日靶场vulnstark 4靶机的测试报告[细节](一)

目录 一、测试环境 1、系统环境 2、注意事项 3、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、漏洞利用Getshell ①Struts 2 s2-045漏洞 手工利用s2-45漏洞 Msf综合利用 ②Tomcat框架(CVE-2017-12615) ③phpMyAdmin(CVE-2018-12613) 构造语句写入冰蝎木…...

深入详解人工智能机器学习常见算法——线性回归算法

深入解析线性回归算法 线性回归是机器学习和统计学中最基本、最常用的预测建模技术之一。它通过线性关系描述因变量与一个或多个自变量之间的联系&#xff0c;帮助我们进行数据建模和预测。本篇文章将详细介绍线性回归的基础知识、算法原理、核心概念、实现方法以及其在实际问题…...

Python 开发环境搭建

Python 开发环境搭建 flyfish 版本 Ubuntu 22.04.5 LTS PyTorch 2.5.1 cuda 12.4 python 3.12.7安装 Anaconda3 依赖 sudo apt-get install libgl1-mesa-glx libegl1-mesa libxrandr2 libxrandr2 libxss1 libxcursor1 libxcomposite1 libasound2 libxi6 libxtst6安装命令 …...

OpenCV相机标定与3D重建(9)相机标定函数calibrateCameraRO()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::calibrateCameraRO 是 OpenCV 中用于相机标定的函数&#xff0c;它允许固定某些点来进行更精确的标定。 函数原型 double cv::calibrateCa…...

flink终止提交给yarn的任务

接上文&#xff1a;一文说清flink从编码到部署上线 1.查看正在执行的flink 访问地址&#xff08;参考&#xff09;&#xff1a;http://10.86.97.191:8099/cluster/apps 2.终止任务 yarn application -kill appID 本文为&#xff1a; yarn application -kill application_17…...

算法刷题Day14:BM36 判断是不是平衡二叉树

题目链接 描述 输入一棵节点数为 n 二叉树&#xff0c;判断该二叉树是否是平衡二叉树。 在这里&#xff0c;我们只需要考虑其平衡性&#xff0c;不需要考虑其是不是排序二叉树 平衡二叉树&#xff08;Balanced Binary Tree&#xff09;&#xff0c;具有以下性质&#xff1a;它是…...

【Golang】Go语言编程思想(六):Channel,第一节,介绍Channel

Channel 下面的几个例子将会展示如何定义一个 channel&#xff1a; func chanDemo() {var c chan int // chan int 的含义是, c 是一个 channel, 里面的内容是 int// 上面的声明语句将会创建一个 nil channel, c nil, 它的作用将在 select 当// 中体现 }创建一个非 nil 的 c…...

【Flux.jl】 卷积神经网络

Flux.jl 是包含卷积神经网络的, 但是官方API文件中没有给出一个完整的程序框架, 只是对所需神经元给了局部解释, 此外对 model-zoo 模型动物园中的案例没有及时跟着 Flux.jl 的版本更新, 也无法运行出来结果。 因此本文搭建了一个完整可训练的卷积神经网络。 Conv 卷积算子…...

大模型在辅导场景的深度应用,猿辅导素养课推出启发性“AI作文通”

猿辅导集团旗下的飞象星球面向学校发布“飞象AI作文”&#xff0c;让教育大模型成为老师的AI批改助手、学生的写作助手。芥末堆注意到&#xff0c;猿辅导集团旗下的猿辅导素养课也推出了名为“AI作文通”的AI作文功能&#xff0c;已于7月正式大规模上线&#xff0c;在AI教育领域…...

深入了解架构中常见的4种缓存模式及其实现

4种缓存模式 随着应用程序的复杂性日益增加&#xff0c;缓存管理变得至关重要。缓存不仅能有效减轻数据库负载&#xff0c;还能显著提升数据访问速度。选择合适的缓存模式能够在不同的业务场景下发挥出最佳效果。 本文将详细介绍四种常见的缓存模式&#xff1a;Cache-Aside (…...

Hermes engine on React Native 0.72.5,function无法toString转成字符串

问题描述 Hermes engine on React Native 0.72.5&#xff0c;function无法toString转成字符串 环境 npm6.14.18 node16.17.1项目依赖 "react": "18.2.0", "react-dom": "18.2.0", "react-native": "0.72.5", …...

Spring Boot + MySQL 多线程查询与联表查询性能对比分析

Spring Boot MySQL: 多线程查询与联表查询性能对比分析 背景 在现代 Web 应用开发中&#xff0c;数据库性能是影响系统响应时间和用户体验的关键因素之一。随着业务需求的不断增长&#xff0c;单表查询和联表查询的效率问题日益凸显。特别是在 Spring Boot 项目中&#xff0…...