codestat 0.1.0

Fast and safe code statistics tool
codestat-0.1.0 is not a library.

CodeStat

一个使用 Rust 编写的高性能代码统计工具,用于统计 Git 仓库或指定目录中的代码行数和编程语言分布。

特性

  • ⚡ 极速: 使用并行处理 (Rayon) 和优化的文件遍历
  • 🛡️ 安全: 纯 Rust 实现,内存安全,无数据竞争
  • 📊 详细统计: 代码行、注释行、空行分别统计
  • 🔍 智能检测: 支持 50+ 种编程语言
  • 🎯 尊重 .gitignore: 自动忽略不应统计的文件
  • 📁 灵活输出: 支持表格、JSON、CSV 格式

支持的编程语言

  • 系统编程: Rust, C, C++, Go, Zig, Assembly
  • Web 开发: JavaScript, TypeScript, HTML, CSS, SCSS, PHP
  • JVM 语言: Java, Kotlin, Scala, Groovy, Clojure
  • 移动开发: Swift, Objective-C, Dart
  • 脚本语言: Python, Ruby, Perl, Shell, PowerShell
  • 函数式: Haskell, Elixir, Erlang, F#, Lisp
  • 数据科学: R, MATLAB, Julia
  • 配置/标记: JSON, YAML, XML, TOML, Markdown
  • 更多...

安装

从源码构建

git clone <repository>
cd codestat
cargo build --release

编译后的二进制文件位于 target/release/codestat

使用方法

基本用法

# 统计当前目录
codestat

# 统计指定目录
codestat /path/to/project

# 统计单个文件
codestat src/main.rs

输出格式

# 表格格式 (默认)
codestat --format table .

# JSON 格式
codestat --format json .

# CSV 格式
codestat --format csv .

高级选项

# 显示每个文件的统计
codestat --files .

# 显示进度
codestat --progress .

# 包含隐藏文件
codestat --hidden .

# 只统计特定语言
codestat --languages rust,python,go .

# 排除特定模式
codestat --exclude "*.test.js,*.min.css" .

# 禁用并行处理 (降低内存使用)
codestat --no-parallel .

# 跟随符号链接
codestat --follow-links .

性能

经过深度优化,性能表现如下:

项目规模 文件数 代码行数 耗时 处理速度
小型 500 30K 0.08s 6,500 文件/s
中型 4,600 1.6M 0.42s 11,000 文件/s
大型 50K+ 20M+ ~3s 15,000+ 文件/s

优化亮点:

  • 内存映射大文件(零拷贝)
  • 字节级分析(无 UTF-8 验证开销)
  • 智能负载均衡(按文件大小排序)
  • 批量并行处理(减少任务切换)

与其他工具对比

工具 4,600 文件 特性
codestat 0.42s Rust,零拷贝,并行
tokei ~0.6s Rust,功能丰富
cloc ~4s Perl,准确但慢
scc ~1s Go,功能丰富

测试环境: macOS, M1 Pro, 16GB RAM

示例输出

表格格式

================================================================================
 Language                  Files      Lines       Code   Comments     Blanks
--------------------------------------------------------------------------------
 Rust                          6       1108        951         40        117
 TOML                          1         22         20          0          2
--------------------------------------------------------------------------------
 Total                         7       1130        971         40        119
================================================================================

 Statistics completed in 0.003s (2333 files/s, 376667 lines/s)

JSON 格式

{
  "summary": {
    "total_files": 7,
    "total_lines": 1130,
    "total_code": 971,
    "total_comments": 40,
    "total_blanks": 119,
    "elapsed_ms": 3
  },
  "languages": [
    {
      "name": "Rust",
      "files": 6,
      "lines": 1108,
      "code": 951,
      "comments": 40,
      "blanks": 117
    }
  ]
}

性能 Benchmark

运行内置 benchmark 测试各模块性能:

codestat --benchmark

典型测试结果 (M1 Pro)

【语言检测性能】
  速度:     4,141,859 文件/秒
  平均延迟: 241ns

【不同文件大小处理】
  1KB:    38µs   (26 MB/s)
  10KB:   89µs   (109 MB/s)
  100KB:  558µs  (175 MB/s)
  1MB:    5.3ms  (189 MB/s)
  10MB:   40ms   (250 MB/s)

【语言解析性能】
  Markdown: 33µs  (1000 lines)
  Python:   70µs  (1000 lines)
  Rust:     76µs  (1000 lines)
  JavaScript: 82µs (1000 lines)

【并行加速】
  串行: 23.7ms
  并行: 3.7ms
  加速比: 6.38x (80% 并行效率)

技术栈

  • Rust 2024 Edition: 最新的 Rust 语言特性
  • Rayon: 数据并行处理,工作窃取调度
  • ignore: 智能文件遍历,支持 .gitignore
  • memmap2: 内存映射大文件(零拷贝)
  • clap: 命令行参数解析
  • serde: JSON 序列化

优化技术详解

1. 零拷贝文件读取

  • 小文件 (< 1MB): 预分配缓冲区一次性读取
  • 大文件 (> 1MB): 使用 mmap 内存映射,避免内核态到用户态的拷贝

2. 字节级解析

  • 直接操作 &[u8],避免 String 的 UTF-8 验证开销
  • 手写行扫描器,比 lines() 迭代器更快
  • 快速空行检测:O(n) 字节检查

3. 智能并行策略

  • 小批量 (< 100 文件): 串行处理,避免并行开销
  • 大批量: 按文件大小降序排序,实现负载均衡
  • 批量处理: 减少 Rayon 任务切换开销

4. 算法优化

  • 静态 HashMap: OnceLock 懒加载,O(1) 语言检测
  • 字节查找: 简化版 Boyer-Moore 子串匹配
  • 单次遍历: 一行代码完成所有统计类型

许可证

MIT License