# WordCount
**Repository Path**: cjh0716/word-count
## Basic Information
- **Project Name**: WordCount
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-10-25
- **Last Updated**: 2026-10-25
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# WordCount 文本统计工具



## 目录
1. [项目简介](#1-项目简介)
2. [使用方法](#2-使用方法)
3. [文件列表](#3-文件列表)
4. [运行示例](#4-运行示例)
5. [单元测试](#5-单元测试)
6. [性能测试](#6-性能测试)
7. [版本记录](#7-版本记录)
## 1. 项目简介
WordCount 是一个用 Python 编写的文本统计程序,命令格式为 `wc.exe [参数] [文件名]`,
另外提供交互模式和图形界面。
**基础功能**:统计纯英文 txt 文本的**字符数**(`-c`)、**单词数**(`-w`)、**句子数**(`-s`)。
**扩展功能**:统计源代码文件的**代码行、空行、注释行**(`-x`)和总行数(`-l`),
能识别 C/C++/Java/JS、Python、Shell/YAML、HTML/XML、CSS、SQL、Lua 的注释语法,
正确处理字符串中的注释符号、跨行块注释和 Python 文档字符串。
**自行增加的功能**:
| 类别 | 功能 |
| --- | --- |
| 文本分析 | 段落数、平均词长、平均句长、单词频率(柱状图、停用词过滤) |
| 批量统计 | 通配符、递归统计目录、按文件名包含/排除、自动跳过二进制文件、多文件合计 |
| 输出格式 | 对齐表格、逐行文本、JSON、CSV(可直接用 Excel 打开),可保存到文件 |
| 易用性 | 管道/标准输入、交互模式、`.wcrc` 配置文件、中文错误提示与拼写建议 |
| 图形界面 | tkinter 窗口:选择文件或粘贴文本、结果表格、频率柱状图、导出 CSV/JSON([详细介绍](#46-图形界面)) |
| 性能 | 大文件分块读取(内存占用与文件大小无关)、多进程并行统计 |
**工程质量**:339 个单元测试(含基于随机输入的属性测试),代码覆盖率 98%,
flake8 代码规范检查,VS Code 中一键运行测试和性能分析;附带 GitHub Actions 持续集成配置
(仓库同步到 GitHub 后,每次提交会自动在 Windows / Linux 上运行测试)。
## 2. 使用方法
### 2.1 运行方式
**方式一:打包好的 exe**(不需要安装 Python)
```
wc.exe [参数] [文件名 ...]
wcgui.exe 图形界面
```
**方式二:用 Python 运行**(Python 3.9 及以上,程序本身没有第三方依赖)
```
python wc.py [参数] [文件名 ...]
python wcgui.py
```
**自行打包**:运行 `build.bat`,在 `dist\` 下生成 `wc.exe` 和 `wcgui.exe`。
**快速上手**:
```
wc.exe -c file.txt 统计字符数
wc.exe -w file.txt 统计单词数
wc.exe -s file.txt 统计句子数
wc.exe file.txt 同时统计字符、单词、句子
wc.exe -x main.c 统计代码行、空行、注释行
wc.exe -a *.txt 统计全部项目,多个文件自动合计
wc.exe -x -r src --include "*.py" 统计 src 目录下所有 Python 文件
wc.exe -f -n 20 --stopwords article.txt 单词频率前 20 名
wc.exe -a *.txt --format csv -o out.csv 结果保存为 CSV
wc.exe -i 交互模式
```
### 2.2 参数说明
| 参数 | 说明 |
| --- | --- |
| `-c`, `--chars` | 统计字符数 |
| `-w`, `--words` | 统计单词数 |
| `-s`, `--sentences` | 统计句子数 |
| `-p`, `--paragraphs` | 统计段落数(以空行分隔) |
| `-m`, `--average` | 统计平均词长(字母数/单词)和平均句长(单词数/句子) |
| `-l`, `--lines` | 统计总行数(扩展) |
| `-x`, `--extended` | 统计代码行、空行、注释行(扩展) |
| `-a`, `--all` | 输出以上全部统计结果 |
| `-f`, `--frequency` | 输出所有文件中出现次数最多的单词,带占比和柱状图 |
| `-n N`, `--top N` | 单词频率显示前 N 个,默认 10,0 表示全部 |
| `--stopwords` | 单词频率中忽略 the、a、is 等常见停用词 |
| `--lang LANG` | 手动指定注释语法:`c`、`python`、`shell`、`html`、`css`、`sql`、`lua`、`text` |
| `-r`, `--recursive` | 递归统计目录下的所有文本文件 |
| `-j N`, `--jobs N` | 用 N 个进程并行统计,`0` 表示按 CPU 核数自动选择,默认 1 |
| `--include PATTERN` | 只统计文件名匹配的文件,如 `--include "*.py"`,可重复使用 |
| `--exclude PATTERN` | 排除文件名或目录名匹配的文件,如 `--exclude "test_*"`,可重复使用 |
| `--format` | 输出格式:`table` 表格(默认)、`plain` 逐行文本、`json`、`csv` |
| `-o`, `--output` | 把结果保存到文件(CSV 带 BOM,可直接用 Excel 打开) |
| `-i`, `--interactive` | 进入交互模式 |
| `--gui` | 打开图形界面 |
| `--no-config` | 不读取 `.wcrc` 配置文件 |
| `-h`, `--help` | 显示帮助 |
| `-v`, `--version` | 显示版本号 |
- 参数可以组合使用,如 `wc.exe -c -w file.txt`,输出顺序固定为上表顺序。
- 不带任何统计参数时,默认输出字符数、单词数、句子数。
- 不写文件名或文件名写 `-` 时从标准输入读取,可以配合管道使用,如 `type file.txt | wc.exe -w`。
- 支持一次统计多个文件,文件名支持通配符,如 `wc.exe -w *.txt`;统计多个文件时表格和 CSV 末尾有“合计”行。
- 文件编码支持 UTF-8(带或不带 BOM)和 GBK;大文件分块读取,几百 MB 的文件也只占用二十几 MB 内存。
- 递归统计时自动跳过 `.git`、`__pycache__`、`node_modules`、`venv`、`build`、`dist` 等目录,
以及含有 NUL 字节的二进制文件(图片、exe 等)。过滤规则不区分大小写。
- 文件不存在时输出错误信息并继续处理其余文件,程序返回值为 1。
### 2.3 交互模式
`wc.exe -i` 进入交互模式,可以连续输入命令,不需要每次重新启动程序:
| 命令 | 说明 |
| --- | --- |
| `<参数> <文件>` | 与命令行用法相同,如 `-w -s examples/sample.txt` |
| `text <英文文本>` | 直接统计输入的一段文本 |
| `set [参数]` | 设置之后每条命令默认附加的参数,如 `set --format csv` |
| `unset` | 清除 `set` 设置的参数 |
| `cd <目录>` / `ls [目录]` | 切换目录 / 列出文件 |
| `help` / `help args` | 显示交互命令帮助 / 全部参数说明 |
| `quit` / `exit` | 退出 |
参数写错时只会提示错误,不会退出交互模式。
### 2.4 配置文件
在当前目录或用户目录下放一个 `.wcrc` 文件,里面写默认参数(空格或换行分隔,`#` 开头为注释),
每次运行时自动加在命令前面,命令行中输入的参数优先。示例见 `examples/wcrc.example`:
```
--format table
--exclude "test_*"
```
### 2.5 错误提示
| 情况 | 提示 |
| --- | --- |
| 参数拼错 `wc.exe --wrods a.txt` | `错误: 无法识别的参数: --wrods`
`提示: 没有 --wrods 参数,你是不是想用 --words?` |
| 参数值拼错 `wc.exe --format jsn a.txt` | `错误: 参数 --format 的值 jsn 无效,可选值: ...`
`提示: 你是不是想用 json?` |
| 文件名拼错 `wc.exe examples/sampel.txt` | `无法读取文件 examples/sampel.txt: 文件不存在,你是不是想输入 examples\sample.txt?` |
| 统计目录没加 `-r` | `examples 是目录,统计目录请加 -r 参数` |
### 2.6 图形界面
不熟悉命令行的用户可以使用图形界面:双击 `wcgui.exe`,或运行 `python wcgui.py` / `wc.exe --gui`。
界面分为三个区域,按 ① 选择内容 → ② 勾选统计项目 → ③ 查看结果 的顺序使用,详细说明和各功能截图见
[4.6 图形界面](#46-图形界面)。

### 2.7 统计规则
| 项目 | 规则 |
| --- | --- |
| 字符 | 文本中的所有字符(含空格、标点、换行)。Windows 换行 `\r\n` 与 `\n` 一样记为 1 个字符 |
| 单词 | 由字母/数字组成的连续串。词内的撇号、连字符不拆分,如 `don't`、`well-known` 各算 1 个;带小数点或千分位的数字如 `3.14`、`1,000` 算 1 个 |
| 句子 | 以 `.` `!` `?` 结尾(其后为空白、引号/括号或文本末尾)。连续标点如 `...`、`?!` 只算一次;`3.14` 中的小数点不算句末;末尾没有标点但含有单词的文字也算 1 句 |
| 段落 | 由一个或多个空行分隔、且包含单词的文本块 |
| 平均词长 / 平均句长 | 单词字母总数 ÷ 单词数 / 单词数 ÷ 句子数,保留两位小数。多文件的合计行按总数重新计算,而不是把各文件的平均值相加 |
| 单词频率 | 不区分大小写,纯数字不计入,次数相同时按字母顺序排列;“占比”是该词占所有参与统计单词的比例 |
| 总行数 | 文件的行数,末尾换行符不会多算一行 |
| 空行 | 只含空白字符,或只有 1 个可见字符(如单独的 `{`、`}`) |
| 注释行 | 含有注释,且注释外最多只有 1 个可见字符,如 `} // end`;块注释覆盖的每一行都算注释行 |
| 代码行 | 注释外有 2 个及以上可见字符的行。字符串中的注释符号不算注释 |
注释语法按文件扩展名自动选择,也可以用 `--lang` 手动指定:
| 语言 | 扩展名 | 注释 |
| --- | --- | --- |
| `c`(默认) | `.c` `.cpp` `.h` `.java` `.js` `.ts` `.go` `.cs` 等其他所有文件 | `//`、`/* */` |
| `python` | `.py` `.pyw` `.pyi` | `#`,以及单独成句的三引号文档字符串 `"""..."""` |
| `shell` | `.sh` `.rb` `.pl` `.r` `.ps1` `.yaml` `.toml` `.ini` 等 | `#` |
| `html` | `.html` `.htm` `.xml` `.svg` `.vue` `.md` | `` |
| `css` | `.css` | `/* */` |
| `sql` | `.sql` | `--`、`/* */` |
| `lua` | `.lua` | `--`、`--[[ ]]` |
| `text` | `.txt` `.log` `.csv` | 无注释 |
Python 中赋值给变量的三引号字符串(如 `s = """..."""`)是代码,只有单独出现的文档字符串才算注释。
## 3. 文件列表
```
.
├── wc.py 命令行程序入口
├── wcgui.py 图形界面程序入口
├── wordcount/ 程序源代码
│ ├── __init__.py 包定义与版本号
│ ├── counter.py 文本统计:字符/单词/句子/段落、平均长度、单词频率
│ ├── linestats.py 代码行统计:多语言注释识别,总行/代码行/空行/注释行
│ ├── analyzer.py 统计项目注册表;分块累加统计结果
│ ├── report.py 分块读取文件、识别编码、多进程并行,生成统计报告(命令行和图形界面共用)
│ ├── files.py 收集待统计文件:通配符、目录递归、过滤、二进制检测
│ ├── formatters.py 输出格式:表格 / 逐行文本 / JSON / CSV
│ ├── cli.py 命令行参数解析、标准输入、结果输出
│ ├── interactive.py 交互模式
│ ├── config.py .wcrc 配置文件
│ ├── errors.py 中文错误提示、拼写建议
│ └── gui.py tkinter 图形界面
├── tests/ 单元测试(pytest)
│ ├── test_counter.py 字符/单词/句子/段落/频率统计
│ ├── test_linestats.py 代码行/空行/注释行,各语言注释语法
│ ├── test_cli.py 命令行参数、多文件、编码、输出格式
│ ├── test_formatters.py 表格对齐、合计、JSON/CSV
│ ├── test_files.py 目录递归、过滤、二进制文件
│ ├── test_usability.py 标准输入、交互模式、配置文件、错误提示
│ ├── test_gui.py 图形界面
│ ├── test_streaming.py 分块读取与整体读取结果一致、多进程与单进程结果一致
│ └── test_properties.py 基于随机输入的属性测试(Hypothesis)
├── perf/ 性能测试
│ ├── perf_test.py 生成大文件,计时并用 cProfile 分析热点
│ ├── benchmark.py 与旧版本对比耗时和峰值内存
│ └── benchmark_result.md 基准测试结果
├── examples/ 示例文件
│ ├── sample.txt 英文文本
│ ├── article.txt 英文文章(《小王子》节选)
│ ├── sample.c C 源代码
│ ├── sample.py Python 源代码(含文档字符串)
│ ├── sample.html HTML
│ └── wcrc.example 配置文件示例
├── docs/images/ 运行截图(v0.2-*.png 为 v0.2 版本,gui-*.png 为图形界面)
├── tools/screenshots.py 自动生成运行截图的脚本
├── .vscode/ VS Code 运行、调试、测试、性能分析配置
├── .github/workflows/ GitHub Actions 持续集成配置
├── build.bat 打包 wc.exe 和 wcgui.exe
├── requirements-dev.txt 开发依赖(pytest、coverage、hypothesis、flake8、pyinstaller、snakeviz)
├── pytest.ini / .flake8 测试和代码规范配置
├── CHANGELOG.md 更新日志
├── AI_PROMPTS.md AI 对话提示词
└── README.md 项目说明
```
## 4. 运行示例
以下截图都是在 Windows 命令行窗口中实际运行 `wc.exe` 的结果(由 `tools/screenshots.py` 自动截取)。
### 4.1 示例文件
`examples/sample.txt`:
```
The quick brown fox jumps over the lazy dog. It's a well-known sentence!
Did you know it uses every letter of the alphabet? Yes, it does...
Pi is about 3.14 and that is fine
```
`examples/sample.c`:
```c
/* sample.c
* A small program used to demonstrate line statistics.
*/
#include
// Print the numbers from 1 to n
void count(int n)
{
for (int i = 1; i <= n; i++) {
printf("%d\n", i); // one number per line
}
}
int main(void)
{
char *s = "// not a comment";
count(3);
/* single-line block comment */
return 0;
} // end of main
```
### 4.2 基础功能:字符数、单词数、句子数

结果说明:
- **字符数 174**:3 行文字共 171 个字符,加上 3 个换行符。
- **单词数 34**:`It's`、`well-known`、`3.14` 各算 1 个单词。
- **句子数 5**:第 1 行有两句(`.` 和 `!` 结尾),第 2 行有两句(`?` 和 `...` 结尾,连续的 `...` 只算一次),
第 3 行没有结尾标点也算 1 句;`3.14` 中的小数点不当作句末。
### 4.3 扩展功能:代码行、空行、注释行

结果说明:
- `sample.c`:注释行 6 行(第 1~3 行块注释、第 6 行 `//` 注释、第 18 行单行块注释、第 20 行 `} // end of main`);
空行 6 行(空白行和只有 `{`、`}` 的行);代码行 8 行。第 10 行虽然带行尾注释但仍是代码行,
第 16 行字符串里的 `//` 不是注释。
- `sample.py`:模块文档字符串、函数文档字符串和 `#` 注释都算注释行;赋值给变量的三引号字符串算代码行。
- `sample.html`:`` 是注释,链接里的 `//` 不是注释。
- 最后一条命令递归统计本项目自己的源代码。
### 4.4 文本分析与输出格式

### 4.5 管道、错误提示与交互模式

### 4.6 图形界面
图形界面用 Python 自带的 **tkinter** 编写,不需要安装任何第三方库,打包后就是一个独立的 `wcgui.exe`。
它与命令行调用同一套统计代码(`wordcount/report.py` 中的 `build_report`),两边的统计结果完全一致;
界面本身只负责收集用户的选择和展示结果,代码见 `wordcount/gui.py`。
#### 界面布局

| 区域 | 控件 | 作用 |
| --- | --- | --- |
| ① 选择要统计的内容 | “添加文件…” / “添加文件夹…” 按钮 | 弹出系统的文件选择对话框,可多选文件;添加文件夹时会**递归统计**其中所有文本文件,自动跳过 `.git`、`node_modules` 等目录和图片、exe 等二进制文件 |
| | 文件列表、“移除选中” / “清空” | 查看已添加的文件和文件夹,支持多选后移除;重复添加同一路径会自动忽略 |
| | 文本输入框 | 不想保存成文件时,可以直接粘贴一段英文文本进行统计,结果显示为“(输入的文本)” |
| ② 统计项目 | 7 个复选框 | 字符数、单词数、句子数、段落数、平均词长/句长、总行数、代码行/空行/注释行,可任意组合;“全选”“全不选”一键切换 |
| | 单词频率、前 N 个、忽略停用词 | 统计所有内容中出现最多的单词,可设置显示数量(1~200),可忽略 the、a、is 等常见词 |
| | 注释语法下拉框 | 默认按扩展名自动识别,也可以手动指定 C、Python、HTML、SQL 等语法 |
| | 包含 / 排除 输入框 | 按文件名过滤,如包含 `*.py`、排除 `test_*`;多个规则用空格或逗号分隔 |
| | “开始统计” / “导出结果…” | 开始统计;统计完成后才能导出 |
| ③ 统计结果 | 结果表格 | 每个文件一行,数字右对齐;统计多个文件时最后一行是浅蓝色的**合计行**(平均值按总数重新计算,不是简单相加);文件名显示为相对所选文件夹的路径,便于阅读 |
| | 单词频率柱状图 | 用 Canvas 绘制横向柱状图,柱子长度与出现次数成正比,并标注次数 |
| | 状态栏 | 提示下一步操作、统计进度和结果,无法读取的文件也会在这里提示 |
#### 功能演示一:粘贴文本,分析一篇文章
把 `examples/article.txt`(《小王子》节选)粘贴到文本框,勾选段落数和平均词长/句长,显示前 12 个高频词:

结果与命令行 `wc.exe -c -w -s -p -m -f -n 12 --stopwords examples\article.txt` 完全相同:
1043 个字符、189 个单词、15 个句子、4 个段落;忽略停用词后出现最多的是 drawing(5 次)。
#### 功能演示二:统计一个代码文件夹
添加 `wordcount` 文件夹,只勾选“总行数”和“代码行/空行/注释行”,包含规则填 `*.py`、排除规则填 `__init__.py`:

程序递归找到 11 个 Python 文件,逐个统计后在最后一行给出合计:共 1730 行,其中代码行 1154、空行 311、注释行 265。
Python 的文档字符串(`"""..."""`)被正确识别为注释。
#### 功能演示三:多种文件综合统计
添加 `examples` 文件夹,同时统计文本和代码:表格中 `.txt` 按纯文本统计,`.c`、`.py`、`.html` 分别按各自的注释语法统计;
右侧柱状图汇总了所有文件的单词频率。

#### 功能演示四:导出结果
点击“导出结果…”,在保存对话框中选择文件类型:
| 格式 | 说明 |
| --- | --- |
| CSV | 带 BOM 的 UTF-8 编码,**用 Excel 直接双击打开中文不乱码**;包含每个文件的结果、合计行和单词频率表 |
| JSON | 便于其他程序读取,包含每个文件、合计和单词频率 |
| TXT | 与命令行相同的对齐文本表格,便于粘贴到报告中 |
下图是上一步导出的 CSV 用 Excel 打开的效果:

#### 实现要点
- **界面不卡顿**:统计在后台线程中进行,完成后通过 `root.after` 回到界面线程刷新表格和图表;
选择的文件超过 200 个时自动使用多进程并行统计。
- **高分屏清晰**:启动时调用 Windows 的 `SetProcessDpiAwareness`,在 125%、150% 缩放的屏幕上文字不会发虚。
- **逻辑与界面分离**:文件收集(`gather_sources`)、导出(`export_report`)、路径显示(`short_name`)都是不依赖窗口的普通函数,
可以直接单元测试;窗口本身也在 `tests/test_gui.py` 中用隐藏窗口实际运行,验证统计、合计行、柱状图、错误提示和导出。
## 5. 单元测试
使用 pytest 编写,共 **339 个测试用例**,代码覆盖率 **98%**
(未覆盖的部分是图形界面的主循环和真实终端中的输入提示,这些用实际运行检查)。

| 测试文件 | 测试内容 |
| --- | --- |
| `test_counter.py` | **基础功能**:空文本、纯空白、多空格/换行/Tab、标点与单词相连、撇号与连字符、数字与小数、CRLF 换行、连续标点、引号括号结尾、无结尾标点;段落、平均长度、单词频率与停用词 |
| `test_cli.py` | **基础功能**:`-c` `-w` `-s` 各参数、参数组合顺序、默认输出、多文件、通配符、文件不存在、非法参数、UTF-8/BOM/GBK 编码、程序入口;表格/JSON/CSV 输出、保存到文件 |
| `test_linestats.py` | **扩展功能**:空行/代码行/注释行判定、`//` 与 `/* */`、多行与未闭合的块注释、字符串中的注释符号、转义引号、Python 文档字符串、HTML/SQL/Lua/CSS、按扩展名选择语言 |
| `test_formatters.py` | 中文字符显示宽度、表格对齐、合计行、平均值合计按总数重新计算 |
| `test_files.py` | 目录递归、跳过特殊目录和二进制文件、include/exclude 过滤、通配符与递归组合 |
| `test_usability.py` | 标准输入与管道、`.wcrc` 解析与优先级、拼写建议、中文错误信息、交互模式各命令 |
| `test_gui.py` | 图形界面:用隐藏窗口实际运行统计、合计行、柱状图、错误提示、导出 |
| `test_streaming.py` | 分块读取:1 字节到 100 KB 各种分块大小下结果与整体读取一致,跨块的多字节字符、`\r\n`、多行注释;多进程与单进程结果一致 |
| `test_properties.py` | **属性测试**:Hypothesis 自动生成随机文本,验证“每行恰好是代码行/空行/注释行之一”“`\n` 与 `\r\n` 结果相同”“两段文本拼接后单词数相加”等规律 |
运行方法:
```
pip install -r requirements-dev.txt
python -m pytest -v 运行全部测试
python -m coverage run -m pytest 统计覆盖率
python -m coverage report -m
python -m flake8 代码规范检查
```
在 VS Code 中:左侧“测试”面板可以直接运行和调试每个测试(已在 `.vscode/settings.json` 中配置 pytest);
也可以按 `Ctrl+Shift+P` → “运行测试任务”,运行“单元测试 + 覆盖率”。
## 6. 性能测试
### 6.1 测试方法
使用 VS Code 和 Python 自带的性能分析工具 **cProfile**:
| 工具 | 用途 | 在 VS Code 中运行 |
| --- | --- | --- |
| `perf/perf_test.py` | 生成 10 MB 英文文本和 10 MB C 代码,分别计时各统计函数,并用 cProfile 统计每个函数的调用次数和耗时 | 运行任务“性能测试: 计时 + cProfile”,或在“运行和调试”中选择“性能测试: cProfile 分析” |
| snakeviz | 以火焰图的形式查看 cProfile 结果 `perf/wc.prof` | 运行任务“性能测试: 生成 cProfile 文件并用 snakeviz 查看” |
| `perf/benchmark.py` | 在独立进程中运行完整程序,测量耗时和峰值内存,并与旧版本(git 标签)对比 | 运行任务“性能测试: 基准对比 (v0.2 vs 当前)” |
### 6.2 cProfile 分析结果

### 6.3 发现的问题与优化
| 问题(cProfile 发现) | 优化方法 | 效果 |
| --- | --- | --- |
| 代码行统计最初逐个字符扫描,`str.startswith`、`str.isspace` 被调用数千万次 | 用正则表达式直接跳到下一个注释符号或引号,中间的代码整段处理 | 10 MB 代码:1.72 s → 0.96 s |
| 大部分代码行不含注释符号和引号,却仍然进入完整的扫描函数 | 增加快速路径:先用一次正则搜索判断,没有特殊符号就直接按长度分类 | 10 MB 代码:0.96 s → 0.77 s |
| 统计可见字符数时把整行拆成单词再求和 | 分类只需要知道 0、1 或“大于 1”,改为 `min(len(s.strip()), 2)` | 函数调用减少约 170 万次 |
| 整个文件一次性读入内存,50 MB 的文件占用近 600 MB 内存 | 按 256 KB 分块读取,在换行处切分;句子、段落、块注释的状态跨块保存 | 峰值内存 573 MB → 23 MB |
| 统计大量小文件时只用了一个 CPU 核 | `-j` 参数用多进程并行统计 | 1000 个文件:1.67 s → 0.62 s |
### 6.4 基准测试结果

测试环境:16 核 CPU,Windows 11,Python 3.12;大文件 50 MB,小文件 1000 个 × 20 KB。
| 测试项 | v0.2 耗时 | v0.2 峰值内存 | 当前版本 耗时 | 当前版本 峰值内存 |
| --- | --- | --- | --- | --- |
| big.txt: -c -w -s | 3.17 s | 573 MB | 3.22 s | 23 MB |
| big.txt: -a -f | 不支持 | - | 4.96 s | 26 MB |
| big.c: -x | 不支持 | - | 4.11 s | 22 MB |
| many files: -a -r | 不支持 | - | 1.67 s | 23 MB |
| many files: -a -r -j 0 | 不支持 | - | 0.62 s | 24 MB |
v0.2 只有 `-c -w -s` 三个参数,所以其余项目显示“不支持”。在统计功能多了很多的情况下,
基础统计的速度与 v0.2 相当,而内存占用只有原来的 4%,不会再因为文件太大而内存不足。
## 7. 版本记录
| 版本 | 内容 |
| --- | --- |
| v0.1 | 空项目:项目结构、`.gitignore`、README |
| v0.2 | 基础功能:`-c` 字符数、`-w` 单词数、`-s` 句子数;编码识别;基础功能单元测试([运行截图](docs/images/v0.2-basic.png)、[测试截图](docs/images/v0.2-tests.png)) |
| v0.3 | 扩展功能与全部加分项:代码行/空行/注释行;文本分析、批量统计、多种输出格式、交互模式、图形界面;更多单元测试与属性测试;VS Code 性能测试与优化 |
详细变化见 [CHANGELOG.md](CHANGELOG.md)。本项目使用 AI 辅助完成,全部提示词见 [AI_PROMPTS.md](AI_PROMPTS.md)。