程序性能分析及性能测试

2023-10-26

这里所说的程序是指对外提供tcp/ip交互协议的服务性程序。网络程序性能分析很重要,比如随着网络请求流量越来越大,我们需要知道已部署的服务能不能满足需求。这里采用对网络服务程序进行建模的方法分析影响程序性能的各要素,并计算相关性能值,它不够精确,但对我们使用其它工具对网络程序进行性能测试提供很好的理论指导。

1.网络请求


                                                                                  图1


什么是网络请求?如图1是《UNIX 网络编程》一书中表示网络交互过程的一幅图,整个请求是指从客户端到服务端 write->read->write->read的一个过程。对于服务端需要关心的是read-处理-write的过程。

connect相关操作在此是忽略的,因为其对服务端性能并没有什么影响。

一个请求中,在服务端read可能进行多次,如http协议中,我们可能先要读取头部信息,然后再读取一次数据实体,对于一个请求更为精确的定义是:

把相邻的操作都合并,如多次连续read合并为一个,从一个read开始到下一个read开始的过程即为一个请求。

在一个长连接里就可以发生多个请求,因为有多个read-处理-write过程

服务端的请求处理过程总结如下:
1.从网络接口读取数据
2.处理请求
3.将处理结果发送至网络接口


2.性能指标

这里参考<<High Performance MySQL>> 一书 38页对于相关性能值的解释说明,本人即看此书看到这里时想到要写本文。
 
吞吐量:每秒处理的请求数(事务数),请求定义见上节
 
响应时间(延迟):请求处理响应时间,对于服务端来说即一个read-处理-write流程的时间。下面会使用响应时间和延迟两种说法,意义一样。
 
并发度:某一刻处于请求处理过程的请求数。如图2所示,不同请求处于不同的处理过程,竖着的红线表示当前时刻的时间线,与时间线相交的请求数目即为并发度。
 
可伸缩性:作者的意思应该是别把系统的所有资源用到极限,要留有一定余地,以使整个系统具有可伸缩性,预防可能突然增大的请求流量。接下来的性能值计算都以极限值为标准,但实际使用过程中,不能让服务的性能值处于极限值上。



                                                                                  图2

3.性能函数表达式


吞吐量 = f1(CPU能力,CPU个数,磁盘IO能力,网络带宽能力,请求处理模型网络流量,CPU计算时间,磁盘IO进程数)

响应时间 = f2(CPU能力,CPU个数,磁盘IO能力,网络带宽能力,请求处理模型网络流量,CPU计算时间,磁盘IO)

并发度 = f3(客户请求量,请求处理模型, 吞吐量,响应时间)


红色:正相关
绿色:负相关

硬件变量: CPU能力,CPU个数,磁盘IO能力,网络带宽能力(难以控制)
软件变量:请求处理模型,网络流量,CPU计算时间,磁盘IO量(控制难度中等)
参数变量:进程数,系统软件参数(较易控制)

对于任一单一变量来说,在其它变量值固定的情况下,它都有一个最大(小)值,超过这个最大(小)值,性能计算指示的值不随它的值变大(小)而变化,这是其它某个变量达到了瓶颈值,例如I/O能力有限的情况下,再怎么提高进程数对吞吐量也没用,我们将这种情况称为软限制。另外一些变量有一些限制值,该变量的值不可能超过该值,比如同时运行的进程数受限于CPU的个数,我们将这种情况称为硬限制。软限制由硬限制引起,当然对于某一组变量来说不存在如上限制的情况。

网络延时及连接队列长度不会影响性能量度,因为这两个变量从逻辑上讲跟网络服务程序的处理过程无关。网络延时是请求开始及完成后中间的信息传输过程,连接队列只是请求正式开始前一个暂存的机制。


4.硬件建模

相关硬件一个时刻只能给一个进程使用,除非有多个硬件设计如CPU才能实现同一时刻的并发,资源不够时需要等待。
 
CPU:每一个进程顺序执行指令,多个CPU可以并发。CPU使用率达到100%,进程可能有等待。
磁盘I/O : 多个进程I/O需要进行排队。假设需要的时间只根据读取或写入的数据量有关,不考虑寻道时间等。有可能出现IO等待
网络I/O: 多个进程I/O需要进行排队,也假设网络I/O的时间只跟要读取或发送的数据量有关。有可能出现IO等待
内存: 对于性能影响较小,往往只是作为磁盘的缓存来使用,加速磁盘I/O,对性能分析无益,可以忽略。

 

硬件

能力值

单位

CPU      

H1    

指令/s

CPU个数

N1     

个     

磁盘I/O

H2

K/s

网络带宽

H3

K/s


5.软件数据

 对于每一个请求来说,相关数据量如下:

 

请求

单位

执行指令数

S1

磁盘I/O量    

S2     

K     

网络I/O量

S3

K

 

 

6.请求处理模型

最普通的请求模型是,每个进程从队列取得连接,然后等待读取数据,然后执行CPU计算,然后进行I/O处理,然后写回数据,CPU计算与磁盘I/O往往是交叉进行,不过将其统一成两个不两阶段,不影响性能值计算,另外网络的读写也合并在一起。

各执行阶段可用图表示如下:


                                                                               图3

我们还有一些基本假设:

1.连接队列总有有可以读取的连接,即让客户端请求的吞吐量大于或等于服务端的吞吐量,以测试服务端的极限性能,让客户端的请求不至于成为瓶颈。
2.每个请求都是完全相同的,这是为了简化性能计算,并且不影响分析结果。
3.从连接列表获取连接后,马上进行读数据,读取时间只跟网络整体带宽有关。


7.如何计算并发度

基本计算规则:  根据并发度的定义,以其中一个请求为标准,并发度即该请求从开始到结束期间,从连接队列新拿到的连接数(只要离开了连接队列,我们就认为其进入了read-write处理中,跟上述假设3是吻合的)。抽象成公式如下:

并发度 =  请求处理时间*吞吐量

再以图形描述下上面的公式。如下图,横线的表示一个请求处理过程,长度为处理时间,假设A点表示处理起始点,B点是结束点,随着时间进行,所有横线以一定速度往右行走,左结点穿过B线表示相应请求完成,那横线左结点穿过B竖线的速度即为吞吐量,再假设吞吐量在处理各阶段保持不变,那横线进入A竖线的速度也应该等于吞吐量,于是一个请求的时间内进入A竖线的请求数为 :请求处理时间*吞吐量


                                              图 4

但如果各个处理阶段吞吐量不同的话,吞吐量取最大值,更精确的公式如下:

并发度 =  请求处理时间* max(吞吐量1,吞吐量2…吞吐量n)


8.如何计算进程数

基本计算规则:  类似于并发度的计算规则,对于同一处理类型的进程来说,以某一个进程为标准,从开始到结束期间,新进入的需要处理的事件即需要的进程数。如果对一个请求有不同类型的处理阶段,且由不同进程处理,所需要的进程数是不同阶段进程数相加:

进程数 = 阶段1处理时间*阶段1吞吐量+阶段2处理时间*阶段2吞吐量+…阶段n处理时间*阶段n吞吐量

如果一个请求完全由一个进程处理,即两者完全绑定,则: 进程数 = 并发度


9.如何计算延时

延时是不同处理阶段延时的相加,如之前所述的三个阶段:

请求总的耗时 = 网络耗时+CPU执行耗时+磁盘I/O耗时

网络耗时:  根据网络距离、数据传播速度计算网络耗时在这里显得没有意义,我们只想得出各变量之间的关系,所以我们定义单位带宽单位数据量的耗时为X,可以得出网络耗时为  X*S3/H3

这里有个前提是接入带宽越高,同一请求的数据传播也越快,事实上这也跟整个网络的带宽有关。

CPU执行耗时:   即使有多个CPU,也不能对同一个请求进行并发处理,所以执行耗时为 S1/H1
磁盘I/O执行耗时: 在没有等待情况下的耗时为 S2/H2


10.如何计算吞吐量

基本计算规则:一个请求各个处理阶段吞吐量的最小值,实际就是系统处理瓶颈决定整个的吞吐量。


吞吐量 = min(网络吞吐量,CPU吞吐量,磁盘I/O吞吐量)


 各阶段吞吐量计算如下:
网络吞吐量:  H3/S3
CPU吞吐量: N1*H1/S1
磁盘I/O吞吐量: H2/S2   

 

11.性能值具体的计算

 

我们根据之前的规则计算各性能值
 吞吐量:
请求处理分为多个过程,整理处理的能力跟最小处理过程有关,这是请求的处理瓶颈所在,如图5所示,即
 吞吐量 = min(H3/S3,N1*H1/S1,H2/S2)


                    图5

延时:
设网络处理与CPU执行之间的队列为Q1,CPU执行与磁盘I/O之间的队列为Q2
 
分两种情况分析,第一种请求到达的速率小于等于吞吐量,这时内部的队列中应该是没有累积数据的,队列Q1,Q2保持为空。将各阶段耗时相加即为:
 
延时 = X*S3/H3+S1/H1+S2/H2
 
我们定义这种待处理队列为空的状态为H-S-E状态,而有积累数据直到队列满的状态为H-S-F状态,当请求到达速度大于吞吐量时即可到达H-S-F状态。H-S-F状态下的延迟计算如下:
 
假设Q1的长度为L1,Q2的长度为L2,单个请求的延迟相对于H-S-E状态的延迟只是多了队列中等待的时间,计算出它即可,我们假设H3/S3 > N1*H1/S1 > H2/S2,当前一个处理阶段吞吐量大于后一个时,队列中才可能积累数据。
 
队列等待时间 = Y*L1*(S1/H1)+ L2*(S2/H2)
H-S-F下的延迟 =X*S3/H3+S1/H1+S2/H2+ L1*(S1/H1)+L2*(S2/H2)
 
队列长度越大,延迟越大,在请求速度没有控制的情况下,请求的延迟将会变得巨大。
 
需要注意的是,CPU运算对各进程的调度是按时间片来分的,并不是等一个进程完全执行完再执行另一个,这可以防止进程饥饿,并且将等待时间平摊,所以我们计算的CPU等待时间要加个计算系数,即Y*L1(S1/H1)。
 
 
并发度:
根据并发度的定义,在队列中的请求都算是正在处理中请求。根据计算规则,为处理时间乘以吞吐量,H-S-E的并发度为
min(H3/S3,N1*H1/S1,H2/S2)* (X*S3/H3+S1/H1+S2/H2)
H-S-F的并发度为:
min(H3/S3,N1*H1/S1,H2/S2)*(X*S3/H3+S1/H1+S2/H2+L1*(S1/H1)+L2*(S2/H2))
 
在H-S-E状态下,随着请求速度提高,并发度同时提高,而处理延迟并不会增加,而一旦到了H-S-F状态,并发度升高会导致严重的请求延迟增加,往往这是一个很坏的状态。
 
进程数
 
假设一个请求跟一个进程是绑定的,即一个进程只有在处理完一个请求后才会处理另一外,所以所需要的进程数跟并发度是相等。当然可能还有一些其它特殊功能的进程,往往较少,可以忽略。
 
如之前所述,为了防止进程饥饿,CPU调度进程采用时间片法,每个进程轮流一个小的时间片,这就涉及到进程切换,在CPU计算密集型请求中,这个切换也是一个较大开销,所以启动并发度数目的进程CPU执行的吞吐量达不到N1*H1/S1,我们应该要将进程数减少到一个适当的程度以获得最大吞吐量,这个只能通过实际测量获得最佳进程数。
 
以上情况说明对进程数的控制很重要,不能无限制随着请求数目增加进程,这会导致系统吞吐量下降以及延迟的增加,apache的模型类似这种,所以在极端情况下它的性能并不高。
 
之前讨论的H-S-F状态下,Q1,Q2队列可能会满,实际上我们可以在应用层增加一个队列,让Q1,Q2保持为空的状态,从连接队列获取连接后,将其放进这个队列,然后启动固定数目的进程从该队列中获取读或写事件进行处理。将队列从操作系统内核移至应用层的队列,不但有更大的控制灵活性,如控制队列长度,也能够很好控制启动的进程数目,在这种情况下,我们也能保证所有事件都能得到处理。
 
当然,将队列由应用层实现,并不会提高系统整理吞吐量以及延迟,只是更方便控制了。那队列设置多长合适呢?一般来说处理延迟不应该超过客户端的超时时间,设队列长度为L,超时时间为T,由此可得出如下式子:
 
L*( X*S3/H3+S1/H1+S2/H2) < T
 
L < T*(X*S3/H3+S1/H1+S2/H2)


12.请求处理模型优化

 

公平对待等待中的连接,优化应用层队列

 在之前的性能计算中,我们提到增加应用层队列,以实现对进程数的控制,但实际上与我们之前的一个假设有冲突,将连接从队列中拿出来后放到另一个队列,这样这个连接并不能立即进行读数据的操作,我们可以优化一下,所有进入这个队列的连接都可以立即进行读数据的操作,这并不是平常我们所说的 “队列”了,是一种特殊的数据结构,我们往往通过系统调用select或epoll 来实现,所以拿到的连接都可以进行数据操作,这实现了一种事件驱动的模式,这种模式一定程序减少了应用层队列等待时间,它避免了前一个连接因传输慢而导致后一个连接不能传输数据的情况,当然因为我们的进程数因为是控制在一定数量的,仍然可能会有“队列”等待的情况,延迟值计算跟之前是一样的。
 

这种“队列”,更像一种竖着的队列,进入队列中的连接都可以进行接下来的处理流程,如图6所示。


 

                    图6

如果将所有的到来的请求都放入“队列”,这是一种事件驱动模式,如之前所述,这可能会导致所有请求延迟增加。
 
缓冲各阶段吞吐量性能差,增加新的应用层队列
 
一般来说网络数据读取的吞吐量是高于CPU处理的吞吐量,之前的模型只有最前端有队列,整体吞吐量受限于最小吞吐量,不过我们可以在网络数据读取与CPU处理间建立新的应用层队列,让网络数据处理以更高的吞吐量运行,如图7所示,当然积累的待处理请求不能超过新的队列长度。
 
将应用队列放在最前端的延迟值为:
L*( X*S3/H3+S1/H1+S2/H2)
 增加新的队列后延迟值为:
X*S3/H3+L’*(S1/H2+S2/H2)
 
在队列长度相同的情况下,增加新的应用层队列后请求延迟值会降低,当然整体吞吐量不会改变。

                   图7

解绑请求与进程,减少所需进程数

 之前对需要的进程数计算是基于进程跟请求完全绑定的,这种情况进程在等待I/O时会进入睡眠状态,这其实是对进程资源的一种浪费,如果将请求与进程解绑,让一个进程在等待某种I/O请求时不是去睡眠,而是继续去干其它事,于是我们可以以更少的进程数完成我们的吞吐量及延迟要求。
 
如果进程一直在“干活”而不会“睡觉”那应该需要多少进程数呢?进程一直干活需要使用CPU,所以这是跟CPU个数有关系的,在这种情况下需要的进程数是:
 
Z*N1
 
N1是CPU个数,Z是一个系数,一般应该在1到2之间。
 
解绑请求与进程是比较复杂的,也根本没有一种方法拆分让进程完全不“睡觉”,例如有些数据读取到一个进程中后总不能让另一个进程去处理的,数据在不同进程间不能共享,这也是Z系数会大于1的原因。
 
对一个请求拆分越细致对进程资源的浪费就越小,但编程就越复杂,也可能会导致增加CPU计算时间,这是需要衡量的问题,具体不再展开,具体编程是一个很复杂的问题。
 
 

13.CPU密集型和I/O密集型对性能值的影响

之前我们讨论的是三阶段情况下各性能值的计算,现实情况有些是CPU密集或I/O密集型的服务,即极端化下的两阶段,即只有网络请求和CPU计算或只能网络请求和I/O处理。简单讨论下这种两阶段服务计算性能时特别的地方。
 
CPU密集型
只有网络处理和CPU计算两个阶段。
吞吐量及延迟的计算一样,只是少了一个阶段。
因为只有CPU计算,不用对请求进行复杂的拆分,只需要启动少量进程,如跟CPU个数一样,即可以达到最佳的吞吐量值。模型优化第三条可以不采用了。
 另外CPU密集型服务处理时间会相对较短,网络数据处理时间占总体时间会较大,需要使用模型优化第二条。
也适宜事事件驱动的方式,并发度会很高,延迟不会增加特别厉害。

 
I/O密集型
只有网络处理和I/O读写两个阶段(CPU的时间小到忽略不计)
同样的,吞吐量及延迟的计算一样,只是少了一个阶段。
 请求拆分以避免进程睡眼是较难的,这时启动的进程数应该跟如下公式相关
min(H3/S3,H2/S2)* (X*S3/H3+S2/H2)
这将远远多于CPU的个数。

另外I/O密集型服务处理时间会相对较长,模型优化第二条也一般不采用,因为其带来的延迟减少占总延迟比是很小的,增加一个队列反而增加了编程复杂度,而且队列相关的CPU时间可能甚至要高于网络处理延迟减少的时间,导致得不偿失。
不适宜事件驱动的方式,因为I/O处理耗时长,会让请求延时急剧上升。

14.多系统性能值计算

之前我们讨论的值计算都是基于单一系统,而现实中是一个请求可能要经过多个不同的系统,如一个http请求,先经过nginx,再经过php,最后到mysql,如图8所示

 

                    图8



这种情况下性能值有什么不同呢?计算与单个系统各阶段计算类似
 
吞吐量
是各系统的最小吞吐量值
延迟
各系统延迟值相加
并发度
吞吐量*总的延时
事件驱动模式可以提高并发度,但一般我们只在第一个接入系统实现事件驱动模式就可以提高整个系统的并发度,所以我们无须在所有后续都实现事件驱动,如php或mysql,在后续系统实现事件驱动的一个坏处是后面系统的到达处理极限不能很好的反应到前面的系统,导致并发度越来越大,而导致整个系统的延迟极高。
php的进程模型里就没有网络处理与CPU计算中间的应用层队列,当PHP模块吃紧时会很快反应到nginx模块。
进程数
各个系统的进程数可以依照之前公式算出来,我们关心的一个问题是,A系统调用B系统时,A系统应该启动多少进程。假设B系统的吞吐量为吞吐量B,每个请求的耗时为耗时B
 为了使B系统达到相应吞吐量,则A系统发起的请求吞吐量也必须达到相同值,所以调用方进程数在同步调用(进程可能投入睡眠状态)下计算如下
 
A系统进程数 = A系统吞吐量*耗时A
A系统吞吐量 = B系统吞吐量
耗时A =耗时B
可得:
A系统进程数 = B系统吞吐量*耗时B


15.如何进行性能测试

现实世界比我们之前说的几个简单公式远远复杂多了,不可能有一个精确的公式可以描述出来,所以性能值我们也不能说填充几个参数就可以像算数学题一样算出来,再加上我们面对的系统都是多个系统组合而成,直接算更不可能了,那些简单公式只是指导致我们进行测试。对于一个系统来说,真正的性能值需要通过工具测试出来,如用siege工具。

用工具进行测试的思路

吞吐量是一个比较固定的值,先观测它。根据之前的公式

A系统进程数 = B系统吞吐量*耗时B

B系统吞吐量 = A系统进程数/耗时B

可知为了观察到最大的吞吐量应该不断提高工具的并发进程数,直到吞吐量不再上升。
当吞吐量不再上升时说明已到了之前说所的H-S-F状态临界点,如果进一步提高客户端的并发,延时将会上升,这时我们可以得出延时的最小值。
客户端的并发度与待测系统的并发度不一定相同,但可以肯定的是他们是正相关关系。

当延时处于最小值,吞吐量处于最大值时,这时得出的并发度是最佳并发度。最佳并发度不代表最大并发度,最大并发度对于事件驱动模型来说,甚至是无限的,只要不超过客户端超时时间,但过长的时间不是我们能接受的。首先我们定义一个可以接受的最大延时,然我进一步提高客户端的并发度,直到延时达个这个值,这时得到的服务器的并发值才是有实际意义的最大并发度值。


性能测试工具siege

Ben: $ siege -u shemp.whoohoo.com/Admin.jsp-d1 -r10 -c25
..Siege 2.65 2006/05/11 23:42:16
..Preparing 25 concurrent users for battle.
The server is now under siege...done
Transactions: 250 hits
Elapsed time: 14.67 secs
Data transferred: 448000 bytes
Response time: 0.43 secs
Transaction rate: 17.04 trans/sec
Throughput: 30538.51 bytes/sec
Concurrency: 7.38
Status code 200: 250
Successful transactions: 250
Failed transactions: 0

Transaction rate 指吞吐量  
Response time  指延时
Concurrency 指并发度


如何寻找瓶颈
有时我们需要找到整个系统的瓶劲,以提高性能值。首先我们应该找到整个系统是哪个子系统的的处理出现了瓶劲,是nginx,php还是mysql。然后研究一个子系统,是网络读取,CPU还是磁盘I/O出现了瓶颈,或是进程数启得少了,或是我们要优化自己的程序。具体操作比较复杂,可另成文,不展开讨论。


参考资料

1. UNIX 网络编程
2. High Performance MySQL


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序性能分析及性能测试 的相关文章

  • MCS-51 汇编指令集(J开头的指令)

    MCS 51系列单片机指令以J开头的指令有8条 分别为 JB bit rel JBC bit rel JC rel JMP A DPTR JNB bit rel JNC rel JNZ rel JZ rel 1 JB bit rel 指令名
  • 微软和Facebook推出Docs.com

    来源 德胜网 4月22日 据国外媒体报道 Facebook和微软在联手一项在线文件共享服务 看起来多一点像Google Docs 周三在Facebook的F8会议Docs com上线 该网站允许Facebook用户使用Facebook连接登
  • 性能测试入门——完整的测试流程

    性能测试一般的压测流程 需求收集 测试准备 测试执行 结果分析与调优 测试报告与总结 1 1 需求收集 性能测试需求一般在项目需求阶段就可以收集 测试人员进入项目应尽快开展此项活动 1 性能需求的来源 需求文档 问卷调查 历史数据统计分析等
  • UNIX网络编程-recv、send、read、write之间的联系与区别

    原文链接 http www cnblogs com mhscn p 3911284 html include
  • 【测试】三张图解读 CI/CD

    文章目录 前言 CI CD 的概述 CI持续集成 Continuous Integration 持续集成小结 CD 持续交付 Continuous Delivery 持续交付小结 CD 持续部署 Continuous Deployment
  • hdu2030 汉字统计

    hdu2030 汉字统计 Time Limit 2000 1000 MS Java Others Memory Limit 65536 32768 K Java Others Total Submission s 4080 Accepted
  • 并发测试工具 apache-jmeter使用发送post请求JSON数据

    目录 1 下载安装 2 汉化 3 创建高并发测试 配置线程组 创建web请求 创建监听器 结果树 汇总报告 为web请求添加token 添加Content Type用于发送json 4 启动测试 5 查看结果 1 下载安装 官网Apache
  • 学习笔记Controller

    转自 http elim iteye com blog 1753271 谢谢博主分享 SpringMVC Controller 介绍 一 简介 在SpringMVC 中 控制器Controller 负责处理由DispatcherServle
  • websocket协议

    WebSocket是一种在Web应用程序中实现实时双向通信的协议 一种在单个TCP连接上进行全双工通信的协议 它使得客户端和服务器之间的数据交换变得更加简单 允许服务端主动向客户端推送数据 WebSocket 与 HTTP 2 一样 其实都
  • 漫谈软件测试工程师与mercury认证

    漫谈软件测试工程师与mercury认证 出自无忧网 作者 叶赫华 sinckyzhang hotmail com 自从本人从事软件测试培训以来 接触了太多的软件测试工程师 发觉从业者多数存在以下现象 刚刚毕业 踏入IT行业 不懂开发或开发经
  • 高效程序员的40个好习惯和行为方式

    每一个好的习惯 开头都会相应有一个唱反调的句子哦 1 做事 出了问题 第一重要的是确定元凶 找到那个人 一旦证实了是他的错误 就可以保证这样的问题永远也不会再发生了 指责不会修复bug 把矛头对准问题的解决办法 而不是人 这是真正有用处的正
  • DNS使用TCP与UDP

    DNS同时占用UDP和TCP端口53是公认的 这种单个应用协议同时使用两种传输协议的情况在TCP IP栈也算是个另类 但很少有人知道DNS分别在什么情况下使用这两种协议 先简单介绍下TCP与UDP TCP是一种面向连接的协议 提供可靠的数据
  • IntelliJ IDEA中如何使用JUnit4

    背景 最近参与了一个Anroid医疗项目 其中项目底层有很多基础类及通讯类 而且很多涉及复杂的字节操作还有多线程同步及状态机处理 这样的项目做一下TDD还是必要的 尽量项目前期把风险降低一些 现在的问题是本人使用的是IntelliJ开发的A
  • AngularJs单元测试

    这篇文章主要介绍了angularJS中的单元测试实例 本文主要介绍利用Karma和Jasmine来进行ng模块的单元测试 并用Istanbul 来生成代码覆盖率测试报告 需要的朋友们可以参考下 以下可全都是干货哦 当ng项目越来越大的时候
  • 自动化测试——接口测试

    一 接口分类 1 内部接口 测试被测系统各个子模块之前的接口 或者测试被测系统提供给内部用户系统使用的接口 2 外部接口 被测系统调用外部的接口 系统对外提供的接口 接口测试重点 检查结论参数传递的正确性 输出结果的正确性及对各种异常情况的
  • 如何做自动化测试

    这个话题比较大 相信大家也都有自己的想法 我在这里写一些我自己的看法 请大家指教 什么叫做自动化测试工程师 首先 会使用自动化测试工具的测试人员不能够称之为完全的自动化测试人员 这类测试人员被称为 工具小子 Script Kid 这个阶段还
  • 测试:性能测试

    一 性能测试 性能测试是一种评估软件 系统或服务在特定条件下性能的过程 性能测试有助于确定系统的响应时间 吞吐量 可扩展性 稳定性和资源消耗等关键指标 一 响应时间 响应时间 Response Time 是性能测试中的一个重要指标 用于衡量
  • 【2024全网最火最全性能教程】一文搞懂性能测试!

    性能测试概念 我们经常看到的性能测试概念 有人或称之为性能策略 或称之为性能方法 或称之为性能场景分类 大概可以看到性能测试 负载测试 压力测试 强度测试等一堆专有名词的解释 针对这些概念 我不知道你看到的时候会不会像我的感觉一样 乱 一个
  • Mockito3.x详解

    目录 Mockito 1 简单示例 2 打桩测试 3 参数匹配器 4 调用次数验证 5 通过打桩为无返回值函数抛出异常 6 验证调用顺序 7 验证从未发生过的交互
  • ASTM D6147测定压缩情况下硫化橡胶和热塑弹性体作用力衰减 (应力松弛) 的标准试验方法

    标准名称 ASTM D6147 Standard Test Method for Vulcanized Rubber and Thermoplastic Elastomer Determination of Force Decay Stre

随机推荐

  • Ecovadis审核之【4大模块 7项原则 21项标准议题】

    Ecovadis企业社会责任涵盖内容 评估标准 参考模型 Ecovadis认证审计 四大主题模块 1 环境 2 劳工与人权 3 商业道德 4 可持续采购 Ecovadis认证审计之21项企业社会责任 CSR 标准 当评估一个公司的企业社会责
  • MySQL中基于InnoDB引擎的锁

    共享锁和排他锁 InnoDB实现了标准的行级锁 共享锁和排他锁 共享锁允许持有锁的事务读取一行 排他锁允许持有锁的事务更新或者删除一行 如果一个事务T1持有对第r行的共享锁 那么对于其他不同事务T2对第r行的锁请求处理方法如下 T2对于共享
  • 【教程】HTML快速学习

    教程 html快速学习 备注 一 HTML概述 二 标签 tag 三 HTML格式 四 注释 根标签 头部标签 1 注释 2 根标签 3 常见头部标签 五 常见主体标签 1 文本标题标签 heading 2 段落标签 p 3 功能标签 4
  • C++实现生产者和消费者模型

    C 实现生产者和消费者模型 C 实现生产者和消费者模型 1 实现细节 2 单生产者 单消费者模型 3 单生产者 多消费者模型 4 多生产者 单消费者模型 5 多生产者 多消费者模型 参考 C 实现生产者和消费者模型 1 实现细节 具体的实现
  • QT 多界面跳转以及窗口之间参数传递

    一 模式 之前一直用的是c 由于最近要使用CC来二次开发 所以先熟悉一下QT 1 从一个界面跳到另外一个界面不需要返回 2 从一个界面跳到另外一个界面需要返回 1 新增主窗口 二 窗口跳转 需要返回 主窗口 void MainWindow
  • 微信小程序之支付操作步骤

    视频教程链接 https www bilibili com video BV1nE41117BQ p 100 spm id from pageDriver 微信支付官方文档链接 https developers weixin qq com
  • SpringCloud系列之五---集中配置组件Config+消息总线Bus

    文章目录 前言 集中配置组件SpringCloudConfig 1 SpringCloudConfig 简介 2 配置客户端 3 配置服务端 4 测试 消息总线 SpringCloudBus 1 配置客户端 2 配置服务端 3 测试 前言
  • vue(7)虚拟DOM和diff算法

    虚拟DOM 虚拟DOM vnode 简单点来说就是用JS对象来模拟DOM结构 表达方式 将每一个标签都转为一个对象 这个对象有三个属性 tag props children tag 标签 也可以是组件 props 标签上的属性和方法 chi
  • SpringSecurity用户认证设置用户名和密码的三种方式

    文章目录 SpringSecurity用户认证设置用户名和密码的三种方式 首先明白几个单词的意思 SpringSecurity默认的用户认证 1 通过配置文件进行用户认证 2 通过配置类进行用户认证 There is no Password
  • RTTI vs Reflection

    运行时类型识别与反射对于C 和Java这样的高级语言非常重要 需要注意的一点的是谨慎使用RTTI 因为它不符合OO 的可替换原则 1 What is RTTI By Run Time Type Identification RTTI we
  • 如何做好项目管理

    我把管理技能分为两类 分别为项目管理和团队管理 这篇文章教你如何做好项目管理 在讲述这篇文章前 先简单介绍一下我的管理经验 之前在百度呆了3年半 系统学习了百度的项目管理流程 19年来到小米后 带领ShareSave团队做了1年项目管理和团
  • 数据的储存

    欢迎来到布谷的博客 博客主页 布谷的首页 所属专栏 明解C语言 感谢你的点赞 评论 收藏 关注 一 整形在内存中的存储 原码 反码 补码 计算机中整数有三种二进制的表示方法 原码 反码 补码 整数的原反补码是相同的 而负数三者互不相同 整数
  • windows下的wsl-kail

    wsl2下的kali环境 首先在微软自带的应用商店安装Windows 终端 接着我们对Windows 终端进行基本的设置 启动默认为powershell 使用父进程目录 修改一下后背景图片 接着我们修改一下 bat文件的默认打开方式 打开注
  • Tomcat和Nginx的具体区别

    Tomcat和Nginx都是Web服务器 但它们的职责和功能有所不同 1 Tomcat是Java Web应用服务器 支持JSP和Servlet等Java Web开发技术 而Nginx是高性能的HTTP和反向代理服务器 2 Tomcat支持J
  • C 标准库 - 《string.h》

    原文链接 https www runoob com cprogramming c standard library string h html 简介 string h 头文件定义了一个变量类型 一个宏和各种操作字符数组的函数 库变量 下面是
  • Python进阶学习分享之循环设计

    range 在Python中 for循环后的in跟随一个序列的话 循环每次使用的序列元素 而不是序列的下标 之前我们已经使用过range 来控制for循环 现在 我们继续开发range的功能 以实现下标对循环的控制 S abcdefghij
  • python搭建HTTP服务器并外网访问 - 内网穿透

    1 前言 Python作为热度比较高的编程语言 其语法简单且语句清晰 而且python有良好的兼容性 可以轻松的和其他编程语言 比如C C 建立的模块连接起来 而且python丰富强大的库 经过封装可以轻松调用 因此深受欢迎 今天我们就尝试
  • pytorch学习笔记13-利用GPU训练

    目录 GPU训练方式1 方式1如何操作 完整代码 结果 如果电脑上没有GPU 可以使用Google的colab GPU训练方式2 方式2如何操作 完整代码 用Google colab的输出 GPU训练方式1 方式1如何操作 找到神经网络模型
  • 解决Pycharm无法使用已经安装Selenium的问题

    电脑C盘安装python27的时候也安装了selenium 但是最近刚刚使用工具Pycharm 新建工程后 然后建立 py文件后 使用语句 from selenium webdriver support wait import WebDri
  • 程序性能分析及性能测试

    这里所说的程序是指对外提供tcp ip交互协议的服务性程序 网络程序性能分析很重要 比如随着网络请求流量越来越大 我们需要知道已部署的服务能不能满足需求 这里采用对网络服务程序进行建模的方法分析影响程序性能的各要素 并计算相关性能值 它不够