编程语言性能与服务器设计深度剖析
1. 函数性能测试
在对不同函数进行性能测试时,我们关注了读取文件以及字符串长度计算等操作。相关函数的测试结果如下表所示:
| Function | SML (microsec) | C (microsec) |
| — | — | — |
| readall | 4980 | 4609 |
| length | 1 | - |
| slowix | 21975 | - |
| fastix | 13792 | 1854 |
| tokens | 54856 | - |
| cntrl | 61299 | - |
| getc | 59050 | - |
从表中数据可知,SML/NJ 在读取文件方面表现出色,但在字符计数方面却不尽人意。编译器本应生成 Unsafe.CharVector.sub 的内联机器代码,可最终其速度仍比 C 慢 7 倍。不过,Unsafe 函数确实比每次调用都进行边界检查的普通函数要快。令人惊讶的是,getc 版本的速度居然比 tokens 慢。
2. 内存性能测试
此测试主要探究内存分配的性能。程序会构建一个整数链表,之后将其释放。对于 SML/NJ 程序而言,释放操作就是放弃链表并触发垃圾回收。以下是测试代码:
(* lst should be garbage after this function ends *) fun build max_cnt = let fun loop 0 rslt = rslt |