Timer 🥚
A workflow stopwatch that tells you where the time actually went
- any_in
- any_out
- last_run
Timer answers the question everyone hits eventually: "which node in this workflow is eating my minutes?" It's a stopwatch you drop into the graph, and the author is refreshingly honest about it - the README calls it "somewhat rough around the edges with a number of confusing buttons and inputs (thankfully you can ignore them all)."
It's a lazy man's profiler, and that's a compliment. ComfyUI's own performance overlay and the debug menu exist, but for a quick "is my VAE decode or my upscaler the bottleneck" sanity check, dropping a couple of these in is the fastest route to an answer.
What it does
The node records timing info when the job runs and reports it back. The outputs are:
- any_out (*) - a passthrough of whatever you feed any_in.
- last_run (STRING) - the timing summary from the last execution.
The inputs are equally minimal: notes is a free-text label that gets recorded with the timing, and any_in is just there so you can wire the timer into the workflow at the point you care about - the tooltip says it's only required if you want notes recorded when the run happens. It's marked as an output node, so it executes and shows you its results on the frontend.
There are, the README hints, buttons and inputs you can safely ignore. That's the whole design: don't fight the UI, just wire the thing and read last_run.
How to actually use it
Plop a Timer before and after the section you suspect, or right at the end of a pipeline stage. Wire a value through each one's any_in → any_out so they sit on the execution path. Put a note in notes ("VAE decode", "upscale pass") so you can tell the results apart. Run once, read last_run, compare. That's it.
If you want node-by-node numbers, ComfyUI's built-in profiling (the graph "performance" tracking) is more thorough - this is for the "I just want to know if the hires-fix pass is the expensive one" case where a full profile is overkill.
Installing it
Comes with comfy-ovum:
cd ComfyUI/custom_nodes
git clone https://github.com/sfinktah/comfy-ovum
Restart, or find it via ComfyUI Manager under "comfy-ovum". No models, no special dependencies - the pack's requirements are all lightweight and mostly already present (numpy, pillow, requests, aiohttp).
Gotchas
Timing measurements are inherently noisy - first run after a model load includes disk reads and JIT compile that later runs don't. Run your comparison twice and take the second numbers. And because it's an output node that reports last_run as a string, the value is a snapshot from the previous execution, not a live clock; if the string looks stale, run the workflow and check again. Beyond that, the only real enemy here is the "confusing buttons" the author warned you about - if a widget doesn't obviously matter, it probably doesn't, so leave it alone.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| notesopt | STRING | This will be recorded when the job is dequeued | |
| any_inopt | * | This is just used connect the timer to the workflow somewhere (only required if you want 'notes' to be recorded when the workflow runs) |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| any_out | * | — |
| last_run | STRING | — |