⏱️ Generation Time [meti]
This Node Tells You How Slow Your Sampler Actually Is
- input_any
- passthrough
- time_with_label
- time_only
How long did that actually take? If you've ever switched samplers or checkpoints and wanted a real number instead of a gut feeling, this is the node. ComfyUI's console prints a steps-per-second line when you run, but that only covers the sampling block - it won't tell you the whole workflow took 2m 34s including the model load, the upscale, the save. MetiGenerationTime is a stopwatch you drop into the graph, and it hands you that total as a string you can actually read or feed into another node.
It's the simplest of three nodes in ComfyUI-Useful-Meti, a small utility pack by Mahdi Sharifi (Metixxx). Its sibling nodes handle image history and advanced saving; this one just times things, and it's the least likely to go wrong.
How it works
Under the hood it's cheekier than it looks. At import time it wraps ComfyUI's execution.PromptExecutor.execute - the function that runs every prompt - starts a class-level timer when execution begins, and resets it when the run finishes. The node itself just reads "how long since the workflow started" and formats it into a human string: 34.12s under a minute, 2m 34s above, hours if you're patient.
The catch follows from that. The number is time since the whole workflow started executing, not "time this node took." So where you place the node decides what you measure. Drop it right after the KSampler and you get a partial time; put it at the end, after your save node, and you get the full run. The README's example is comparing samplers and schedulers - run the same workflow twice, read the difference. Treat it as a benchmark tool, not a profiler: it tells you the total, not which node ate the time.
Inputs and outputs
input_any- connect anything (an image, a string, whatever). It's passed through untouched, and its real job is forcing the node to sit in the flow at the point where you want to measure.input_string- the label, default "Generation Time". Set it to "Render" and you get "Render: 2m 34s".passthrough- your original data, unchanged.time_with_label- "Generation Time: 2m 34s".time_only- "(Runtime: 2m 34s)", the same number without your label.
Three of those are self-explanatory; the one thing beginners trip on is that strings don't paint themselves on the canvas. Wire time_with_label into ComfyUI's built-in Preview Text node to actually see it, or feed it into a filename or a note.
Installing
The whole pack is one clone. Via ComfyUI Manager, search "Useful-Meti" (or "metixxx") and hit install; manually:
cd ComfyUI/custom_nodes
git clone https://github.com/metixxx/ComfyUI-Useful-Meti.git
Then restart ComfyUI. No requirements.txt, no extra pip packages - the README is right that it runs on ComfyUI's stock Python environment. That's genuinely rare in the custom-node world and genuinely nice.
Gotchas
The timer includes model loading. The first run after a checkpoint loads will always look slower than the second, so compare runs that have already warmed up - otherwise you'll blame the sampler for the disk's sins.
Because the time is read the moment this node executes, mid-graph, a node sitting early in a big workflow shows a partial number. End of the line, right before or after the save, is the honest placement. And since every copy of the node reads the same global stopwatch, you can't use several of them to time separate stages - for per-node numbers you'd need a real profiler, not this.
One last thing worth knowing: it's inspired by Shannooty/ComfyUI-Timer-Nodes, per the README, and it shows in the design - the passthrough makes it trivially easy to retrofit into an existing graph without rewiring anything.
The verdict: if you benchmark or tune, it's a five-second install that replaces staring at a stopwatch. If you don't care about speed, skip it - it won't make your images any better.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| input_any | * | Connect any type of data (image, text, etc.). This data will be passed through unchanged. | |
| input_string | STRING | Generation Time | Custom label to display before the time. Example: 'Render' → 'Render: 2m 34s' |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| passthrough | * | — |
| time_with_label | STRING | — |
| time_only | STRING | — |