Page 56 - 《软件学报》2021年第12期
P. 56
3720 Journal of Software 软件学报 Vol.32, No.12, December 2021
Table 1 Benchmarks and their configuration
表 1 测试程序及其配置
名称 版本 同步块 同步方法 代码行数
HSQLDB 2.4.1 71 613 175 568
Jenkins 2.190.2 47 227 160 246
Cassandra 3.11.4 13 226 431 022
SPECjbb2005 1.01 22 168 12 519
JGroups 4.1.5 41 138 122 885
Xalan 2.7.2 31 51 89 149
Fop 2.3 7 25 198 555
RxJava 2.2.13 20 8 99 623
Freedomotic 5.6.0 6 15 56 211
Antlr 4.7.2 13 3 60 515
MINA 2.1.3 3 9 23 482
5.3 实验结果及分析
在实验中,使用 FLock 对 11 个测试程序进行自动重构,对重构个数、代码行数、重构后程序的准确性进行
了验证,并与重构工具 Relocker 和 CLOCK 进行了对比.
5.3.1 锁重构个数
我们首先对 FLock 重构后的不同类型锁个数进行了汇总,重构结果见表 2.
Table 2 Refactoring results by FLock
表 2 FLock 重构结果
重构前 重构后 重构
测试程序
代码行数 内置监视器 代码行数 锁降级 锁分解 读锁 写锁 违背一致性规则 时间(s)
HSQLDB 175 568 684 179 324 6 39 109 530 41 18
Jenkins 160 246 274 162 008 3 14 19 238 23 16
Cassandra 431 022 239 432 442 2 24 39 174 26 73
SPECjbb2005 12 519 190 13 301 1 2 58 129 17 24
JGroups 122 885 179 124 126 5 33 28 113 9 7
Xalan 89 149 82 89 386 2 5 19 56 12 19
Fop 198 555 32 198 790 2 0 9 21 4 15
RxJava 99 623 28 99 794 0 1 8 19 2 8
Freedomotic 56 211 21 56 485 2 1 2 16 3 5
Antlr 60 515 16 60 574 2 5 1 8 2 5
MINA 23 482 12 23 549 0 3 1 8 0 2
总计 1 429 775 1 757 1 439 779 25 127 293 1 312 139 192
从实验结果可以看出:在 11 个程序中,共有 391 个粗粒度锁重构为细粒度锁.内置监视器对象转换为锁降级
模式的个数有 25 个,其中,HSQLDB 中最多,包含 6 个,集中分布在 org.hsqldb 包里的 Session 类和 Table 类中,这
两个类分别是用来执行 session 和保存数据库表的数据结构和方法;在 RxJava 和 MINA 中,由于原程序中包含
的内置监视器对象较少,在重构之后没有监视器对象转换为锁降级模式.内置监视器对象转换为锁分解模式的
个数为 127 个,在 HSQLDB,Cassandra 和 JGroups 测试程序中重构后转换为锁分解模式的个数较多;测试程序
Fop 中包含 32 个内置监视器对象,重构后没有内置监视器转换为锁分解模式.在重构为读锁方面,有 293 个内置
监视器对象转换为读锁,在测试程序 HSQLDB 和 Cassandra 中,读锁的占比相对较高;在程序 Antlr 和 MINA 中,
使用锁分解模式比使用读锁的个数多.
在重构工具 FLock 中,加入了对临界区的一致性规则检测,表 2“违背一致性规则”列展示了不满足一致性检
测的临界区数目.对于所有的测试程序,除了 MINA 测试程序外,其余 10 个程序均存在违背一致性检测规则的情
况发生,共有 139 个,其中,HSQLDB 中最多,有 41 个.对于这些不满足一致性规则的临界区,我们没有对他们进行
锁分解,而是采用写锁作为临界区的保护模式.
5.3.2 重构前后改变的代码行数
我们对重构前后改变的代码行数进行了统计,这些代码行数的改变在一定程度上反映了程序员在手动重
构时所需要花费的工作量.我们使用 SLOCCount(https://dwheeler.com/sloccount/)工具对代码行数进行统计,该