Part 08 Unit 01

效能優化技巧

讓你的轉換作業飛速運行



學習目標

  • 了解影響 Pandoc 效能的因素
  • 學會大檔案處理技巧
  • 掌握批次處理優化方法
  • 使用 AI 分析效能瓶頸

為什麼效能很重要?


100+
檔案批次轉換
10MB+
大型文件處理
24/7
自動化任務

真實場景:當你需要轉換數百份文件時,每份省 1 秒就能省下好幾分鐘!

影響效能的主要因素


1. 檔案大小

檔案越大,處理時間越長


2. 輸出格式複雜度

PDF > DOCX > HTML > TXT


3. 包含的媒體內容

圖片、表格、程式碼區塊都會增加處理時間


4. 系統資源

CPU、記憶體、硬碟速度都有影響

測量轉換時間

在優化之前,先學會測量


PowerShell 計時方法

# 方法一:使用 Measure-Command Measure-Command { pandoc input.md -o output.docx } # 輸出會顯示: # TotalSeconds : 2.3456789

小技巧:多測幾次取平均值,結果更準確!

實作:建立計時腳本


1開啟 Antigravity


2請 AI 幫你寫計時腳本

請幫我寫一個 PowerShell 腳本, 可以測量 Pandoc 轉換的執行時間, 並將結果輸出成報告

計時腳本範例

# benchmark.ps1 param( [string]$InputFile, [string]$OutputFormat = "docx" ) $outputFile = [System.IO.Path]::ChangeExtension($InputFile, $OutputFormat) Write-Host "開始測試: $InputFile" -ForegroundColor Cyan $result = Measure-Command { pandoc $InputFile -o $outputFile } Write-Host "轉換完成!" -ForegroundColor Green Write-Host "耗時: $($result.TotalSeconds.ToString('F2')) 秒" -ForegroundColor Yellow # 計算檔案大小 $inputSize = (Get-Item $InputFile).Length / 1KB $outputSize = (Get-Item $outputFile).Length / 1KB Write-Host "輸入: $($inputSize.ToString('F1')) KB" Write-Host "輸出: $($outputSize.ToString('F1')) KB"

大檔案處理策略


問題:檔案太大怎麼辦?

當 Markdown 檔案超過 1MB,轉換速度會明顯變慢


解決方案

技巧一:分割大檔案


AI 提示詞

請幫我把這份很長的 Markdown 文件, 按照 ## 標題分割成多個小檔案, 每個檔案一個章節

效果:10MB 大檔分成 10 個 1MB 小檔,可以平行處理,總時間大幅縮短!

自動分割腳本

# split-markdown.ps1 param([string]$InputFile) $content = Get-Content $InputFile -Raw -Encoding UTF8 $chapters = $content -split '(?=^## )' $index = 1 foreach ($chapter in $chapters) { if ($chapter.Trim()) { $fileName = "chapter-$($index.ToString('D2')).md" $chapter | Out-File $fileName -Encoding UTF8 Write-Host "建立: $fileName" $index++ } } Write-Host "共分割成 $($index - 1) 個檔案"

技巧二:轉換後合併


分別轉換成 HTML

# 轉換所有章節 Get-ChildItem chapter-*.md | ForEach-Object { pandoc $_.FullName -o ($_.BaseName + ".html") }

合併 HTML 檔案

# 合併成一個完整 HTML Get-Content chapter-*.html | Out-File complete.html -Encoding UTF8

技巧三:平行處理

同時轉換多個檔案,大幅提升效率


# parallel-convert.ps1 # PowerShell 7+ 支援平行處理 $files = Get-ChildItem *.md $files | ForEach-Object -Parallel { $output = $_.BaseName + ".docx" pandoc $_.FullName -o $output Write-Host "完成: $output" } -ThrottleLimit 4 # 同時最多 4 個任務

ThrottleLimit:根據你的 CPU 核心數調整,建議設為核心數的一半

效能比較

轉換 20 個 Markdown 檔案的時間比較


方法 耗時 說明
逐一轉換 60 秒 每個 3 秒 × 20 個
平行 x2 30 秒 同時 2 個任務
平行 x4 15 秒 同時 4 個任務

結論:平行處理可提升 2-4 倍效能!

技巧四:減少不必要的處理


只轉換有變更的檔案

# 只處理比輸出新的來源檔 Get-ChildItem *.md | ForEach-Object { $output = $_.BaseName + ".docx" # 檢查輸出是否存在且較新 if (!(Test-Path $output) -or $_.LastWriteTime -gt (Get-Item $output).LastWriteTime) { pandoc $_.FullName -o $output Write-Host "轉換: $($_.Name)" -ForegroundColor Green } else { Write-Host "跳過: $($_.Name) (已是最新)" -ForegroundColor Gray } }

技巧五:使用快取


什麼情況適合快取?

  • 經常重複轉換相同檔案
  • 只有部分內容變更
  • 需要多種輸出格式

快取策略

保存轉換結果,下次直接使用

# 使用檔案雜湊作為快取識別 $hash = Get-FileHash input.md -Algorithm MD5 $cachePath = ".cache/$($hash.Hash).docx"

技巧六:簡化輸出選項


移除不需要的功能

選項 效果 節省時間
--no-highlight 停用程式碼高亮 約 10%
不含圖片 跳過圖片處理 約 30%
簡單格式 用 HTML 取代 PDF 約 50%

建議:草稿階段用簡單格式,定稿再用完整格式

技巧七:記憶體優化


處理超大檔案時的記憶體管理

# 使用串流方式處理,避免載入整個檔案到記憶體 Get-Content large-file.md -ReadCount 1000 | ForEach-Object { # 分批處理 $_ | Out-File temp-chunk.md -Append }

注意:如果電腦記憶體不足 8GB,處理大於 50MB 的檔案可能會很慢

使用 AI 分析效能瓶頸


在 Antigravity 中

我的批次轉換腳本跑很慢, 每轉換一個檔案需要 5 秒, 共有 100 個檔案,總共要 8 分鐘 請幫我分析可能的瓶頸, 並提供優化建議

AI 會幫你:分析問題、提供多種優化方案、改寫腳本

實作練習


任務:優化轉換腳本


1找一個有 10 個以上 .md 檔案的資料夾


2用 Measure-Command 測量逐一轉換的時間


3改用平行處理,再測一次


4比較兩種方法的差異

完整效能監控腳本

# performance-test.ps1 param([string]$Folder = ".") $files = Get-ChildItem "$Folder\*.md" Write-Host "找到 $($files.Count) 個檔案" -ForegroundColor Cyan # 測試逐一處理 $sequential = Measure-Command { $files | ForEach-Object { pandoc $_.FullName -o "$Folder\seq-$($_.BaseName).docx" } } # 測試平行處理 $parallel = Measure-Command { $files | ForEach-Object -Parallel { pandoc $_.FullName -o "$using:Folder\par-$($_.BaseName).docx" } -ThrottleLimit 4 } Write-Host "`n效能比較:" -ForegroundColor Yellow Write-Host "逐一處理: $($sequential.TotalSeconds.ToString('F1')) 秒" Write-Host "平行處理: $($parallel.TotalSeconds.ToString('F1')) 秒" Write-Host "提升: $(($sequential.TotalSeconds / $parallel.TotalSeconds).ToString('F1'))x"

效能優化最佳實踐


優化順序建議

  1. 先測量 - 找出真正的瓶頸
  2. 減少工作量 - 只處理需要的檔案
  3. 平行處理 - 善用多核心 CPU
  4. 簡化選項 - 移除不必要的功能
  5. 使用快取 - 避免重複工作

記住:過早優化是萬惡之源,先確保程式正確,再來優化速度!

小測驗


哪個選項最能提升批次轉換的效能?



本單元總結


學到的技巧

  • 使用 Measure-Command 測量效能
  • 分割大檔案再處理
  • 使用平行處理提升效率
  • 只處理有變更的檔案
  • 善用 AI 分析效能瓶頸

下一步:在 Unit 02 學習錯誤處理與除錯技巧