• 性能测试知识


    目录

    性能理论知识

    LR基本知识点

    1、LR工作原理:

    2、LR脚本支持的语言有:

    3、LR的四大组件

    4、Vugen的选项:

    5、事务的响应时间查看

    6、性能测试目的

    7、常见单词:

    LR性能问题

    1、请简述性能测试的过程。

    2、请写出基准测试的两种方式。

    LoadRunner 较深理解

    1、协议:

    2、开始录制

    3、调字体-----字体:

    4、注释单行:

    5、常见函数

    注解(事务/为什么添加检查点)

    6、看请求发送之后的页面:

    7、生成脚本之后,编译一下脚本;

    8、日志

    9、runtime setting:运行时设置;

    10、recording options:录制选项设置;

    11、tasks:任务:

    12、controller里面的runtime

    13、迭代优先级

    14、参数化  Open Parameter

    Update value on:该选项是用来控制参数获取、更新参数值的时机、条件

    Select next row:该选项是用来控制参数获取、变更参数值的方式

    参数化取值方式

    LR基准测试基础---知识

    1、 基本使用方法

    2、Recording options:录制选项(详解)

    HTML mode:HTML模式

    URL mode:URL模式

    Port Mapping

    3、录制乱码

    Support:该选项和LR中录制、生成脚本时的乱码有关。

    乱码问题:乱码问题的产生,本质上就是编码不一致导致的。

    4、runtime setting :运行时设置

    5、log:日志

    6、lr_think_time:思考时间:

    7、Agent(代理程序):

    8、添加集合点(三种方式): 

    9、XXXXX

    10、LR脚本增强操作主要有

    LR基准测试

    LR并发测试

    LR第四大组件问题

    LR深入性能问题

    1、如何实现一半用户的并发?请写出并发测试的详细步骤;

    2、参数化策略的常用组合有哪几种?请写出参数化的详细步骤;

    3、LR迭代什么意思:

    4、如何减少客户端对服务器的压力:

    5、请写出文本检查点的函数,并说明函数的注意点;

    6、手动关联的步骤;



    性能理论知识

    1、软件的性能,包含两个特性:包含两个特性:时间资源和空间资源

    1)         时间资源是指:系统处理客户请求的响应时间;

    2)         空间资源是指:系统资源消耗的情况,常见的系统资源主要包括:CPU、内存、网络、磁盘;

    2、用户的感性时间和真正的响应时间;

    感性时间:从客户端提交请求到系统开始返回时间;

    真正的响应时间:从客户端提交请求,到系统将全部数据呈现出来的时间;                                   

    3、响应时间:

    网络消耗的时间+应用服务器处理的时间+数据库服务器处理的时间;

    响应时间:做一个操作或是一系列消耗的时间; 

    响应时间=网络消耗的时间+应用服务器处理的时间+数据库服务器处理的时间

    1)用户体验时间:带有主观性,从请求发出,到收到数据开始,就认为这是响应时间

    2) 真正的响应时间:从请求发送出去,到所有数据全部返回,这才是真正的响应时间

    4、吞吐量:

    单位时间内服务器处理的字节数(byte/sec)

    5、吞吐率:

    单位时间内服务器返回的字节数(吞吐量/测试时间);

    吞吐率的值越大,系统的负载能力越强。

    6、思考时间:

    是指用户在进行操作时,每个请求之间的时间间隔;lr_thank_time();

    7、TPS(transaction per second):

    表示服务器每秒处理的事务数。

    8、点击率:

    每秒钟用户向服务器提交的HTTP数量

      1)点击率不是用户的单击次数

      2)点击率越大,对服务器的压力就越大

    9、资源利用率:

    指服务器系统不同硬件资源(CPU、内存、网络、磁盘)被使用的程度

    10、性能计数器:

    是描述服务器或者操作系统性能的一些数据指标;

    1)在性能测试中常用资源利用率进行横向对比。

    11、基准测试(单用户测试):

    运行一种或者多种业务,将测试结果作为基线数据,为系统调优或者评测提供参考;

    ·目的:测试获取系统响应时间的基准值。

    ·操作:模拟一个用户多次请求服务器,取响应时间的平均值即可。

    12、负载测试(最大处理能力):

    负载测试:是通过对被测试系统不断加压,直到超出了预定的指标或者是部分资源已经达到了饱和程度,来测试系统的最大负载。

    ·目的:是测试系统的最大处理能力和系统的最佳性能表现。

    ·方式:通过模拟不同量级的负载用户数来进行测试。

    13、压力测试(稳定性):

    系统已经达到饱和程度,来测试系统处理业务能力以及系统是否会出错误;

    压力测试:指系统到达饱和程度(CPU、磁盘、已经处于饱和程度)

    ·目的:是测试系统的稳定性,评估系统在极限负载情况下的稳定性如何。

    ·方式:极限不等于最大。时间一般建议是7×24小时。至少12-24小时。

    14、容量测试(不同容量):

    ·目的:评估、预估系统在不同容量级别下的性能表现。 

    15、配置测试

     ·目的:通过测试,获取系统的最低配置和推荐配置。

    是通过调整系统软硬件环境,了解各种不同环境对系统性能的影响,从而找到最优质配置;

    16、并发测试(用户同时发送)

       1)概念:同一时间与服务器进行数据交互的所有用户数量;

       2)两个要点:同一时刻(瞬时压力)、要与服务器有数据交换;

       3)误区:a、不是所有的用户都叫并发用户; b、不是所有在线的用户都是并发用户; 

    ·目的:测试系统是否存在资源争用、事务冲突、锁的升级等现象。

    ·方法:一般通过严格的并发来实现。

    17、思考时间:                  

    是指用户在进行操作时,每个请求之间的时间间隔(步骤之间的等待时间);lr_thank_time();

    18、性能测试的方法主要方法包括:

    基准测试/并发测试

    负载测试/压力测试

    配置测试/可靠性测试

    19、可靠性测试:

    是指当系统处于一定业务压力下,让系统持续运行一段时间,观察系统是否达到要求的稳定性;

    LR基本知识点

    1、LR工作原理:

        1)对与给定的被测系统(B/S、C/S),VUGen会根据所选择的协议,进行录制和捕捉用户操作,生成脚本,可以对脚本进行调试增强(事务、检查点、集合点、参数化、关联),并且可设置runtime setting(运行时设置),形成一个简单的场景;

        2)在controller中,可以联合LoadRunner模拟虚拟用户,创建设置运行监控场景,收集数据;

        3)生成测试报告和图表(.doc/execl/html),对测试结果进行分析(合并图表、设置目标、细分图、钻取);

    2、LR脚本支持的语言有:

    java、c、Visual Basic、vbscript

    3、LR的四大组件

    Vugen:Virtual User Generator,虚拟用户生成器是LR中用来录制、生成、调试脚本的组件。
                虚拟用户,在LR中,脚本就是虚拟用户。严格来说脚本只是虚拟用户的行为模板。
                在Vugen中,只能模拟一个“用户”(线程)的行为,不能模拟多个用户的行为。

    Controller:控制器,是LR中用来设计、实现和执行场景的组件。
                场景:就是指很多用户执行脚本的场景。
                在Controller中,实现的是多用户的行为模式。

    Analysis:分析器,是LR中用来收集、整理测试结果,并且出具初步的性能测试报告和图表的工具

                  该工具只是提供了各种用于数据处理、分析的选项和功能,帮助用户去完成数据分析、定位瓶颈的工作。

    Load Generator:负载生成器,是LR中用来实现“虚拟用户”,即线程/进程申请、调度的工具。

    PS:一般来说,安装LR就会包含这四个核心组件。。然后Load Generator组件是可以独立安装,且可以安装在非windows环境下。负载机上可以只安装Load Generator组件。

    4、Vugen的选项:

        在LR的Vugen中,选项整体是分为三类:

        ·Recording options:录制选项,控制的是脚本的录制、脚本的生成。

        ·Runtime settings:运行时选项,控制的是脚本实际运行时的一些选项。

        ·General options:常规选项,控制的是Vugen自身的一些运行设置。

    5、事务的响应时间查看

            事务的响应时间在 analysis、controller  组件中,进行查看。

    6、性能测试目的

            性能测试的目的是为了测试产品性能是否达标,监控时间资源和空间资源,分析性能瓶颈,提供调优方案,达到产品标准

    7、常见单词:

    1)Runtime setting:运行时设置

           Runlogic:设置迭代次数

           Pacing:设置迭代间隔

           Log:设置日志相关

           Think time:设置思考时间

    2)edit recording options:编辑录制选择

           Recording:设置HTML的录制还是URL的录制

           Advanced:设置支持的字符集--UTF-8

           Correlation:设置关联规则

    3)vusers_init:一般录制初始化过程(比如登录)

           action:一般录制关心的操作

           vusers_init:一般录制结束操作(比如退出)

           globals.h:声明函数

          PS:init和end与action:

            ①  Action里面可以设置迭代和集合点,Init和end不可以设置。

            ②  init和end可以设置插入事务和检查点

    LR性能问题

    1、请简述性能测试的过程。

    制定测试计划---生成测试脚本----创建、设置、运行、监控、场景、收集数据-----分析测试结构

    2、请写出基准测试的两种方式。

    设置迭代次数、设置持续时间

    LoadRunner 较深理解

    1、协议:

    1)single 单协议;(web  (HTTP/HHTML)、Ajax)

    2)multiple:多协议;

    3)recent:最近使用过的协议

    2、开始录制

    1)application type:interner(B/S)   win32(C/S)

    2) program to record:用哪个浏览器去录制;

    3) URL address:被测试系统的地址

    4)Record into action :把脚本录制到那个action里面

            Vuser init :初始化脚本(一般会录制打开浏览器以及登录操作)

            Action:一般录制关心的动作(Action功能会强大一些,如迭代,集合点)

            Vuser_end:结束脚本,一般录制退出和关闭浏览器的操作       

    Globals.h:头文件、声明函数

    Ps:1)init、action、end只能从前往后选,不能到回去选;

            2)如果只是录制登录操作,那么其实关心的就是登入,可以把登入

            直接录制到action;

    3、调字体-----字体:

            LR界面相关大小:直接  ctrl  + 鼠标光标滚动即可 

            LR脚本字体大小:tools----general Option ------- evnvironment----editor

    4、注释单行:

            双斜杆   //XXXXXXXXXXXXXXXXXXXX

    5、常见函数

            Web_URL();                           //发送页面请求的函数

      web_reg_find();                     //1)放在相应请求之前;

                                                      2)检查的文案在源码中查找;

      web_find();                            //1)放在相应请求之后;

                                                      2)检查的文案直接在页面中查找;

                                                      3)查找内容的左右相反;

                                                      4)运行时设置里面允许图像和文本检查点

      web_image_find();                //图像检查点函数

            lr_rendezvous(“buy”);            //集合点函数

            lr_output_message();          //输出函数

            lr_eval_string();                   //把lr的变量介绍给C使用,lr的变量不需要定义

            lr_start_transaction(“login”);  //开始事物login

            lr_end_transaction(“login”,LR_AUTO);  //结束事物 login

                    其中LR_AUTO,自动判断事物的状态《pass、fail、stop》

                       ps:  1)以是否运行结束事务的函数来判断事务的状态

                                 2)开始事务和结束事务是成对出现的;

            lr_think_time(150);           //思考时间(单位:秒)

                    思考时间:表示有150s的时间没有做任何操作,没有与服务器进行任何数据交换;        

            web_submit_form();  //发送表单请求的函数;

    注解(事务/为什么添加检查点)

    PS:①LR_AUTO自动判断事务状态(pass、fail、stop)以是否运行结束事务函数来判断

      ②  为什么要插入检查点:因为事务状态是通过是否运行结束事务来判断,lr验证的是数据的交换,没有校验数据包的数据是否正确,所以要插入检查点。

    6、看请求发送之后的页面:

            光标放在相应的请求函数,切换到tree视图,可以看到相应的页面(快照)

    7、生成脚本之后,编译一下脚本;

    编译脚本可以发现语法错误(无法发现逻辑错误),修改脚本之后,进行编译;

    8、日志

            replay log:回放日志;

            recording log:录制时的日志;

            correlation results:关联结果;

            generation log:生成日志;

    9、runtime setting:运行时设置;

            runtime setting:运行时设置;是用来控制脚本的运行相关的选项。
            PS:在Vugen和Controller中都可以对脚本的运行时设置选项进行设置。

    10、recording options:录制选项设置;

           录制选项该选项是用来控制LR录制和生成脚本的模式,模式有两大类三小类

           两大类:HTML mode:HTML模式,又叫主请求模式

                         URL mode:URL模式,又叫http模式

           三小类:HTML下基于用户行为模式(由HTML模式拆分两个)

                         HTML下基于URLs模式(由HTML模式拆分两个)

                        URL mode:URL模式,又叫http模式(不变

    11、tasks:任务:

            1)recording:开始录制的入口,录制概要(协议、action、事务);

            2)replay:再次回放;

            3)enhancements:脚本增强(事务、参数化、检查点)

            4)prepare for load:准备负载(迭代、并发用户数)

    12、controller里面的runtime

         Setting优先于VUGen里面的runtime setting

    13、迭代优先级

    controller里面的持续时间(duration)优先于runtime setting 里面的迭代次数

    14、参数化  Open Parameter

    Update value on:该选项是用来控制参数获取、更新参数值的时机、条件

                    Each Iteration:每次迭代,是指在每一次迭代开始之前,参数会去获取、更新参数值。在下一次迭代开始之前,不论参数是否被调用,调用一次还是多次,参数的值都不会发生变更

                    Each Occurrence:每次出现,是指每一次参数被调用,参数就会去获取、更新参数值。调用一次,变更一次

                    Once:仅一次,是指参数第一次被调用时,参数会获取一个参数值,在虚拟用户的生命周期中,参数的值不再发生变更

    Select next row:该选项是用来控制参数获取、变更参数值的方式

                    Sequential:顺序取值
                    Random:随机取值
                    Unique:唯一取值
                    Same line as XXX:该选项仅当脚本中存在2个及2个以上的文件类型的参数时才会出现。作用:当参数B选择了Same line as 参数A,则表示参数B被调用时,会使用和参数A相同行号的值

    参数化取值方式

    A B C D E F G                H I J K L M N                O P Q                R S T                U V W X Y Z

    医生        甲、乙、丙

    病人        甲1、甲2、甲3、甲4、乙1、乙2、乙3、乙4、丙1、丙2、丙3、丙4

    甲医生只能对甲X病人操作,不能对其他乙、丙病人操作;作业:以分块方式进行参数化LR

    英文简称中文描述

            Vuser1

            Vuser2
    Sequential + Each Iteration顺序取值 + 每次迭代        AA|BB        AA|BB        
    Sequential + Each Occurrence顺序取值 + 每次出现        AB|CD        AB|CD
    Sequential + Once顺序取值 + 仅一次        AA|AA        AA|AA
    Random + Each Iteration随机取值 + 每次迭代        XX|YY       MM|NN
    Random + Each Occurrence随机取值 + 每次出现    X1X2|X3X4   M1M2|M3M4
    Random + Once随机取值 + 仅一次        XX|XX

          MM|MM

    Same line as XXX同一行 XXX()        AA|BB        AA|BB        
    Alocale X values for each VuserX个虚拟用户做为块      Aa1a2|Bb1b2

        Aa1a2|Bb1b2

    LR基准测试基础---知识

    1、 基本使用方法

            1)在controller里面测试:第二个组件才能收集数据

            2)基准测试:设置迭代次数(number of iterations)、设置持续时间(duration)

    2、Recording options:录制选项(详解)

    该选项是用来控制LR录制和生成脚本的模式

    HTML mode:HTML模式

    HTML mode:HTML模式又叫主请求模式。在该模式下,LR只会对主请求进行解析、生成脚本函数。

            特征:脚本中的请求函数会包含:mode=HTML
            优点:录制生成的脚本简单。
            缺点:可能会遗漏某些ajax类型的请求。

    HTML模式又分为两种子类型:

    ①HTML下基于用户行为模式:该模式下,LR会通过上下文(Context)的方式来建立上下相邻的两个请求之间的依赖,是脚本层面的强制依赖。在该模式下,从第二个请求开始,每一个请求的执行都是建立在前一个请求的响应的基础上。
               优点:对于业务中本身就存在上下依赖的请求,不需要做关联处理。
               缺点:脚本的耦合度高,可编辑性几乎为0. 

    ②HTML下基于URLs模式:该模式下,LR生成的请求都是基于纯粹的URL请求的方式来生成,每一个请求之间都是独立的。
                缺点:对于业务中的有依赖关系的请求,必须要做关联处理。
                优点:脚本的耦合度低,可编辑性高。 

    URL mode:URL模式

    URL mode:URL模式又叫http模式。在该模式下,LR会对所有协议级别的请求(包括主请求和子请求)都进行解析、生成对应的脚本函数。

            特征:脚本中的请求函数会包含:mode=HTTP
            优点:不会遗漏任何协议级别的请求,比如说ajax类请求。
            缺点:录制生成的脚本臃肿,可读性较差。
            PS:在实际操作过程中,建议采用HTML下基于URLs模式为主,以URL模式为辅助。 

    Port Mapping

    Port Mapping:和代理录制、https等有关。Capture level:默认是socket级别。 

    3、录制乱码

    Support:该选项和LR中录制、生成脚本时的乱码有关。

            勾选Support,则LR在录制生成脚本时,会自动对服务器响应的utf-8编码的数据进行解码,转化为本地编码的脚本。
            不勾选Support,则LR在录制生成脚本时,不会自动对服务器响应的utf-8编码的数据进行解码,直接将UTF-8编码的数据存为本地编码的脚本,此时就会产生乱码。

    乱码问题:乱码问题的产生,本质上就是编码不一致导致的。

            在LR中,乱码问题的总结如下:
            脚本中是否存在乱码,对于脚本本身的执行其实是没有影响的(设置正确的情况)。
            Support选项不是直接影响脚本的乱码,而是通过间接的方式影响。真正影响脚本中是否可以存在乱码的是运行时设置选项中的:Convert from/to UTF-8选项。
            一旦勾选Support,则生成的脚本会解析UTF-8数据,会将Convert选项设置为1(Yes),这就意味着脚本中可以直接使用本地编码的数据。
            一旦不勾选Support,则生成的脚本不会解析UTF-8数据,会将Convert选项设置为0(No),这就意味着脚本中不可以直接使用本地编码的数据。 

    4、runtime setting :运行时设置

            1)run logic :设置迭代次数(只有 action会参与)vuser_init,vuser_end不参与迭代

            2) pacing:迭代间隔;as soon as:前一次迭代一结束,马上开始下一次迭代;

          the previous iteration ends:

         ①fixed:前一次迭代结束之后固定多长时间再开始下一次迭代;

    ②random:前一次迭代结束之后随机多长时间再开始下一次迭代;

    At XX intervals:

               ①fixed:两次迭代之间间隔固定多长时间

    ②random:两次迭代之间间隔随机多长时间

               Ps)  1.注意intervals是前一次迭代开始就计时,而不是等前一次迭代结束;

            3)设置迭代间隔,可以减少单位时间客户端对服务端的压力;

    5、log:日志

            only:只有出错时才发送日志

            always:总是发送日志

            日志信息的等级:

            standard:标准日志

            extended:扩展日志:

            parameter:参数替换

            data:从服务器返回的

            advanced:高级跟踪

    6、lr_think_time:思考时间:

            忽略思考时间、回放思考时间

            as:按照录制时候的时间回放

            multiply:按照录制时间的倍数进行回放

            use random percentage:按照录制的随机百分比进行回放

            limit:限制思考时间最大为多长时间

            ps:1)limit可以和前面三项一起使用;

                    2)设置思考时间,可以减少单位时间内对服务器的压力

    7、Agent(代理程序):

            右下角有一个雷达的标志(LoadRunner agent process)

                    1)  每一台负载机都需要安装agent,并且打开

                    2)  可以接受来自总控制的命令

                    3)  打开agent :程序----LoadRunner----advanced setting----lr  agent  process

    8、添加集合点(三种方式): 

            集合点测试方法:lr_rendezvous(“XXX”); 

                    A.录制时添加

                    B.菜单栏insert-----rendezvous

                    C.在相应位置----右键----insert----rendezvous

    9、XXXXX

            all vusers:当所有的用户的百分比达到集合点的时候释放

            all running vusers :当所有运行中的虚拟用户的百分比到达集合点的时候释放

            XXX vusers :设置具体的虚拟用户数到达集合点的时候释放

            Timeout between vusers :虚拟用户之间的超过时间:30s;

    10、LR脚本增强操作主要有

            参数化

            关联

            事务

            检查点

            思考时间

            集合点

    LR基准测试

    1)设置迭代次数步骤:runtime setting:

      ①runlogic:8(迭代次数

      ②pacing:随机2-3s(迭代间隔

      ③log:出错时发送标准日志

            ④lr_think_time:50%-150%

            加载方式: ①运行之前初始化 ②同时加载用户;③duration:运行到脚本结束就停止

    2)设置持续时间步骤:runtime setting:

           ①runlogic:1

           ②pacing:随机2-3s

           ③log:出错时发送标准日志

           ④lr_think_time:50%-150%

            加载方式:①运行之前初始化   ②同时加载用户;③duration:设置持续3分钟    ④stop:同时结束(释放)虚拟用户

    3)添加负载机(添加的负载机是已经ping通过的):design视图-----load generator 处add----IP和平台

    4)连接添加的负载机:工具栏(菜单scenario)------load generator----连接;

    借助其他的机器产生负载进行性能测试

    LR并发测试

    1.要有集合点        2.并发策略(controller中设置)

    并发用户数的设置:VUGen里面是单用户,到controller里面才可以设置多用户;

    基本步骤: 

    1.  准备脚本(并且插入集合点)

    2.  设置并发策略

    3.  同时加载所有用户

    4.  Runtime setting 中忽略思考,设置迭代为1

    1)设置迭代次数步骤:runtime setting:

    ①runlogic:8(迭代次数

    ②pacing:随机2-3s(迭代间隔

    ③log:出错时发送标准日志

          ④lr_think_time:50%-150%

    加载方式①运行之前初始化     ②同时加载用户;  ③duration:运行到脚本结束就停止

    2)设置持续时间步骤:runtime setting:

            ①runlogic:1

            ②pacing:随机2-3s

            ③log:出错时发送标准日志

            ④lr_think_time:50%-150%

    加载方式①运行之前初始化  ②同时加载用户;③duration:设置持续3分钟 ④stop:同时结束(释放)虚拟用户

    LR第四大组件问题

    Load generator 负载生成器         Mmdrv.exe  用来实现虚拟用户的进程

    一个进程大概支持50个线程

    1)先确定一个负载机可以支持多少个用户;(看一个进程占用多少资源)

    2)确定需要多少个负载机

    LR深入性能问题

    1、如何实现一半用户的并发?请写出并发测试的详细步骤;

    在并发策略里,设置第一项为50%或者第三项设置具体虚拟用户的一半

       步骤:

    1) 准备脚本(脚本中插入集合点)

    2) 设置并发策略controller

    3) 加载方式中设置同时加载所有用户

    4) 运行时设置里忽略思考时间,迭代间隔迭代1次

    2、参数化策略的常用组合有哪几种?请写出参数化的详细步骤;

       参数取值方式:

            UEA:唯一+每次迭代更新+超出范围时放弃

            SE:按顺序+每次迭代更新

        步骤:

    1) 找到需要参数化的常量

    2) 参数替换常量

    3) 准备参数池(数据和参数取值策略)

    4) 设置迭代

    3、LR迭代什么意思:

    重复,action(action的第一行脚本到action的最后一行脚本)参与迭代;

    4、如何减少客户端对服务器的压力:

            1)在脚本中添加思考时间,把思考时间延长;

            2)在运行时设置里面thank time和pacing设置调大一些;

            3)调整虚拟用户数量;

            4)加载用户的间隔延长;

    5、请写出文本检查点的函数,并说明函数的注意点;

            Web_reg_find();  

                    1)放在相应请求之前;

                    2)检查的文案在源码中查找;

            Web_find();

                    1)放在相应请求之后;

                    2)检查的文案直接在页面中查找;

                    3)查找内容的左右相反;

                    4)运行时设置里面允许图像和文本检查点

    6、手动关联的步骤;

            Web_reg_save_param();

                    1) 找到动态数据

                    2) 在生成日志中找到左右边界

                    3) 找到生成动态数据的相应请求

                    4) 在相应请求之前写上关联函数----关联函数:web_reg_save_param();

                    5) 替换动态数据

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    逍遥自在学C语言 | 宏定义技巧让你的C代码快人一步
    小满网络模型&http1-http2 &浏览器缓存
    Autosys Introduction and Architecture
    背景图片属性
    今年被裁员三次,还有两个月直接躺平吗?
    Pandas数据处理分析系列4-数据如何清洗
    C++入门学习1-Clion配置环境和运行第一个C++程序(Clion)
    C++引用内联auto关键字等介绍
    windows ---命令详解1
    将存在课题的过程可视化,丰田的“自工程完结”是什么?
  • 原文地址:https://blog.csdn.net/qq_36675754/article/details/126734557