TimerStringConcat
Stamp your runtime onto a string
- STRING
This is the payoff half of the ComfyUI Timer Nodes pack. TimerStart marks when the clock resets; TimerStringConcat is where you actually get a number back - it takes a string you already have and appends the current runtime to the end of it. No console-log scrolling, no mental stopwatch. The elapsed time just shows up on whatever you're already looking at.
Why bother with this instead of just watching the terminal
Plenty of people time their ComfyUI runs the low-tech way - eyeball the clock, check the command-line history after the fact. That works, but it disappears the moment you close the terminal, and it's useless if you're comparing five variations of a sampler setting back to back and want the number sitting right next to the result. Wiring TimerStringConcat's output into a Show Text node, or into a filename prefix, means the timing rides along with the output itself - you get "here's the image, here's what it cost" in one place. It's also common to strip nodes like this back out before sharing a workflow publicly, since a workflow bloated with extra utility nodes tends to draw the "why do you have so many custom nodes" pushback - treat it as a debugging aid for yourself, not something that has to live in the final graph.
The mechanism
TimerStringConcat has one required input, input_string (STRING) - the string you want the timing appended to. Its single output is a STRING: your original text with the runtime tacked on.
- Input:
input_string(STRING) - any text you already have, a caption, a label, a filename prefix. - Output: STRING - the same text with the current runtime appended.
The "current runtime" it appends is relative to the global timer that TimerStart resets - so this node is only meaningful downstream of an actual TimerStart that ran earlier in the execution order (see the TimerStart article for why canvas position doesn't guarantee that; you have to route data through it). If nothing upstream ever reset the timer on this run, don't expect the appended number to mean what you think it means.
Installing it
Same pack, same install, whichever article you landed on first:
- ComfyUI Manager - search "ComfyUI Timer Nodes," install.
- Manual -
cd ComfyUI/custom_nodes && git clone https://github.com/Shannooty/ComfyUI-Timer-Nodes, then restart ComfyUI.
No pip requirements, no models, no keys. It's about as low-risk an install as a custom node gets - the usual custom-node headache is dependency conflicts between packs, and there's simply nothing here to conflict with.
Where this bites
Type mismatch if you feed it non-string data. input_string is a real STRING socket, not a wildcard like TimerStart's - if you try to plug an image, latent, or number straight in, ComfyUI will refuse the connection at graph-build time. Convert to a string first (most nodes that produce text-like output, or a basic type-conversion utility node, will do).
The global-timer gotcha carries over from TimerStart. Because there's one shared clock for the whole graph, if you've got more than one TimerStart anywhere upstream, whichever one fires last (in execution order, again - not canvas position) is the one whose reset TimerStringConcat is measuring against. For a single, clean "how long did this take" number, keep it to one TimerStart per run.
It's a small, self-described WIP project. Don't expect fine control over the output format or units - the README doesn't document one, and there's no changelog or release history to check against. If the appended text isn't formatted the way you'd like, this is a two-node pack; reading its source is a five-minute job, not an archaeology project. That's genuinely one of the nicer things about a pack this size - when something's unclear, you can just go look.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| input_string | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| STRING | STRING | — |