本輪延續前次函式檢查,納入新增的 GitHub 更新流程,檢查自有程式碼的重複工作、暫時配置與資源生命週期。介面、操作、功能、認證、排序及錯誤處理維持原有行為。
以 Go parser 與 TypeScript AST 盤點正式程式碼,按模組檢查函式的呼叫方式與資源成本。調整後共有:
- Go:28 個含函式的檔案,356 個具名函式/方法、60 個匿名函式,包含平台分支。
- 前端
src:26 個含函式的檔案,810 個具有實作的函式/回呼。 - 獨立安裝視窗 JavaScript:6 個函式/回呼。
- JavaScript/TypeScript 建置工具:35 個函式/回呼;版本控制內的 shell 腳本另有 5 個具名輔助函式。
這是盤點數量,不是修改或逐一量測的數量。型別宣告、自動產生的 Wails 綁定、第三方套件、測試與基準不列入正式函式統計。入口、組態與清理流程也納入檢查。
| 模組 | 檢查結果與處置 |
|---|---|
main.go、操作登錄、一般檔案與平台輔助函式 |
保留啟停、取消、FD 與來源識別的生命週期 |
app.go、文字解碼、檔名排序、有界讀取 |
掃描先以檔名判斷副檔名;只為支援的內容或目錄組合完整路徑。保留文字、排序及讀取限制 |
download.go |
已在記憶體內的 HLS 清單直接逐行解析,省去 Scanner 工作區與行字串複製 |
update.go、internal/updater |
增加精簡進度快照;串流下載、驗證、取消、獨立安裝、啟動收據及失敗回復流程維持既有行為 |
media.go、圖片/PDF HTTP |
保留來源失效判定、串流、Range、取消及有界診斷輸出 |
| 檔案操作、ZIP/TAR、縮圖解碼及磁碟快取 | 保留容量、並行預算、使用中淘汰、CRC 與檔案識別檢查 |
useDownloads、downloads、useAppUpdates、appUpdates |
相同輪詢結果沿用既有 React state 身分;輪詢只在標籤改變時取得發行說明 |
structuredData、結構化文件檢視 |
排序前保存數值鍵,排序索引而非每次解析欄位;已排序數值欄位走快速路徑 |
App、圖庫樹/檢視、工作區、篩選、掃描佇列 |
保留分支共用、弱鍵快取、分塊 FIFO、選取順序與失效判定 |
| 播放器、字幕、圖片傳輸、縮圖、虛擬網格與版面工具 | 保留既有工作區重用、預取限制、離屏取消、事件清理與可視列掛載 |
| 建置、版本資料、相依套件與檢查腳本 | 保留版本格式、macOS 12 arm64 目標、可重跑檢查及既有依賴 |
ScanDirectory 不再為不支援的檔案先組合完整路徑。目錄、特殊檔名、大小寫副檔名、檔案連結與目錄連結的處理順序不變;支援內容的 stat、取消與穩定排序保持原樣。
parseHLSPlaylist 以 strings.SplitSeq 借用原內容中的每一行,不配置分行陣列或 Scanner 緩衝。保留原有 32 MiB 單行限制、CRLF/空行/最後一行處理、位元組範圍、初始化區段、變體順序及加密串流拒絕行為。網路中繼資料總量與下載分段限制仍由既有流程檢查。產生的 URL 經原有解析器組合為獨立結果。
原版函式保存在測試用 playlist_reference_test.go、scan_reference_test.go,供相同輸入的輸出、錯誤及基準對照。
GetUpdateProgress 只回傳階段、目前版本、發行標籤、位元組數與錯誤。完整 GetUpdateState 仍保留全部發行資訊;前端發現不同標籤時才取得詳細資料,同一次更新重用既有發行說明。手動重新檢查仍能更新相同標籤的說明文字。
reconcileDownloads 與 reconcileAppUpdateState 比較所有目前定義的狀態欄位。資料沒有變化時沿用既有 state,避免由相同輪詢結果引發主畫面重複渲染;進度、順序、刪除、錯誤及發行資訊改變時仍發布新狀態。維持原有輪詢間隔、單一請求、取消、過期回應與卸載保護。
這些函式不建立持久快取,僅保留畫面目前使用的快照。Wails 綁定與前端型別已一併更新。
selectDelimitedRows 先檢查完全由有限數值組成、且已符合指定方向的欄位;符合時直接取出可見列。其他情況以 Float64Array 暫存數值鍵,再排序整數索引。混合內容仍使用原本「雙方都是非空有限數值才做數值比較,否則使用語系自然排序」的規則。
保留原有穩定同值順序、Unicode、空白/缺少欄位、科學記號、正負零、無限大文字、篩選與 1,000 列預覽限制,不修改輸入陣列。排序需處理全部匹配資料;無排序的查詢仍在第一筆被省略的匹配列停止。
數值鍵工作區為每列 8 bytes,4,999 列為 39,992 bytes,僅存在於本次函式呼叫;已排序數值欄位不建立此工作區。
Apple M4、darwin/arm64、Go 1.26.6、Node 24.14.0。Go 為三次 -benchtime=300ms 結果的中位數;前端先暖機 60 次,再取七組、每組 50 次的中位數。原版與新版使用相同輸入。
| 情境 | 調整前 | 調整後 |
|---|---|---|
| 2,000 個不支援檔案的目錄掃描 | 2.118 ms | 1.355 ms |
| 同上,配置量/次數 | 690,179 B/6,052 次 | 274,176 B/4,052 次 |
| 64 段 HLS 清單解析 | 40.3 µs | 25.3 µs |
| 同上,配置量/次數 | 96,664 B/395 次 | 28,512 B/263 次 |
| 10,000 段 HLS 清單解析 | 5.745 ms | 4.477 ms |
| 同上,配置量/次數 | 5.697 MB/60,023 次 | 5.231 MB/40,019 次 |
| 含 136 KiB 發行說明的單次更新狀態 JSON | 147,669 bytes | 141 bytes |
| 同上,序列化時間/配置量 | 164.8 µs/156,302 B | 0.335 µs/240 B |
| 4,999 列含空白數值的表格排序 | 4.535 ms | 0.724 ms |
| 4,999 列自然文字排序 | 8.762 ms | 7.122 ms |
| 4,999 列混合內容排序 | 6.494 ms | 5.259 ms |
| 4,999 列已排序數值欄位 | 0.0938 ms | 0.0324 ms |
前端單次呼叫的暫時 heap 增量,中位數如下:
| 情境 | 調整前 heap | 調整後 heap | 調整後額外 ArrayBuffer |
|---|---|---|---|
| 含空白數值排序 | 5.44 MB | 1.91 MB | 39,992 B |
| 自然文字排序 | 1.90 MB | 0.33 MB | 39,992 B |
| 混合內容排序 | 1.34 MB | 0.47 MB | 39,992 B |
| 已排序數值欄位 | 89,336 B | 8,392 B | 0 B |
這些資料只表示指定函式及輸入的結果。Go B/op 是配置總量;Node heap 與 ArrayBuffer 增量受引擎、暖機及 GC 影響,都不是原生 App 的常駐記憶體。掃描基準包含本機暫存目錄的暖檔案系統讀取;HLS 不含網路;更新狀態基準使用合成的長說明,不含 Wails 傳輸時間、下載、簽章驗證或安裝。未量測原生 WebView 長時間 RSS。
- 前端 161 項測試通過,涵蓋排序結果/順序/記錄身分、輪詢完整欄位、進度、說明保留、手動重查、取消與過期回應。
- Go 205 項一般測試及 3 個 fuzz 種子套件通過,使用 race detector;已啟用正式簽署 App 的更新驗證 fixture。
- TypeScript、Vite production build、Go vet、Wails production 原生編譯及 macOS 12 arm64 目標檢查通過。
- 前端 10 個 JSX/CSS 原始檔與本輪修改前逐位元組一致。
- HLS 原版對照涵蓋 64 KiB 工作區邊界、32 MiB 單行邊界、有無最末換行及解析錯誤。
- 額外執行 15 秒 HLS 對照 fuzz,698,887 次輸入皆通過。
npm --prefix frontend test
GOTOOLCHAIN=go1.26.6 go test -race ./...
GOTOOLCHAIN=go1.26.6 go test ./internal/app -run '^$' -fuzz '^FuzzPlaylistParserParity$' -fuzztime=15s -parallel=4
GOTOOLCHAIN=go1.26.6 go test ./internal/app -run '^$' -bench 'BenchmarkFunction(Playlist|DirectoryScan|UpdateProgress)$' -benchmem -benchtime=300ms -count=3
cd frontend
node --expose-gc benchmarks/function-review.mts正式簽署 fixture 驗證需將 FASTFILEVIEWER_UPDATE_TEST_APP 指向可用的正式 App;未設定時只有該項測試會跳過。前端資產需先建置,供 Go 入口嵌入。
此報告記錄最佳化完成時的來源範圍與量測;後續整合的新功能、發行版本及安裝包驗證見發行說明。既有快取上限、檔案操作及更新交易的安全檢查仍受回歸測試覆蓋。