SAP ABAP性能优化
1.前言
ABAP作为SAP的专用的开发语言,衡量其性能的指标主要有以下两个方面:
响应时间:对于某项特定的业务请求,系统在收到请求后需要多久返回结果
吞吐量:在给定的时间能,系统能够处理的数据量
2. ABAP语言的运行原理
首先,先了解下SAP系统基本架构,看一看ABAP程序的运行原理。
SAP自从R/3开始使用三层架构的系统模型,即:
表现层(可通过SAPGUI或浏览器等方式,执行具体的SAP应用程序)
业务逻辑层(ABAP应用程序运行在SAP NetWeaver的ABAP应用服务器上)
数据库访问层(在程序运行过程中,对DB2或HANA等数据库的访问)
在下图的展示中,可以看到,SAP系统也是由最底层文件系统,数据库管理系统,应用服务器、表现层的UI构成。
ABAP语言的执行环境是ABAP应用服务器,其为ABAP程序分配运行所需要内存、工作进程。由此可以看到,ABAP程序的主要用时有两个方面,
一是由程序复杂度决定的work process的运行时间,
另一部分是在运行过程中,对不同位置的数据访问(增、删、改、查)时间。
3. 在哪些方面进行优化?
当访问不同位置的数据时,所需要消耗的时间单位也是不同的。由于硬盘转速的物理极限和数据库的通信连接等原因,访问数据库硬盘的时间消耗要较访问应用服务器内存中的数据,时间花费的要更多。访问各部分的时间消耗关系是:访问数据库 > 访问数据库缓存 > 共享内存/缓存 > 工作进程。
因此,对于ABAP程序的性能优化,可从以下角度介绍使用场景和运用过程中的最佳实践。包括:
如何合理地访问数据库?
如何使用数据库缓存?
如何选用内表?
如何使用batch job?
…
ABAP性能调优工具的使用等
【01】SAP ABAP性能优化 - 如何减少DB的访问次数?
方法1:尽量使用内表进行数据库的批量操作.
这个原则很好理解,例如,要向数据库中插入100条数据,那么可以通过内表批量操作。
与其使用一般的 loop-endloop 方法来实现向内表添加多条记录,不如使用 append 命令的变体将一个内表的所有记录一次性添加入另一个内表。要注意的是两个内表的结构定义必须完全一样。
* -- Bad -- *
LOOP AT lt_sflight INTO ls_sflight.INSERT INTO sflight VALUES ls_sflight.
ENDLOOP.* -- 推荐使用1-- *
INSERT INTO sflight FROM TABLE lt_sflight.* -- 推荐使用2-- *
Append lines of int_fligh1 to int_fligh2.
修改一个内表的多行纪录
使用modify命令的不同形式加快这种操作的处理速度
"不建议使用:Loop at int_fligh.If int_fligh-flag is initial.Int_fligh-flag = ‘X’.Endif.Modify int_fligh.Endloop."建议使用:Int_fligh-flag = ‘X’.Modify int_fligh transporting flag where flag is initial.
方法2:使用Join进行在DB层级进行数据的处理
如果通过JOIN能够完成数据的处理,则尽可能减少在ABAP的AS进行处理。
* -- Bad -- *
SELECT carrid connid fldate FROM sflight INTO (xcarrid, xconnid, xfldate) WHERE planetype = '727-200'.SELECT bookid FROM sbook INTO ybookidWHERE carrid = xcarridAND connid = xconnidAND fldate = xfldate.WRITE: / xcarrid, xconnid, ybookid.ENDSELECT.
ENDSELECT.* -- Good-- *
SELECT f~carrid f~connid b~bookidINTO (xcarrid, xconnid, ybookid) FROM sflight AS fINNER JOIN sbook AS bON f~carrid = b~carrid AND f~connid = b~connid AND f~fldate = b~fldateWHERE planetype = '727-200'.WRITE: / xcarrid, xconnid, ybookid.
ENDSELECT.
方法3:使用视图取代基本表,将常用的INNER JOIN创建成DDIC的JOIN VIEW
通过这种方式,在ABAP程序中,可以直接使用VIEW来读取数据多个表的JOIN数据集。
方法4:使用子查询
当需要对同一张表进行多次访问时,可以考虑使用子查询的方式,减少DB的访问次数。
* 举例:确定哪一天的航班预定出座位最多的?* 方式1:双层select。首先选择出预定最多的航班信息,再确定具体的日期。
DATA: ls_sflight TYPE sflight,lv_max TYPE i.
SELECT carrid connid MAX( seatsocc )FROM sflightINTO (ls_sflight-carrid, ls_sflight-connid, lv_max)GROUP BY carrid connid.SELECT fldate FROM sflightINTO ls_sflight-fldateWHERE carrid = ls_sflight-carridAND connid = ls_sflight-connidAND seatsocc = lv_max.WRITE: / ls_sflight-carrid, ls_sflight-connid, ls_sflight-fldate.ENDSELECT.ENDSELECT.* 方式2:使用子查询。单层SELECT直接选择出航班信息和日期信息,将最大的座位数在子查询中确定。
SELECT carrid connid fldateFROM sflight AS fINTO (ls_sflight-carrid, ls_sflight-connid, ls_sflight-fldate)WHERE seatsocc IN ( SELECT MAX( seatsocc )FROM sflightWHERE carrid = f~carridAND connid = f~connid ).WRITE: / ls_sflight-carrid, ls_sflight-connid, ls_sflight-fldate.
ENDSELECT.
【02】SAP ABAP性能优化 - 如何减少与DB交互的数据量?
为提升程序性能,在ABAP编程过程中应尽量减少DB的访问次数。与此同时,在访问DB时还应尽量减小在与DB交互的数据量,这样可减小DB通信的网络负担,提升访问速度。可通过下面方式达到“减少DB交互数据量”的目标。
方式1: 避免 SELECT *
这一点很好理解,也就是在搜索时,显性指定所需的字段。尽量避免返回不必要的数据,因为任何一个字段的选取,DB都会进行相关的遍历查找,与DB交互时应尽量将数据遍历时间降到最低。
不要图方便使用SELECT * FROM sflight INTO CORRESPONDING FIELD 这样的语句。
方式2:使用WHERE语句限定搜索范围
这一点不做过多解释,合理地使用WHERE语句是任何一种编程语言的通用规范。
方式3:避免在SELECT … ENDSELECT中使用CHECK等类似的判断语句
原因同第二点,合理地通过WHERE限定数据集,仅选取有效的数据进行处理;而非在选取后,再判断数据的有效性。
方式4:使用UP TO n ROWS来限定结果集数目
使用UP TO n ROWS特别适用于选取特定条件、特定数目的SELECT。看下面的例子,从DB中选取10位折扣最大的客户,应直接使用UP TO 10 ROWS, 而非每一次手动计数。
DATA: ls_scustom TYPE scustom,lt_scustom TYPE TABLE OF scustom WITH EMPTY KEY.* -- Bad --*
SELECT id name discountFROM scustomINTO (ls_scustom-id, ls_scustom-name, ls_scustom-discount)WHERE custtype = 'B'ORDER BY discount DESCENDING.IF sy-dbcnt > 10.EXIT.ENDIF.WRITE:/ ls_scustom-id, ls_scustom-name, ls_scustom-discount.
ENDSELECT.* -- Good --*
SELECT id name discountFROM scustom UP TO 10 ROWSINTO CORRESPONDING FIELDS OF TABLE lt_scustomWHERE custtype = 'B'ORDER BY discount DESCENDING.
方式5:在SELECT中使用聚合函数完成运算.
使用ABAP提供的集合函数取代ABAP代码来获得最大或最小值等。
其它可用集合函数还有 min (最小值), avg (平均值), sum (求和) and count (数据选择的行数).
在SELECT中,使用例如COUNT,SUM,MAX等函数完成数据的统计工作,直接返回运算结果。
DATA: lv_seatsocc TYPE sflight-seatsocc,lv_sum TYPE i VALUE 0.* -- Bad --*
SELECT seatsoccFROM sflight INTO lv_seatsoccWHERE carrid = 'LH'AND fldate LIKE '2018%'.lv_sum = lv_sum + lv_seatsocc.
ENDSELECT.* -- Good --*
SELECT SUM( seatsocc )FROM sflightINTO lv_sumWHERE carrid = 'LH'AND fldate LIKE '2018%'.
方式6:使用UPDATE …SET更新数据库
如果只需要更新DB中某一条数据中的特定几个字段,使用UPDATE … SET无疑是最佳的方式。
DATA: ls_sflight TYPE sflight.
SELECT * FROM sflightINTO ls_sflight UP TO 1 ROWSWHERE carrid = 'LH'.
ENDSELECT.
* option 1 -
ls_sflight-price = ls_sflight-price + 100.
UPDATE sflight FROM ls_sflight.
* option 2 -
ls_sflight-price = ls_sflight-price + 100.
UPDATE sflight SET price = ls_sflight-price
WHERE carrid = ls_sflight-carridAND connid = ls_sflight-connidAND fldate = ls_sflight-fldate.
【03】ABAP性能优化-语法上
ABAP程序基本上都需要从数据库里面抓数,所以性能很重要,同时有一些基本的,和优秀的写法是我们必须要掌握的,不然就会造成程序性能很差。下面给予总结(这里包括有很基本的,也包括有比较少用到的),推荐一个好的SAP标准文档ABAP_PERFORMANCE_DOS_AND_DONTS :
一、基本的几条需要避免的规则(具体的一些怎么替换,可以看三和五):
1、不使用select....endselect。
2、基本不使用select * ,select 需要的字段,数据量大时容易内存溢出dump。
3、LOOP 里面不用sort ,在loop外面排序完再进入LOOP。
4、尽量避免LOOP 里面嵌套select,这样多次访问数据库也会造成性能问题,但是有些时候避免不了也难免。改为外面select,LOOP里面read table。
5、大数据的read table,使用二分法查找 BINARY SEARCH,用之前要按关键字排序。
READ命令使用顺序查找数据表,这会降低处理速度。取而代之,使用binary search的附加命令,可以使用二分查找算法,可以帮助加快内表查找速度。 在使用binary search之前必须首先将内表排序,否则有可能找不到记录,因为二分查找反复将查找区间对半划分,如果要查找的值小于查找区间的中间位置的数据项值,则查找区间将缩小到前半个区间,否则查找将局限于后半区间。
不推荐使用:Read table int_fligh with key airln = ‘LF’.推荐使用:SORT int_fligh by airln.
Read table int_fligh with key airln = ‘LF’ binary search.
6、尽量避免LOOP里面嵌套LOOP,特别是当两个内表数据量都很大的时候,如果实在要嵌套LOOP可以参考三和五里面的解决办法。
7、尽量避免LOOP里面不用delete,append等语句。改成批量处理。
二、index和buffer的合理使用:
1、index的使用,在使用现有的index的时候注意,where条件里面的字段的顺序要跟index一致,而且可以可以适当的去匹配index,创建一些空的字段或者是index后面再加字段,或者是使用index抓出数据后,再去做其它条件的处理。
2、index里面最好只有'=' AND 或者是‘IN’。有其它逻辑条件,会影响index的使用。
3、 如果表是有buffer,可以考虑使用buffer,这样性能也可以有很好的提升,不过首先要去表看看这个是否有buffer:
SELECT SINGLE * FROM T100 INTO T100_WA
BYPASSING BUFFER
WHERE SPRSL = 'D'.
4、使用缓存表。大部分表都有buffer,而且这个我们很难控制,但是我们写出来的语句要尽可能避免“不读buffer”:在 select 命令后面使用 bypass buffer 附加语句可以明确跳过缓存表。推荐使用缓存表因为它可以显著提高程序速度。但是使用以下语句的时候缓存表会被跳过:
- Select distinct
- Select … for update
- Order by, group by, having字段
- Joins
5、一般程序到表抓数的时候,会在应用服务层有数据缓存,所以同一个程序,在不同时间先后跑,后面的通常会比较快,因为可以到数据缓存读数。
6、NOT,只能全表扫描,不要用not,换成反面。建议between 换成IN。不建议使用LIKE OR
三、使用一些简单的语句代替复杂的嵌套LOOP:
1、用批量处理的BAPI替换,LOOP 里面call BAPI,例如用BAPI_MATERIAL_SAVEREPLICA 替代 BAPI_MATERIAL_SAVEDATA
2、LOOP 里面delete,可以改成,给内表加一个flag的字段,然后需要删除的打上X,然后用Delete it_1 where delete = ‘X’.
3、LOOP AT 搭INSERT或者是APPEND,可以改成: INSERT SBOOK FROM TABLE itab。 APPEND LINES
4、如果是两个内表都很多数据,但是逻辑要进行嵌套LOOP,可以如下处理,会提升一些性能:
"1.1.1 多层/嵌套LOOP循环性能优化写法
SORT:lt_ztfi0005 BY hcode,lt_prj_prps BY pbukr,lt_prhi BY up,lt_phs_prps BY pspnr.LOOP AT lt_ztfi0005 INTO ls_ztfi0005.
“ 第一层双层LOOP循环优化READ TABLE lt_prj_prps TRANSPORTING NO FIELDSWITH KEY pbukr = ls_ztfi0005-hcode BINARY SEARCH.IF sy-subrc = 0.lv_cmp_ix = sy-tabix.LOOP AT lt_prj_prps INTO ls_prj_prps FROM lv_cmp_ix.IF ls_prj_prps-pbukr <> ls_ztfi0005-hcode.EXIT.ENDIF.
“ 第二层双层LOOP循环优化READ TABLE lt_prhi TRANSPORTING NO FIELDSWITH KEY up = ls_prj_prps-pspnr BINARY SEARCH.IF sy-subrc = 0.lv_prhi_ix = sy-tabix.LOOP AT lt_prhi INTO ls_prhi FROM lv_prhi_ix.IF ls_prhi-up <> ls_prj_prps-pspnr.EXIT.ENDIF.READ TABLE lt_phs_prps INTO ls_phs_prpsWITH KEY pspnr = ls_prhi-posnr BINARY SEARCH.IF sy-subrc <> 0.CONTINUE.ENDIF.ls_data-cmp_nr = ls_ztfi0005-hcode.ls_data-cmp_nm = ls_ztfi0005-hname.ls_data-prj_nr = ls_prj_prps-posid.ls_data-phs_nm = ls_phs_prps-post1.APPEND ls_data TO et_data.CLEAR ls_data.ENDLOOP.ENDIF.ENDLOOP.ENDIF.ENDLOOP.
5、LOOP 后面用assigning 指针的方式,这样也可以节省空间和时间:可以省去了append,modify等操作,在嵌套LOOP没法像上面那样解决的话,也建议使用指针。
四、有一些标准的FM,如果在LOOP里面使用可以考虑换成使用自己开发,把抓数放出来,然后read(read_text):
1、有很多程序要调用FM read_text,但是当用到LOOP里面调用这个read_text,会比较慢其中到STXH表抓数就会占用很多时间,我们可以考虑对read_text进行优化,把read_text分成两个FM,一个是集中读取STXH,然后另一个是和read_text一样的功能,只是把抓数换成read table。占用性能就会提高很多。
五、一些优秀的良好的ABAP 程序书写习惯:
1、select 数据的时候,如果可以使用join进行内联,尽量2-3个表内联即可。下面这个图可以理解下join的用法:
有时,join太多了,也可以考虑使用创建视图,然后从视图里抓数,例如vbak_kan1。
2、如果要select 数据出来,更改一些字段的值,再进行updata,可以考虑直接使用updata set,省去到表里面抓数:
SELECT * FROM sbookINTO xbookWHERE carrid = 'LH'AND connid = '0400' AND fldate >= '20110101'.xbook-connid = '0500'.UPDATE sbook FROM xbook.ENDSELECT.UPDATE sbookSET connid = '0500' WHERE carrid = 'LH' AND connid = '0400' AND fldate >= '20110101'.
3、读取HASHED表会比其他两种类型更快,同时read table 也可以通过transporting 某些字段到work area,不用全部字段都用上。
4、有些表的数据,是很固定的,例如KNA1或者是T001等,可以抓大部分数据放到内表里,然后去读取,如果读取不到,在抓,不用每次都抓。
5、强制使用索引:(但是如果更改数据库了,就会失效了) %_HINTS DB6 (这个不太建议使用,但是当ST05分析之后,是可以使用某个索引,但系统没有使用,就可以使用这个语句强制使用索引。)
6、及时清空不再使用的大内表释放内存。当一个report在ALV显示完之后,在end-of-selection里面把不用的内表的清空掉,防止有些后台job一次跑两个变量的时候会重复,同时释放内表也是减少内存压力。
7、field-groups的使用,对于多层次的排序和显示非常有用。
8. 使用 “for all entries”, 注意使用前判断内表不为空,否则导致全查询严重影响性能。
在select语句后面的where附加项中可以使用左关联,这会极大的提高程序速度,但同时也有一些局限,如下:
重复项会被从结果数据集中自动删除,因此要注意在select语句中需要给出详细的唯一关键字组合。
如果 For All Entries IN 字段修饰的内表是空表的话,源表的所有行都会被选入目标表中。因此在使用前一定要首先检查第一个表是否为空,这一点很重要,否则会有performance问题。
如果 For All Entries IN 字段修饰的内表很大的话,程序速度反而会减慢,而不是加快。因此应该尽量使该表的数据量控制在一个适当的大小。
相关文章:
SAP ABAP性能优化
1.前言 ABAP作为SAP的专用的开发语言,衡量其性能的指标主要有以下两个方面: 响应时间:对于某项特定的业务请求,系统在收到请求后需要多久返回结果 吞吐量:在给定的时间能,系统能够处理的数据量 2. ABAP语…...
【鸿蒙学习笔记】构建布局・选项卡 (Tabs)
官方文档:选项卡 (Tabs) 目录标题 底部导航顶部导航侧边导航限制导航栏的滑动切换固定导航栏・可滚动导航栏自定义导航栏切换至指定页签 底部导航 Entry Component struct Bujv_tabs {build() {Column() {Tabs({ barPosition: BarPosition.End }) {TabContent() {T…...
独立游戏《星尘异变》UE5 C++程序开发日志5——实现物流系统
目录 一、进出口清单 二、路径计算 三、包裹 1.包裹的数据结构 2.包裹在场景中的运动 四、道路 1.道路的数据结构 2.道路的建造 3.道路的销毁 4.某个有道路连接的建筑被删除 作为一个工厂类模拟经营游戏,各个工厂之间的运输必不可少,本游戏采用的…...
Web开发:<br>标签的作用
br作用 介绍基本用法常见用途注意事项使用CSS替代 介绍 在Web开发中,<br> 标签是一个用于插入换行符的HTML标签。它是“break”的缩写,常用于需要在文本中强制换行的地方。<br> 标签是一个空标签,这意味着它没有结束标签。 基本…...
DVC+Minio
由于参数文件比较大,因此onnx、engine等大文件弃用LFS管理,改用dvc管理: minio就是存储用的 启动miniosudo netstat -ntpl#查看端口号 sudo kill -9 $(sudo lsof -i:5061 -t) 关闭端口对应进程 ./minio server --console-address ":6570…...
C++内存管理(区别C语言)深度对比
欢迎来到我的Blog,点击关注哦💕 前言 前面已经介绍了类和对象,对C面向对象编程已经有了全面认识,接下来要学习对语言学习比较重要的是对内存的管理。 一、内存的分区 代码区:存放程序的机器指令,通常是可…...
手把手带你写一个精简版 HashMap 的 put 方法
👆🏻👆🏻👆🏻关注博主,让你的代码变得更加优雅。 前言 HashMap 大家工作中遇到的太多了,已经成了必须使用的类了, 在面试的时候 HashMap 基本是必问题,但是…...
【面试题】数据结构:堆排序的排序思想?
堆排序的排序思想? 堆排序是一种高效的排序算法,其基本思想是利用堆这种数据结构来实现排序。堆是一种特殊的完全二叉树,通常用数组来表示。堆排序的基本步骤如下: 1. 构建初始堆: 将待排序的数组转换成一个最大堆&a…...
PyTorch 深度学习实践-循环神经网络基础篇
视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记基于RNNCell实现总代码 基于RNN实现总代码 含嵌入层的RNN网络嵌入层的作用含嵌入层的RNN网络架构总代码 其他RNN扩展基本注意力机制自注意力机制(Self-Attention)自注意力计算多头注意力机制…...
vue实现可拖拽dialog封装
一、实现modal弹窗组件 <template><divv-if"visible"class"customer-dialog"id"customer-dialog":style"dialogStyles"v-dialogDrag:[dialogDrag]><div class"dialog-container"><divclass"dial…...
本地多模态看图说话-llava
其中图片为bast64转码,方便json序列化。 其中模型llava为本地ollama运行的模型,如:ollama run llava 还有其它的模型如:llava-phi3,通过phi3微调过的版本。 实际测试下来,发现本地多模型的性能不佳&…...
人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解。在机器学习和深度学习领域,模型的训练目标是找到一组参数,使得模型能够从训练数据中学习到有用的模式&am…...
Java异常抛出与处理方法
在Java编程中,异常处理是一个非常重要的部分。通过正确的异常处理,我们可以提高程序的健壮性和可靠性,避免程序在运行过程中出现意外的崩溃。本文将详细讲述Java异常的抛出与处理方法,并通过示例代码进行说明。 一、Java异常的分类 Java中的异常体系结构可以分为三类: 检…...
兼容性测试主要有什么类型?
兼容性测试的类型 有两种类型的兼容性测试。这是一个快速细分。 1、前向兼容性测试 向前兼容性测试或向上兼容性测试可确保当前软件版本在相关组件(例如操作系统、浏览器和第三方库)的未来版本中保持功能。此类测试对于在系统升级期间保持稳定性和用户体验至关重要。 例如&…...
设计模式--组合模式
组合模式(Composite Pattern)详解 组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 适用场景 需要表示对象的部分-整体层次结构时&am…...
ArduPilot开源代码之AP_DAL_RangeFinder
ArduPilot开源代码之AP_DAL_RangeFinder 1. 源由2. 框架设计2.1 枚举 Status2.2 公有方法2.3 私有成员变量 3. 重要例程3.1 应用函数3.1.1 ground_clearance_cm_orient3.1.2 max_distance_cm_orient3.1.3 has_orientation3.1.4 get_backend 3.2 其他函数3.2.1 AP_DAL_RangeFind…...
SpringCloud教程 | 第九篇: 使用API Gateway
1、参考资料 SpringCloud基础篇-10-服务网关-Gateway_springcloud gateway-CSDN博客 2、先学习路由,参考了5.1 2.1、建了一个cloudGatewayDemo,这是用来配置网关的工程,配置如下: http://localhost:18080/aaa/name 该接口代码如…...
数据结构——hash(hashmap源码探究)
hash是什么? hash也称为散列,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出值就是散列值。 举例来说明一下什么是hash: 假设我们要把1~12存入到一个大小是5的hash表中,我们…...
国产麒麟、UOS在线打开pdf加盖印章
PageOffice支持两种电子印章方案,可实现对Word、Excel、PDF文档加盖PageOffice自带印章或ZoomSeal电子印章(全方位保护、防篡改、防伪造)。Word和Excel的盖章功能请参考:Word和Excel加盖印章和签字功能 (目前只支持win…...
破解反爬虫策略 /_guard/auto.js(二)实战
这次我们用上篇文章讲到的方法来真正破解一下反爬虫策略,这两个案例是两个不同的网站,一个用的是 /_guard/auto.js,另一个用的是/_guard/delay_jump.js。经过解析发现这两个网站用的反爬虫策略基本是一模一样,只不过在js混淆和生成…...
同样是人工智能 客户在哪儿AI和GPT等大模型有什么不同
书接上回。为了统一回答朋友们的疑惑,此前的两篇文章,着重讲述了客户在哪儿AI的企业全历史行为数据和企业信息查询平台上的数据的区别,以及客户在哪儿AI的ToB获客服务和AI外呼机器人的获客服务的不同。本期接着讲——客户在哪儿AI VS 大模型&…...
AES Android IOS H5 加密方案
前景: 1、本项目原有功能RSA客户端对敏感信息进行加密 2、本次漏洞说是服务端返回值有敏感信息,需要密文返回 3、最初只跟H5联调成功,后续APP联调失败(H5和APP的需求排期不一致),没关注到通用性 方案: 本次方案不…...
一文了解变阻器和电位器的定义、原理、应用及其对比
变阻器的定义 两端可变电阻器(称为变阻器)利用电阻来调节电流。电阻丝环绕在陶瓷或瓷器等绝缘芯上。当刮水器沿着电阻丝移动时,电路的有效电阻会发生变化。因此,它提供了精确的电流控制。调光器、电机速度控制器和加热元件使用变…...
WPF实现一个带旋转动画的菜单栏
WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目,如下所示 2、创建文件夹及文件 创建资源文件夹&…...
使用Dockerfile构建镜像
目录 1.使用Dockerfile构建tomcat镜像 1.1 通过ARG传参构建不同版本的tomcat 2.缩小镜像的体积大小 2.1 使用较小体积的基础镜像 2.2 多级构建减少体积 1.使用Dockerfile构建tomcat镜像 cd /opt mkdir tomcat cd tomcat/ 上传tomcat所需的依赖包 使用tar xf 解压三个压缩…...
概率论原理精解【3】
文章目录 向量值向量值函数导数对称矩阵定义性质例子应用 向量值理论基础定义性质应用示例 向量值函数的导数定义性质应用 向量值 向量值函数导数 D n ⊂ R n , 向量值函数 f : D n → R m D^n \subset R^n,向量值函数f:D^n\rightarrow R^m Dn⊂Rn,向量值函数f:Dn→Rm 1. 向量…...
[C/C++入门][循环]14、计算2的幂(2的n次方)
计算2的幂(即2的n次方)非常经典。你懂几种方法呢?很多人只会一种,我们来分析一下。 可以通过多种方式实现: 1、最简单的方法之一是使用位运算符<<,它本质上是在二进制表示下对2进行左移操作&#x…...
RPC与服务的注册发现
文章目录 1. 什么是远程过程调用(RPC)?2. RPC的流程3. RPC实践4. RPC与REST的区别4.1 RPC与REST的相似之处4.2 RPC与REST的架构原则4.3 RPC与REST的主要区别 5. RPC与服务发现5.1 以zookeeper为服务注册中心5.2 以etcd为服务注册中心 6. 小结参考 1. 什么是远程过程调用(RPC)?…...
3112. 访问消失节点的最少时间 Medium
给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。 同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点࿰…...
FastAPI 学习之路(五十二)WebSockets(八)接受/发送json格式消息
前面我们发送的大多数都是text类型的消息,对于text消息来说,后端处理出来要麻烦的多,那么我们可以不可以传递json格式的数据,对于前后端来说都比较友好,答案是肯定的,我们需要做下处理。 首先,…...
云网站 制作/最近新闻热点事件
#python打卡##Python数学编程##python#【必知必会1】python官网python官网地址:https://www.python.org/python官网是学习python的一个重要学习资源,它提供了不同系统的不同版本的python安装包,python2.X和python3.X都可以在这里进行获取(目前…...
电子商务网站建设培训小结/临沂网站建设优化
有个统计需求,需要对IP进行分类统计,Mysql提供了INET_ATON(expr)给出一个作为字符串的网络地址的点地址表示,返回一个代表该地址数值的整数。地址可以是4或8比特地址。mysql> select inet_ntoa(3507806248);-----------------------| inet…...
iis7安装wordpress/视频号怎么付费推广
软件工程-软件维护/系统维护 系统可维护性 评价指标 可理解性可测试性可修改性 系统维护类型 改正性维护适应性维护预防性维护完善性维护 tip:完善性维护占半壁江山 系统文档 开发文档:技术员编写,与开发相关产品文档:与用…...
云南网站建设优选平台/长沙seo关键词
1 .责任分配矩阵展示项目资源在各个()中的任务分配? A.工作包 B.项目活动 4 .在虚拟团队环境中,()规划变得日益重要? A.资源 B.沟通 参考答案 A B...
手机网站怎么做微信登陆6/windows7优化大师官方下载
firefox扩展开发(四) : 更多的窗口控件2008-06-11 17:00标签盒子 标签盒子是啥?大家都见过,就是分页标签: 对应的代码: <?xml version"1.0"?><?xml-stylesheet href"chrome://global/skin/…...
建站公司推广/百度快速排名工具
字符串转换为数字异常 当试图将一个String转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常.如现在讲字符型的数据“123456”转换为数值型数据时,是允许的。 但是如果字符型数据中包含了非数字型的字符,如…...