# 2025/10/05 工作日志

本次更新的内部版本为2.4.53.
本次更新不会发布新版本。
本次更新以重构底层库为首要任务，对整个项目进行了大规模整改。

### 重新布局移植接口

从今往后，“依赖库”这一称谓将会升级为“移植接口”。

我将``include/template``目录重命名为更方便理解的``include/interface``目录。
为了进行更有效且通用的接口约束，我参考了``CRTP``、``concept``和纯虚函数设计，自创了``CITP``这一设计。``CITP``初步原理的讲解位于``CITP设计文档.md``，CITP是个方便、易懂且几乎零成本抽象的设计，应该被广泛引用。

重构后的移植接口设计总述见``移植接口开发指导.md``。我们来看一看这一次重构对于接口的更改有哪些：

* 将``BinaryReader.hpp``重命名为``FileReader.hpp``
* 将``BinaryWriter.hpp``重命名为``FileWriter.hpp``
* 将``stmlib.hpp``拆分为``StamonLib.hpp``、``BasicPlatform.hpp``、``BasicIo.hpp``
* 用哈希表取代字典树，作为Map的底层数据结构与算法
* 删去``ByteMap.hpp``、``NumberMap.hpp``和``StringMap.hpp``，并用``HashMap.hpp``统一取而代之
* ``HashMap``的值不一定是指针类型
* 只要给``HashMap``的键类型实现对应的``toHash``函数，HashMap就能正常运作
* 新增了各类基本数据类型和``String``的``toHash``函数
* ``HashMap``的``getValList``函数原型改为``ArrayList<ValType> getValList() const``
* ``HashMap``新增``getKeyList``函数，原型为``ArrayList<KeyType> getKeyList() const``
* 删去了``TypeDef.hpp``
* 新增字节类型：``stamon::byte``
* 新增容量整数类型：``stamon::size_t``

接下来，我可能会引入移植接口的``STL``实现。

### 修改了大量细节

* 修改了``Ast.hpp``的命名空间声明
* 格式化了``CodeLogicAst.cpp``的代码
* 将``String((char*)"...")``修改成更简洁的``String("...")``
* 删去了``Lexer.cpp``中不必要的内存申请和释放代码
* 将部分诸如``... == true``形式的代码改成``...``
* 将部分诸如``... == false``形式的代码改成``!...``
* 将Stamon的版本号定义从``stamon``迁移到``stamon::config``
* 为``Parser.cpp``的所有宏代码末尾加上了分号
* 删去了``NumberType.cpp``中无用的``toThisType``函数
* 将``ObjectType.cpp``中的``virtual ArrayList<Variable*> getVal() const``改为``virtual const ArrayList<Variable*>& getVal() const``
*  在一些``namespace stamon``外部的函数实现内，加入了``using namespace stamon``，在不泄露命名空间的情况下，提升代码易读性，加快开发效率
*  重命名了智能指针的自定义销毁函数，提升代码易读性
*  修复了浮点数逻辑运算的结果是浮点数这一错误
*  调整了``Stamon.hpp``的实现
*  将``依赖库开发指导.md``重命名为``移植接口开发指导.md``

### 优化程序性能

在重新选用Map的数据结构与算法，加之大量细节处修改之后，Stamon的性能得到了飞跃性提升。

为了更直观、客观的看到优化前后的差距，我选取了2.4.49发行版与2.4.53内部版本进行对比，两个版本都使用Makefile编译。测试在VirtualBox中的``Alpine Linux v3.22 x86_64``运行，我采用``perf 6.15.0``作为性能测试工具。

我们测试了三个样例：十万次空循环、朴素递归计算斐波那契数列第三十项、从2到50000的埃氏素数筛。

##### 十万次空循环的性能测试

生成的原始结果分别如下：

```
# 优化前
# started on Sun Oct  5 18:25:30 2025


 Performance counter stats for 'stamon_old run demos/loop_old.stvc':

           5996.75 msec task-clock                       #    0.997 CPUs utilized             
               159      context-switches                 #   26.514 /sec                      
                 0      cpu-migrations                   #    0.000 /sec                      
              8965      page-faults                      #    1.495 K/sec                     
   <not supported>      cycles                                                                

       6.011989689 seconds time elapsed

       5.617046000 seconds user
       0.380536000 seconds sys
```

```
# 优化后
# started on Sun Oct  5 18:23:02 2025


 Performance counter stats for 'stamon run demos/loop_new.stvc':

            232.40 msec task-clock                       #    0.974 CPUs utilized             
                 9      context-switches                 #   38.726 /sec                      
                 0      cpu-migrations                   #    0.000 /sec                      
              3639      page-faults                      #   15.658 K/sec                     
   <not supported>      cycles                                                                

       0.238499505 seconds time elapsed

       0.066635000 seconds user
       0.166589000 seconds sys
```

##### 朴素递归计算斐波那契数列第三十项的性能测试

生成的原始结果分别如下：

```
# 优化前
# started on Sun Oct  5 17:58:51 2025


 Performance counter stats for 'stamon_old run demos/fib_old.stvc':

         230904.82 msec task-clock                       #    1.000 CPUs utilized             
                10      context-switches                 #    0.043 /sec                      
                 0      cpu-migrations                   #    0.000 /sec                      
             39240      page-faults                      #  169.940 /sec                      
   <not supported>      cycles                                                                

     230.934695647 seconds time elapsed

      72.922803000 seconds user
     157.999407000 seconds sys
```

```
# 优化后
# started on Sun Oct  5 18:15:50 2025


 Performance counter stats for 'stamon run demos/fib_new.stvc':

          11680.72 msec task-clock                       #    0.998 CPUs utilized             
                40      context-switches                 #    3.424 /sec                      
                 0      cpu-migrations                   #    0.000 /sec                      
             26722      page-faults                      #    2.288 K/sec                     
   <not supported>      cycles                                                                

      11.705414774 seconds time elapsed

       4.247985000 seconds user
       7.433974000 seconds sys
```

##### 从2到50000的埃氏素数筛的性能测试

生成的原始结果分别如下：

```
# 优化前
# started on Sun Oct  5 18:28:54 2025


 Performance counter stats for 'stamon_old run demos/nsieve_old.stvc':

          19057.96 msec task-clock                       #    0.998 CPUs utilized             
                26      context-switches                 #    1.364 /sec                      
                 1      cpu-migrations                   #    0.052 /sec                      
             19145      page-faults                      #    1.005 K/sec                     
   <not supported>      cycles                                                                

      19.087737930 seconds time elapsed

      12.488769000 seconds user
       6.573036000 seconds sys
```

```
# 优化后
# started on Sun Oct  5 18:27:53 2025


 Performance counter stats for 'stamon run demos/nsieve_new.stvc':

            796.67 msec task-clock                       #    0.988 CPUs utilized             
                10      context-switches                 #   12.552 /sec                      
                 0      cpu-migrations                   #    0.000 /sec                      
              8652      page-faults                      #   10.860 K/sec                     
   <not supported>      cycles                                                                

       0.806208362 seconds time elapsed

       0.114124000 seconds user
       0.684745000 seconds sys
```

##### 对优化前后的测试分析和结论

上述原始测试结果被数据提取并整理成了以下表格：

|测试项|优化前耗时（按秒计）|优化后耗时（按秒计）|
|:-|:-|:-|
|十万次空循环|6.011989689|0.238499505|
|朴素递归计算斐波那契数列第三十项|230.934695647|11.705414774|
|从2到50000的埃氏素数筛|19.087737930|0.806208362|

不难看出，得益于哈希表的优秀性能和细节处的代码优化，Stamon的性能得到了质的飞跃。