⭐Render Time (ComfyCode)⭐
The node that times your whole workflow and does nothing itself
- source
RenderTime is the front door of the ComfyUI Render Time pack, and it is a small scam in the best way: the node's actual Python function is literally called noop and returns an empty dict. It computes nothing, saves nothing, connects to nothing. All the work happens in the plugin's patched execution engine, and the node is just the dashboard that shows you what it recorded. You drop it on the canvas with zero wires, queue a run, and it fills with a per-node timing table. It's a telemetry display dressed up as a node, and for a lot of workflows that's exactly what you want.
When do you reach for it? When a workflow is slow and you can't tell where the time is going. Is it the sampler, the upscaler, the VAE decode, or the file write? Guessing is how you burn an evening. This replaces the guess with a wall-clock number per node, plus a share-of-total percentage bar so the culprit jumps out at you. It also labels cached nodes [CACHED] and counts them as 0 s - which is honestly the fastest way to internalize how ComfyUI's cache works. Change only the seed and the whole loader/sampler branch re-runs while unchanged inputs get skipped; watch that table once and you'll stop re-queuing identical prompts out of paranoia.
How it works
The pack hooks the engine in three places when it loads (__init__.py): it wraps comfy_execution.get_output_data to clock every node start/end, wraps execute to detect cache hits and inject the timing snapshot into extra_pnginfo on output nodes, and wraps PromptExecutor.execute_async to total things up, write the report files, and push a render_time.update WebSocket event to the browser. The node's frontend listens for that event and redraws - which is also why it's per-tab safe: each workflow tab keeps its own run's data, so switching tabs doesn't show you somebody else's numbers.
The two inputs that matter
The node has no outputs at all - don't go looking for wires leaving it. Just these two inputs:
prefix(STRING, default empty) - the shared filename prefix for the files it writes. The author's own tooltip calls it "the shared filename prefix used by JSON, TXT, PNG, and Render Time MP4 outputs." Set it per workflow, or youroutput/folder fills with dated-but-generic files you can't tell apart.source(optional, accepts any type) - wire this from a Save Image or Save Video node to scope the report to that branch. The pack walks upstream from the wire and only reports nodes in that dependency graph, which is exactly what you want when one workflow produces multiple outputs and you need to time one of them in isolation. Skip it and you get the whole run.
Installing it
ComfyUI Manager, search ComfyUI Render Time, install, restart. Or by hand:
cd ComfyUI/custom_nodes
git clone https://github.com/videofeedback/comfyui-render-time comfyui-Render-Time
pip install -r comfyui-Render-Time/requirements.txt
The only dependency is Pillow, there are zero model downloads, and it needs ComfyUI >= 0.3.0 and Python >= 3.10. On macOS, the README insists on Python 3.13 specifically (prebuilt wheels; newer alpha builds can fail), so brew install [email protected] first if you're there. Restart ComfyUI either way - the engine patches only apply at startup.
Gotchas worth knowing
- The table is empty until you run something. Add the node, queue a prompt, then it fills. That's not a bug.
- All four file outputs are on by default. Every run writes
LOG.txt(live, line by line),LOG.json,COMFYUI.json(the workflow with timing embedded inextra.render_time_report- drag it back in to reload), and aWORKFLOW.png. If you only want the on-screen table, flip them off in the node's Settings tab. - Timing is wall-clock, not GPU compute. A slow file write, or a job sitting in queue behind another render, inflates the number. For a real benchmark, run one job alone and compare like-for-like.
- Log reconstruction needs v1.0.0+ logs. Older logs lack the
LINKS_JSON/SLOTS_JSONblocks the reconstruct script needs, and you get an unconnected skeleton.
One honest caveat: this pack is young and barely has a footprint in the community - a solo author (Ramiro Montes De Oca), MIT-licensed, with no reddit chatter behind it yet. That means fewer eyes on the bugs and no battle-tested reputation. For a tool whose only cost is two seconds of your canvas and one tiny pip install, that's an acceptable trade - it genuinely does one thing well.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| prefix | STRING | — | |
| sourceopt | * | — |
Outputs (0)
No outputs