SQLite 库的大小
SQLite 库使用的代码空间取决于目标平台、编译器和优化设置。这些变量也会影响性能。
下图显示了截至 2017 年 10 月 8 日 SQLite 在 x86_64 上的 Ubuntu 16.04.3 上测试的各种编译器和优化设置的相对大小和性能。一般观察:
Clang/LLVM 编译器无法与 GCC 竞争。Clang 生成的二进制文件始终比 GCC 生成的二进制文件更大、更慢。
配置文件引导优化 (PGO) 对 SQLite 没有帮助。PGO 生成的二进制文件大约大 1%,慢大约 0.33%。
GCC-7 生成的二进制文件比 GCC-5 更小但速度更快,但差异并不大。
使用 GCC 和 -Os 编译生成的二进制文件大小略小于 500KB。(2018-07-07更新:由于加入了UPSERT、window functions等新特性,现在库占用空间略大于500KB。)
开发人员需要做出的唯一重要设计决策是使用 -Os(优化大小)还是 -O6(优化速度)。-O6 设置使二进制文件的运行速度提高约 2% 或 3%,但也增大了 66%。这里的性能是通过使用 cachegrind 计算 CPU 周期来衡量的。分析中不考虑 I-cache 未命中。如果考虑 I-cache 未命中,使用 -O6 构建可能不会比使用 -Os 构建更快。
考虑到以上所有因素,SQLite 开发人员建议使用带有 -Os 优化设置的 GCC-7 编译 SQLite。
细节
上述测量是使用 2017-10-08 的 SQLite 版本 5594a121bf132a98进行的。
唯一使用的 SQLite 编译时选项是-DSQLITE_ENABLE_MEMSYS5。可选的memsys5内存分配器用于性能测试,因为它给出的结果比 Ubuntu 上库提供的 malloc()/free() 更具可重复性。
Performance can be improved and the size reduced by enabling -DSQLITE_THREADSAFE=0 , -DSQLITE_DEFAULT_MEMSTATUS=0 , -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 , -DSQLITE_LIKE_DOESNT_MATCH_BLOBS , -DSQLITE_MAX_EXPR_DEPTH=0 , -DSQLITE_OMIT_DECLTYPE , -DSQLITE_OMIT_DEPRECATED , -DSQLITE_OMIT_PROGRESS_CALLBACK , -DSQLITE_OMIT_SHARED_CACHE , and -DSQLITE_USE_ALLOCA . 所有这些选项共同导致大约 3.5% 的性能提升和 3.0% 的尺寸减小。
添加诸如-DSQLITE_ENABLE_JSON1、 -DSQLITE_ENABLE_FTS5或-DSQLITE_ENABLE_RTREE之类的 可选功能显然会增加库的大小。
性能是使用 speedtest1.c实用程序测量的,该程序试图模拟 SQLite 的典型工作负载。测试运行的选项是:
--shrink-memory --reprepare --stats --heap 10000000 64 --size 5
通过使用 cachegrind 运行 speedtest1 并观察“I refs”输出来测量性能。