当前位置:   article > 正文

【软件设计师备考 专题 】计算机系统性能评测方式_计算机测试

计算机测试


软考_软件设计专栏:软考软件设计师教程


1. 基准测试

1.1 基准测试的概念和作用

基准测试是指通过测量和评估计算机系统在特定条件下的性能指标,以便作为后续性能改进和优化的参考标准。基准测试可以帮助开发人员了解系统的性能瓶颈,找出系统的优化空间,提高系统的整体性能。

基准测试的作用主要有以下几点:

  • 评估系统的性能水平:通过基准测试可以了解系统在特定负载下的性能表现,包括响应时间、吞吐量、并发性等指标。
  • 发现性能瓶颈:基准测试可以帮助开发人员找出系统中的性能瓶颈,从而有针对性地进行性能优化。
  • 比较不同系统的性能:通过对不同系统进行基准测试,可以对比它们的性能差异,为系统选择和优化提供依据。

1.2 基准测试的分类和常见工具

基准测试可以根据测试对象的不同进行分类,常见的基准测试包括:

  • 硬件基准测试:主要针对计算机硬件的性能进行测试,如CPU性能、内存带宽等。
  • 软件基准测试:主要针对特定软件的性能进行测试,如数据库性能、Web服务器性能等。
  • 系统基准测试:综合考虑硬件和软件的性能进行测试,如整个操作系统的性能。

常见的基准测试工具包括:

  • SPEC CPU:用于测试CPU的性能。
  • Geekbench:用于测试综合性能,包括CPU、内存、图形等。
  • Apache JMeter:用于测试Web服务器的性能。
  • Sysbench:用于测试数据库的性能。
  • Phoronix Test Suite:一个综合性能测试套件,支持多种硬件和软件测试。

1.3 基准测试的优缺点及适用场景

基准测试具有以下优点:

  • 可靠性高:基准测试使用标准化的测试方法和工具,可以提供准确可靠的性能指标。
  • 可重复性好:基准测试可以在相同的测试环境下多次运行,保证测试结果的可重复性。
  • 可比性强:基准测试可以对比不同系统或不同配置的性能差异,为性能优化提供参考。

然而,基准测试也存在一些缺点:

  • 可能不够真实:基准测试是在特定条件下进行的,可能无法完全模拟真实的使用场景。
  • 可能忽略细节:基准测试通常关注整体性能指标,可能忽略了一些细节问题。

基准测试适用于以下场景:

  • 系统性能评估:在系统设计初期或系统升级时,通过基准测试评估系统的性能水平。
  • 性能优化:通过基准测试找出系统的性能瓶颈,进行有针对性的性能优化。
  • 系统对比:通过对不同系统进行基准测试,对比它们的性能差异,为系统选择提供依据。

1.4 基准测试示例

下面以C/C++语言为例,演示一个基准测试的示例代码:

#include <iostream>
#include <chrono>

// 待测试的函数
int calculateSum(int a, int b) {
    int sum = 0;
    for (int i = a; i <= b; i++) {
        sum += i;
    }
    return sum;
}

int main() {
    int a = 1;
    int b = 1000000;
    
    auto start = std::chrono::steady_clock::now(); // 记录开始时间
    
    int result = calculateSum(a, b); // 执行待测试的函数
    
    auto end = std::chrono::steady_clock::now(); // 记录结束时间
    
    std::chrono::duration<double> duration = end - start; // 计算执行时间
    
    std::cout << "Sum: " << result << std::endl;
    std::cout << "Execution time: " << duration.count() << " seconds" << std::endl;
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

上述示例代码演示了一个计算从1到1000000的整数和的函数。通过使用std::chrono库记录开始时间和结束时间,并计算执行时间,可以得到该函数的性能指标。这个示例可以用作基准测试的起点,根据需要进行修改和扩展。

通过基准测试,我们可以对比不同的算法或不同的优化方式对性能的影响,从而找到性能优化的方向和策略。

1.5 小结

本章介绍了基准测试的概念和作用,包括基准测试的分类和常见工具。同时,我们探讨了基准测试的优缺点及适用场景,并通过一个C/C++示例代码演示了基准测试的实际应用。基准测试是评估计算机系统性能的重要手段,对于软件设计师考试中的相关知识点具有重要意义。在接下来的章节中,我们将继续介绍计算机系统性能评测的其他方式。


2. 基准测试

2.1 基准测试概述

基准测试是一种通过对计算机系统进行一系列标准化测试来评估其性能的方法。它可以帮助我们了解系统在不同负载下的表现,并对系统进行性能比较和优化。

2.2 基准测试分类

基准测试可以根据测试的对象和目的进行分类。常见的基准测试分类有以下几种:

分类描述
硬件基准测试测试计算机硬件的性能,如CPU、内存、硬盘等
软件基准测试测试特定软件或应用程序的性能,如数据库、Web服务器等
系统基准测试测试整个计算机系统的性能,包括硬件和软件的综合表现
标准基准测试使用公认的标准测试套件,如SPEC CPU2006、Sysbench等进行测试
自定义基准测试根据具体需求自行设计和实现的测试方法

2.3 常见基准测试工具

进行基准测试时,可以使用各种工具来辅助测试。以下是一些常见的基准测试工具:

  • UnixBench:用于测试Unix和Linux系统的性能,包括CPU、内存、磁盘等方面。
  • Geekbench:跨平台的基准测试工具,可以测试CPU和内存性能。
  • IOzone:用于测试文件系统和磁盘I/O性能的工具。
  • Apache JMeter:用于测试Web应用程序的性能和负载能力。
  • MySQL Benchmark:用于测试MySQL数据库性能的工具。

2.4 基准测试的优缺点及适用场景

基准测试具有以下优点:

  • 可以客观地评估系统的性能,提供性能指标和数据支持。
  • 可以比较不同系统或不同配置的性能差异,帮助选择合适的系统或配置。
  • 可以发现系统的瓶颈和性能短板,指导性能优化和改进。

然而,基准测试也存在一些缺点:

  • 受测试环境和配置的影响,测试结果可能不具备普适性。
  • 部分测试工具需要较高的技术水平和专业知识才能正确使用。
  • 测试过程可能会对系统产生一定的负载,影响正常业务运行。

基准测试适用于以下场景:

  • 选择合适的硬件配置:通过测试不同硬件配置的性能差异,选择最适合的硬件配置。
  • 优化系统性能:通过测试发现系统的性能瓶颈,进行相应的优化和改进。
  • 比较不同系统或软件版本的性能:通过测试不同系统或软件版本的性能差异,选择最优的系统或软件版本。

2.5 基准测试示例

下面以C++编写一个简单的基准测试示例,测试两个排序算法的性能差异:

#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>

// 冒泡排序算法
void bubbleSort(std::vector<int>& nums) {
    int n = nums.size();
    for (int i = 0; i < n-1; ++i) {
        for (int j = 0; j < n-i-1; ++j) {
            if (nums[j] > nums[j+1]) {
                std::swap(nums[j], nums[j+1]);
            }
        }
    }
}

// 快速排序算法
void quickSort(std::vector<int>& nums, int left, int right) {
    if (left >= right) {
        return;
    }
    int pivot = nums[left];
    int i = left, j = right;
    while (i < j) {
        while (i < j && nums[j] >= pivot) {
            --j;
        }
        nums[i] = nums[j];
        while (i < j && nums[i] <= pivot) {
            ++i;
        }
        nums[j] = nums[i];
    }
    nums[i] = pivot;
    quickSort(nums, left, i-1);
    quickSort(nums, i+1, right);
}

int main() {
    std::vector<int> nums = {5, 2, 8, 9, 1, 3};
    
    // 测试冒泡排序的性能
    auto start = std::chrono::high_resolution_clock::now();
    bubbleSort(nums);
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double> duration = end - start;
    std::cout << "冒泡排序花费时间:" << duration.count() << "秒" << std::endl;
    
    // 重新初始化数组
    nums = {5, 2, 8, 9, 1, 3};
    
    // 测试快速排序的性能
    start = std::chrono::high_resolution_clock::now();
    quickSort(nums, 0, nums.size()-1);
    end = std::chrono::high_resolution_clock::now();
    duration = end - start;
    std::cout << "快速排序花费时间:" << duration.count() << "秒" << std::endl;
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61

在上述示例中,我们使用了std::chrono库来计算排序算法的执行时间,通过比较两种排序算法的执行时间,可以初步评估它们的性能差异。

以上是基准测试的基本内容和示例,希望能对你理解计算机系统性能评测方式有所帮助。下一章将介绍负载测试的相关知识点。


3. 负载测试

3.1 负载测试的定义和目的

负载测试是一种评估计算机系统在不同负载条件下的性能表现的方法。通过模拟实际使用场景,向系统施加不同程度的负载,可以评估系统在高负载下的稳定性、响应时间和吞吐量等性能指标。负载测试的目的是为了发现系统在负载增加时是否能够正常工作,并找出系统的瓶颈和性能问题。

3.2 负载测试的常见方法和工具

3.2.1 压力测试方法

压力测试是负载测试的一种常见方法,通过增加并发用户数或请求量来逐渐增加系统的负载,观察系统的响应时间和吞吐量的变化情况。常用的压力测试方法包括逐步增加负载、快速增加负载和持续增加负载等。

3.2.2 负载生成工具

负载生成工具是进行负载测试的重要工具,可以模拟大量用户同时访问系统的情况。常见的负载生成工具有Apache JMeter、LoadRunner和Gatling等。这些工具可以模拟不同类型的负载,如并发用户数、请求量和网络流量等。

3.2.3 负载测试场景设计

在进行负载测试时,需要设计合适的负载测试场景,以模拟真实的使用情况。负载测试场景包括用户行为模拟、并发用户数设置、请求量控制等。通过合理设计负载测试场景,可以更准确地评估系统在实际使用情况下的性能表现。

3.3 负载测试的优缺点及适用场景

3.3.1 优点

  • 可以评估系统在高负载下的性能表现,帮助发现系统的瓶颈和性能问题。
  • 可以验证系统在不同负载条件下的稳定性和可靠性。
  • 可以为系统的容量规划和性能优化提供参考依据。

3.3.2 缺点

  • 负载测试需要消耗大量的时间和资源。
  • 负载测试结果受测试环境和测试数据的影响,可能存在一定的误差。
  • 负载测试需要具备一定的技术和经验,进行测试和结果分析较为复杂。

3.3.3 适用场景

  • 在系统上线前进行负载测试,评估系统的性能和稳定性。
  • 在系统升级或扩容前进行负载测试,验证系统的扩展能力。
  • 在系统运行一段时间后进行负载测试,检测系统的性能衰减和瓶颈。

3.4 示例:使用Apache JMeter进行负载测试

以下是使用Apache JMeter进行负载测试的示例代码和注释:

import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.engine.StandardJMeterEngine;
import org.apache.jmeter.protocol.http.sampler.HTTPSampler;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.threads.ThreadGroup;
import org.apache.jmeter.util.JMeterUtils;

public class LoadTestExample {
    public static void main(String[] args) throws Exception {
        // 初始化JMeter
        JMeterUtils.loadJMeterProperties("jmeter.properties");
        JMeterUtils.initLocale();

        // 创建测试计划
        TestPlan testPlan = new TestPlan("Load Test Example");

        // 创建线程组
        ThreadGroup threadGroup = new ThreadGroup();
        threadGroup.setNumThreads(100);  // 设置并发用户数
        threadGroup.setRampUp(10);  // 设置线程启动时间
        threadGroup.setSamplerController(new LoopController());  // 设置循环控制器

        // 创建HTTP请求采样器
        HTTPSampler httpSampler = new HTTPSampler();
        httpSampler.setDomain("example.com");  // 设置请求的域名
        httpSampler.setPath("/api");  // 设置请求的路径
        httpSampler.setMethod("GET");  // 设置请求的方法

        // 将线程组和HTTP请求采样器添加到测试计划
        testPlan.addThreadGroup(threadGroup);
        threadGroup.addSampler(httpSampler);

        // 启动JMeter引擎并执行测试计划
        StandardJMeterEngine jmeter = new StandardJMeterEngine();
        jmeter.configure(testPlan);
        jmeter.run();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

通过以上示例代码,我们可以使用Apache JMeter进行负载测试,模拟100个并发用户访问指定的API接口。可以根据实际需求调整并发用户数、请求路径和请求方法等参数。

3.5 小结

负载测试是评估计算机系统性能的重要手段之一,通过模拟实际负载情况,可以评估系统在高负载下的性能表现。在进行负载测试时,可以采用压力测试方法、使用负载生成工具和设计合适的负载测试场景。负载测试具有一定的优点和缺点,并适用于系统上线前、升级扩容前和系统运行一段时间后的场景。


4. 压力测试

4.1 压力测试的概念和意义

压力测试是一种评估计算机系统在高负载情况下的性能表现的方法。通过模拟大量用户并发访问或者持续高负载的情况,测试系统在压力下的稳定性、性能瓶颈和资源利用率等指标,以便发现系统的弱点,并进行优化和改进。

压力测试的意义在于:

  • 发现系统的性能瓶颈和资源瓶颈,为系统优化提供依据。
  • 验证系统在高负载情况下的稳定性和可靠性,评估系统的承载能力。
  • 预测系统在未来增长负载的情况下的性能表现,并进行容量规划。
  • 提前发现系统在极端情况下的异常行为和故障,为系统的容错和恢复提供参考。

4.2 压力测试的常用手段和工具

4.2.1 负载生成器

负载生成器是用于模拟大量用户并发访问的工具,可以通过模拟多个用户同时对系统进行请求,从而产生压力。常见的负载生成器包括Apache JMeter、LoadRunner等。

4.2.2 压力测试脚本

压力测试脚本是指编写的用于模拟用户行为的脚本,可以通过脚本来模拟用户的登录、浏览、购买等操作,以及对系统的各种请求。脚本可以使用脚本语言如Python、JavaScript等编写,也可以使用专门的压力测试工具提供的脚本录制功能生成。

4.2.3 监控工具

监控工具用于监测系统在压力测试过程中的各项指标,包括CPU利用率、内存占用、网络流量、响应时间等。常见的监控工具有Zabbix、Nagios等。

4.3 压力测试的优缺点及适用场景

4.3.1 优点

  • 可以发现系统的性能瓶颈和资源瓶颈,为系统优化提供依据。
  • 可以验证系统在高负载情况下的稳定性和可靠性。
  • 可以预测系统在未来增长负载的情况下的性能表现。

4.3.2 缺点

  • 需要投入较多的时间和资源进行测试和分析。
  • 无法完全模拟真实用户的行为,可能存在测试结果与实际使用情况的差异。
  • 对系统的压力可能会导致系统崩溃或数据丢失等风险。

4.3.3 适用场景

  • 高并发场景:如电商平台的秒杀活动、在线游戏的服务器承载能力测试等。
  • 高负载场景:如大规模数据处理、高并发请求的系统。
  • 容量规划:如预测系统在未来增长负载的情况下的性能表现。

4.4 压力测试示例

下面是一个使用Apache JMeter进行压力测试的示例:

import org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy;
import org.apache.jmeter.protocol.http.control.CookieManager;
import org.apache.jmeter.protocol.http.control.HeaderManager;
import org.apache.jmeter.protocol.http.control.gui.HttpTestSampleGui;
import org.apache.jmeter.testelement.TestPlan;
import org.apache.jmeter.threads.ThreadGroup;
import org.apache.jmeter.util.JMeterUtils;
import org.apache.jmeter.control.LoopController;
import org.apache.jmeter.engine.StandardJMeterEngine;

public class StressTestExample {
    public static void main(String[] args) {
        // 设置JMeter的路径
        JMeterUtils.setJMeterHome("/path/to/jmeter");

        // 创建一个JMeter测试计划
        TestPlan testPlan = new TestPlan("Stress Test Example");

        // 创建线程组
        ThreadGroup threadGroup = new ThreadGroup();
        threadGroup.setNumThreads(100); // 设置并发用户数
        threadGroup.setRampUp(10); // 设置线程组的启动时间

        // 创建循环控制器
        LoopController loopController = new LoopController();
        loopController.setLoops(10); // 设置循环次数
        loopController.addTestElement(new HTTPSamplerProxy()); // 添加HTTP请求

        // 添加线程组和循环控制器到测试计划
        testPlan.addThreadGroup(threadGroup);
        testPlan.addTestElement(loopController);

        // 创建JMeter引擎并运行测试计划
        StandardJMeterEngine jmeter = new StandardJMeterEngine();
        jmeter.configure(testPlan);
        jmeter.run();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

通过上述示例代码,我们可以使用Apache JMeter来模拟100个并发用户对系统进行请求,每个用户循环执行10次请求。可以根据实际需要设置并发用户数、循环次数等参数,并通过监控工具观察系统在压力下的性能指标,从而评估系统的性能表现和稳定性。

4.5 压力测试结果的解读

在进行压力测试后,我们需要对测试结果进行解读和分析。常见的压力测试结果指标包括:

  • 响应时间:系统处理请求所花费的时间,可以通过平均响应时间、最大响应时间等指标来评估系统的性能。
  • 吞吐量:单位时间内系统处理的请求数量,可以通过每秒处理请求数(QPS)来评估系统的处理能力。
  • 错误率:系统在压力下出现的错误请求的比例,可以通过错误率来评估系统的稳定性。

通过对这些指标的分析,我们可以判断系统的性能瓶颈所在,并针对性地进行优化和改进。

4.6 小结

本章介绍了压力测试的概念、常用手段和工具,以及压力测试的优缺点和适用场景。并通过一个Apache JMeter的示例代码,展示了如何进行压力测试,并对测试结果进行解读和分析。压力测试是评估系统性能的重要手段之一,能够帮助我们发现系统的性能瓶颈和资源瓶颈,为系统优化和改进提供依据。在软件设计师考试中,了解和掌握压力测试的方法和工具是必不可少的。


第五章:性能监测与分析

5.1 性能监测与分析的定义和目的

在软件设计师考试中,性能监测与分析是一个重要的知识点。性能监测与分析旨在评估计算机系统的性能表现,以便发现潜在的性能瓶颈和优化空间。通过对系统的性能进行监测和分析,我们可以了解系统在不同负载下的表现,并采取相应的措施来提高系统的性能。

5.2 性能监测与分析的常见方法和工具

性能监测与分析的方法和工具多种多样,下面介绍几种常见的方法和工具:

方法一:Profiling(性能剖析)

Profiling是一种通过收集程序运行时的性能数据来分析程序性能的方法。它可以帮助我们找出程序中耗时的热点代码,以及内存使用情况等关键信息。常用的Profiling工具有Gprof、Valgrind等。

方法二:Tracing(追踪)

Tracing是一种通过记录程序执行过程中的关键事件和函数调用来分析程序性能的方法。通过追踪工具,我们可以获取函数调用的时间、参数和返回值等信息,以及系统调用和网络通信等事件。常用的Tracing工具有strace、dtrace等。

方法三:Benchmark(基准测试)

Benchmark是一种通过运行一系列标准化的测试用例来评估系统性能的方法。通过对系统在不同负载下的运行时间、吞吐量和响应时间等指标进行比较,我们可以得出系统的性能评估结果。常用的Benchmark工具有SPEC CPU、UnixBench等。

5.3 性能监测与分析的优缺点及适用场景

性能监测与分析方法各有优缺点,适用于不同的场景。下面对常见的方法进行优缺点和适用场景的分析:

方法优点缺点适用场景
Profiling精确度高,可以获取函数级别的性能数据对于大型程序,剖析结果可能过于庞大,难以分析分析程序中的热点代码,找出性能瓶颈
Tracing可以获取函数调用和系统事件等详细信息追踪开销较大,可能会影响程序的性能分析系统调用、网络通信等事件,定位性能问题
Benchmark结果可重复,对系统整体性能进行评估可能无法覆盖所有的使用场景评估系统在不同负载下的性能表现

5.4 举例说明如何进行性能监测与分析并解读监测结果

下面通过一个综合的代码示例来说明如何进行性能监测与分析,并解读监测结果。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> nums;
    for (int i = 0; i < 1000000; ++i) {
        nums.push_back(i);
    }

    int sum = 0;
    for (int num : nums) {
        sum += num;
    }

    std::cout << "Sum: " << sum << std::endl;

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

以上示例代码用于计算从0到999999的所有整数的和。我们可以使用Profiling工具来分析程序的性能。

首先,编译代码时需要开启Profiling选项,例如使用GCC编译器可以加上-pg选项。然后,运行程序并生成Profiling数据文件:

$ g++ -pg main.cpp -o main
$ ./main
$ gprof main gmon.out > profile.txt
  • 1
  • 2
  • 3

通过查看profile.txt文件,我们可以得到程序的性能剖析结果,包括各个函数的执行时间、调用次数等信息。根据剖析结果,我们可以发现循环中的整数相加操作占用了大部分的执行时间,有可能是性能瓶颈所在。

5.5 性能监测与分析的总结

本章介绍了性能监测与分析的方法和工具,包括Profiling、Tracing和Benchmark等。每种方法都有其优点和缺点,适用于不同的场景。通过对系统的性能进行监测和分析,我们可以找出性能瓶颈并进行优化,提高系统的性能表现。

性能监测与分析是软件设计师考试中的重要知识点,希望本章的内容能够帮助大家理解和掌握相关技术。在实际工作中,建议结合具体的需求和场景选择合适的方法和工具进行性能监测与分析,以提升系统的性能和用户体验。


结语

感谢你花时间阅读这篇博客,我希望你能从中获得有价值的信息和知识。记住,学习是一个持续的过程,每一篇文章都是你知识体系的一部分,无论主题是什么,都是为了帮助你更好地理解和掌握软件设计的各个方面。

如果你觉得这篇文章对你有所帮助,那么请不要忘记收藏和点赞,这将是对我们最大的支持。同时,我们也非常欢迎你在评论区分享你的学习经验和心得,你的经验可能会对其他正在学习的读者有所帮助。

无论你是正在准备软件设计师资格考试,还是在寻求提升自己的技能,我们都在这里支持你。我期待你在软件设计师的道路上取得成功,无论你的目标是什么,我都在这里支持你。

再次感谢你的阅读,期待你的点赞和评论,祝你学习顺利,未来充满可能!


阅读我的CSDN主页,解锁更多精彩内容:泡沫的CSDN主页
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/526634
推荐阅读
相关标签
  

闽ICP备14008679号