Skip to content

Commit 72b580e

Browse files
authored
chore: improve implementation for better performance (#3)
## What? - Add minor updates for better performance - See detail in `.claude/docs/2025-12-27-performance-optimization.md` ## Why? - For better UX
1 parent 9df1d03 commit 72b580e

File tree

11 files changed

+950
-200
lines changed

11 files changed

+950
-200
lines changed
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
# Performance Optimization Opportunities
2+
3+
調査日: 2025-12-27
4+
5+
## 概要
6+
7+
svt の高速化余地を調査した結果をまとめる。
8+
9+
## 既に実装済みの最適化
10+
11+
| 項目 | 説明 | 場所 |
12+
|------|------|------|
13+
| スレッド分離 | Worker/Writer/Main の3スレッド構成 | 全体 |
14+
| 最新リクエスト優先 | `drain_to_latest()` で古いリクエスト破棄 | worker.rs |
15+
| ナビゲーション遅延 | `nav_latch` で高速ナビ時の処理スキップ | main.rs |
16+
| エポック管理 | 古い非同期タスクの無視 | app.rs, sender.rs |
17+
| SIMD Base64 | `base64_simd` クレート使用 | kgp.rs |
18+
| 矩形差分計算 | dirty area 管理 | sender.rs |
19+
| Zlib 圧縮 | KGP 転送データの圧縮 | kgp.rs |
20+
| DynamicImage Arc 化 | デコード画像の参照カウント共有 | worker.rs |
21+
| encoded_chunks Arc 化 | エンコード済みデータの参照カウント共有 | worker.rs, app.rs, sender.rs |
22+
| HashMap キャッシュ | `render_cache` を HashMap + VecDeque (LRU) に変更 | app.rs |
23+
| Tile 合成の並列化 | rayon で並列デコード・リサイズ | worker.rs |
24+
| Resize フィルタ設定 | Single: `resize_filter` (default: Triangle), Tile: `tile_filter` (default: Nearest) | worker.rs, config.rs |
25+
| Tile サムネイルキャッシュ | LRU キャッシュ (500 エントリ) でサムネイル再利用 | worker.rs |
26+
| terminal::size() 統合 | ループ冒頭で1回取得して再利用 | main.rs |
27+
28+
---
29+
30+
## 保留: 効果限定的
31+
32+
### 3. as_raw().clone() の削減
33+
34+
**現状の問題:**
35+
```rust
36+
// kgp.rs:140-142
37+
(v.as_raw().clone(), 24) // ピクセルデータ全コピー
38+
```
39+
40+
**改善案:**
41+
- 借用で処理できる場合は Cow 使用
42+
- Zlib 圧縮時は避けられないが、非圧縮時は借用可能
43+
44+
**効果:** メモリ削減
45+
**複雑度:**
46+
**状態:** 保留(実装複雑で効果限定的)
47+
48+
---
49+
50+
## スキップ: API 非対応
51+
52+
### 9. base64 encode_to_vec 使用
53+
54+
**現状の問題:**
55+
```rust
56+
// kgp.rs:154
57+
base64_simd::STANDARD.encode_to_string(&data).into_bytes()
58+
```
59+
60+
**改善案:**
61+
```rust
62+
base64_simd::STANDARD.encode_to_vec(&data)
63+
```
64+
65+
**状態:** base64_simd 0.8 には encode_to_vec メソッドが存在しないためスキップ
66+
67+
---
68+
69+
## 既に解決済み
70+
71+
### 10. status キャッシュキー保持
72+
73+
**元の問題:**
74+
- 毎 tick で render_cache を線形走査して status を計算
75+
76+
**解決方法:**
77+
- #5 HashMap 化で O(n) → O(1) に改善
78+
- main.rs で last_status, last_indicator による差分チェック実装済み
79+
80+
---
81+
82+
## 推奨実装順序
83+
84+
### 完了 ✓
85+
1. #1 DynamicImage Arc 化
86+
2. #2 encoded_chunks Arc 化
87+
3. #5 HashMap キャッシュ
88+
4. #6 Tile 合成の並列化 (rayon)
89+
5. #7 Tile 高速フィルタ (+ Single モード対応)
90+
6. #4 Tile サムネイルキャッシュ
91+
7. #8 terminal::size() 統合
92+
93+
### 保留
94+
- #3: 実装複雑で効果限定的
95+
- #9: base64_simd API 非対応

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,4 @@ serde = { version = "1", features = ["derive"] }
1616
toml = "0.8"
1717
dirs = "5"
1818
arboard = "3"
19+
rayon = "1.10"

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,12 @@ Create `~/.config/svt/config.toml`:
136136
nav_latch_ms = 150
137137
render_cache_size = 100
138138
prefetch_count = 5
139+
prefetch_threads = 2
139140
compress_level = 6
140141
cell_aspect_ratio = 2.0
142+
resize_filter = "triangle"
143+
tile_filter = "nearest"
144+
tile_threads = 4
141145
```
142146

143147
### 📊 Options
@@ -147,14 +151,18 @@ cell_aspect_ratio = 2.0
147151
| `nav_latch_ms` | `SVT_NAV_LATCH_MS` | `150` | Navigation latch (ms) |
148152
| `render_cache_size` | `SVT_RENDER_CACHE_SIZE` | `100` | Render cache entries |
149153
| `prefetch_count` | `SVT_PREFETCH_COUNT` | `5` | Prefetch count |
154+
| `prefetch_threads` | `SVT_PREFETCH_THREADS` | `2` | Prefetch thread count (1-8) |
150155
| `compress_level` | `SVT_COMPRESS_LEVEL` | `6` | Zlib compression (0-9) |
151156
| `kgp_no_compress` | `SVT_KGP_NO_COMPRESS` | `false` | Disable compression |
152-
| `tmux_kitty_max_pixels` | `SVT_TMUX_KITTY_MAX_PIXELS` | `2000000` | Max pixels (tmux+kitty) |
157+
| `tmux_kitty_max_pixels` | `SVT_TMUX_KITTY_MAX_PIXELS` | `1500000` | Max pixels (tmux+kitty) |
153158
| `force_alt_screen` | `SVT_FORCE_ALT_SCREEN` | `false` | Force alt screen |
154159
| `no_alt_screen` | `SVT_NO_ALT_SCREEN` | `false` | Disable alt screen |
155160
| `debug` | `SVT_DEBUG` | `false` | Debug mode |
156161
| `trace_worker` | `SVT_TRACE_WORKER` | `false` | Worker tracing |
157162
| `cell_aspect_ratio` | `SVT_CELL_ASPECT_RATIO` | `2.0` | Cell aspect ratio (tile grid) |
163+
| `resize_filter` | `SVT_RESIZE_FILTER` | `triangle` | Resize filter for single mode (nearest, triangle, lanczos3) |
164+
| `tile_filter` | `SVT_TILE_FILTER` | `nearest` | Resize filter for tile mode (fastest for thumbnails) |
165+
| `tile_threads` | `SVT_TILE_THREADS` | `4` | Tile processing thread count (1-8) |
158166

159167
## 🤝 Contributing
160168

0 commit comments

Comments
 (0)