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/)工具对代码行数进行统计,该
   51   52   53   54   55   56   57   58   59   60   61