LogExecTime
LogExecTime 是一個極簡的計時工具 — new 出來就開始計時、呼叫 Log() 印出耗時。常用來測 SQL 查詢、外部 API 呼叫的效能。
Namespace
using ZapLib;
Basic Usage
LogExecTime t = new LogExecTime("Heavy Calculation");
// ... 做事
Thread.Sleep(1500);
t.Log();
Log 檔輸出:
[11:40:19] [Log Exec Time] Heavy Calculation
Takes 1.514 second
Enable / Disable Globally
Log() 是否實際寫入,由 Config 控制:
<appSettings>
<add key="LogExecTime" value="true" />
</appSettings>
true→ 寫入MyLogfalse或未設 →Log()變成 no-op,完全不寫
設計理念:開發 / 除錯時開、Production 時關。程式中的計時程式碼不需要為了開關到處包
#if DEBUG。
Read Time Manually
如果你想自己拿耗時、不依賴 config 開關:
LogExecTime t = new LogExecTime("Inline Test");
DoSomething();
t.Log(); // 這行可能不寫檔,但 EndTime / DiffTime 一定會被算出來
TimeSpan elapsed = t.DiffTime;
double ms = elapsed.TotalMilliseconds;
Console.WriteLine($"耗時 {ms} ms");
可讀屬性:
| 屬性 | 說明 |
|---|---|
Name |
行為名稱(建構時傳入) |
StartTime |
new 當下 |
EndTime |
Log() 被呼叫的當下 |
DiffTime |
EndTime - StartTime |
SQL Auto-Tracing
SQL 與 OracleSQL 內部已經幫每個 query 包了 LogExecTime — 你不需要手寫:
// 開 LogExecTime
<add key="LogExecTime" value="true" />
// 跑任何 SQL
SQL db = new SQL("DefaultConn");
db.QuickQuery<ModelBook>("SELECT * FROM Book");
Log 自動出現:
[11:40:19] [Log Exec Time] Exec sql: SELECT * FROM Book
Param: null
TraceCode: 7a5e2f...
Takes 0.014 second
Pattern: 用 using 自動 Log
LogExecTime 本身不實作 IDisposable,但你可以包一層:
public sealed class TimingScope : IDisposable
{
private readonly LogExecTime _t;
public TimingScope(string name) => _t = new LogExecTime(name);
public void Dispose() => _t.Log();
}
// 使用
using (new TimingScope("Batch Import"))
{
ImportFromCsv("data.csv");
}
// 離開 using → 自動 Log()
When NOT to Use
- 微秒級效能量測 —
MyLog.Write本身就有 disk I/O 成本。請改用Stopwatch+ memory buffer - 不想吃 ZapLib 的 Config 機制 — 自己用
Stopwatch更輕量 - 想送到 APM / Application Insights — 走專用 SDK,不要繞
MyLog
See Also
- MyLog —
LogExecTime內部寫檔的工具 - Global Config — LogExecTime