软件构造 Lab5 其一

本实验通过静态分析工具CheckStyle和SpotBugs,动态分析工具如jstat等,对Lab4代码进行改进,关注点包括变量命名、代码布局、注释规范、内存管理和I/O优化。在I/O部分,实现了Reader/Writer、Scanner和Stream三种方式,并应用了策略设计模式。实验结果显示不同I/O方式在性能上有明显差异。

实验目的:
本次实验通过对 Lab4 的代码进行静态和动态分析,发现代码中存在的不符 合代码规范的地方、具有潜在 bug 的地方、性能存在缺陷的地方(执行时间热点、 内存消耗大的语句、函数、类),进而使用第 4、7、8 章所学的知识对这些问题 加以改进,掌握代码持续优化的方法,让代码既“看起来很美”,又“运行起来 很美”。 具体训练的技术包括:
⚫ 静态代码分析(CheckStyle 和 SpotBugs)
⚫ 动态代码分析(Java 命令行工具 jstat、jmap、jcmd、VisualVM、JMC、 JConsole 等)
⚫ JVM 内存管理与垃圾回收(GC)的优化配置
⚫ 运行时内存导出(memory dump)及其分析(Java 命令行工具 jhat、MAT)
⚫ 运行时调用栈及其分析(Java 命令行工具 jstack);
⚫ 高性能 I/O
⚫ 基于设计模式的代码调优
⚫ 代码重构

实验需要用到的知识: 第三方插件工具的使用、JAVA文件读写。

实验任务: (第一部分)

1、Static Program Analysis
人工代码走查
我使用Google java代码规范对我的代码进行修改,发现了以下几个问题:

1、变量命名
对于如下这样的常量,变量命名应使用全大写字母。使用下划线分割开单词。
未修改前:
在这里插入图片描述
修改后:
在这里插入图片描述

2、布局
关于布局方面,有以下问题:
谷歌java规范要求大括号前没有换行,大括号结束之后没有后续内容需要换行。
换行后要跟一个换行,空出一行。
修改前:
在这里插入图片描述
修改后:
在这里插入图片描述
3、注释
关于注释,谷歌java规范要求:对于多行/* … /注释,后续行必须以与上一行的对齐开始。
修改后的注释如下:
在这里插入图片描述
多行的/
/注释,每行都以对其的开始。

4、包/类名
谷歌java规范要求包名用连续的单词,没有下划线;类名通常是名词或名词短语。
在这里插入图片描述
符合要求。

使用CheckStyle和SpotBugs进行静态代码分析
Checkstyle:
问题1:
Line contains a tab character.
需要将tab换成空格来解决。

问题2:
Package name ‘centralObject’ must match pattern ‘1+(.[a-z][a-z0-9])$’.
这里命名符合谷歌规范但依然报错,且是实验指导书要求的命名,不做修改。

问题3:
Each variable declaration must be in its own statement.
不能使用int a, b, c;这样的声明方式,每个变量都要单独声明。

问题4:
Method name ‘AddTrack’ must match pattern ‘2[a-z0-9][a-zA-Z0-9_]*$’.
这里命名要求首字母为小写,但是这是实验指导书要求的命名,不做修改。

问题5:
Type name ‘athleteInputException’ must match pattern ‘3[a-zA-Z0-9]*$’.
类名需要以大写字母开头。
修改后:
在这里插入图片描述
SpotBugs:

Rough value of 2Math.PI found: 6.2831852
这里将数字改为2
Math.PI即可。

两个工具的侧重点不同,CheckStyle侧重代码风格的修改

2、Java I/O Optimization
一、实现了三种I/O方式:
1、Reader/Writer
2、Scanner
3、Stream

具体实现:
(我把具体的字符串分析抽象出来,写成了lineAnalyze函数。具体实现如下。)
1、Reader/Writer
使用Reader/Writer进行I/O时,先使用FileReader/FileWriter来读取对应文件,然后用BufferedReader/BufferedWriter读取内容。
Reader:
在这里插入图片描述
Writer:
在这里插入图片描述
2、Scanner
使用Scanner读取文件时,用一个File来读取文件,然后用Scanner获取文件内容(也可以直接用Scanner读取文件地址直接获取内容)。
在这里插入图片描述
写入文件时,使用PrintWriter,使用方法和上一种方法的Writer基本一致。
在这里插入图片描述
3、Stream
使用Stream进行I/O操作时,使用InputStream/OutputStream来获取文件地址,用StringBuffer来读取/写入地址字节内容。
在这里插入图片描述
在这里插入图片描述

二、strategy设计模式
对于每种场景,都有一个strategyReadWrite字符串来确定使用哪一种读取写入方式。
在这里插入图片描述
在具体的读写操作中,会先进行读写方式的判断,再进行相应读写。
在这里插入图片描述
GUI下的界面如下:
在这里插入图片描述

多种I/O实现方式的效率对比分析
因为给的数据量太大,读取时间过长,进行比较需要耗费太多时间。所以这里使用的是TrackGame_Larger.txt和SocialNetworkCircle_Larger.txt对比不同I/O的性能。
在开始读取前后各记录一次时间,相减即可得到具体消耗的时间,这里单位是纳秒。如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

表格:

在这里插入图片描述
图像:
读取时间:
在这里插入图片描述
写入时间:
在这里插入图片描述
在这里插入图片描述


  1. a-z ↩︎

  2. a-z ↩︎

  3. A-Z ↩︎

内容概要:本文是一份关于“Soldiers”问题的算法设计与分析实践报告,研究如何将分布在网格点上的n个士兵重排成一条水平队列,使得总体移动步数最少。解决方案基于中位数性质,分别处理x和y方向的最优位置:y坐标取所有士兵y坐标的中位数,x坐标通过预调整(原始x坐标减去对应索引)后再取中位数来确定最佳起始位置。算法时间复杂度为O(n logn),主要开销来自三次排序操作;空间复杂度为O(n),用于存储坐标数据。实验验证了算法在样例输入下的正确性,得出最小移动步数为8,符合预期输出。报告还指出了实现过程中常见的索引处理错误及偶数情况下中位数选择的一致性问题,并建议加强极端情况的测试覆盖。; 适合人群:具备一定算法基础、正在学习算法设计与分析的计算机相关专业学生或初级开发者,尤其是对中位数优化、贪心策略和排序应用感兴趣的人员。; 使用场景及目标:①掌握利用中位数求解曼哈顿距离最小和的经典方法;②理解如何将二维问题分解为两个独立的一维问题进行优化;③学习排序与索引变换在实际算法中的巧妙应用;④提升对边界条件和代码细节的调试能力。; 阅读建议:此资源侧重于算法思想的理解与实现细节的剖析,建议读者结合代码逐步调试,重点关注x坐标调整与重新排序的过程,同时自行构造多种测试用例(包括边界和极端情况)以加深理解。
内容概要:本文介绍了基于Simulink的光伏阵列常见故障仿真模型,旨在通过建模仿真手段研究光伏系统在不同故障条件下的运行特性。文中详细构建了光伏阵列在局部遮蔽、组件老化、旁路二极管失效等典型故障情况下的仿真模型,利用Simulink平台实现动态响应分析,帮助理解故障对输出功率、电流电压特性的影响,并为光伏系统的故障诊断、运维优化和可靠性提升提供技术支持。同时文档还列举了多个电力系统相关仿真案例,涵盖电力系统N-k故障、短期负荷预测、无功优化、储能配置、无人机路径规划等多个方向,展示了MATLAB/Simulink在新能源与智能系统仿真中的广泛应用。; 适合人群:具备一定电力电子、新能源或自动化背景的高校研究生、科研人员及工程技术人员;熟悉MATLAB/Simulink基本操作的学习者;从事光伏系统设计、故障诊断或智能优化研究的相关从业者; 使用场景及目标:①用于光伏系光伏阵列常见故障仿真模型(Simaulink仿真实现)统故障机理分析与诊断算法开发;②支撑科研项目中的仿真验证环节;③辅助教学实验与课程设计,提升对光伏系统动态行为的理解;④为后续智能诊断模型(如神经网络、深度学习)提供数据支持; 阅读建议:建议结合提供的网盘资源下载完整代码与模型文件,边学习边实践,重点掌握Simulink建模流程与故障设置方法,同时可拓展学习文中提及的BP神经网络、粒子群优化、YALMIP工具箱等关联技术,以实现更复杂的系统集成与优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值