SimpleTimerStart
The little node that stamps a start time on your batch
- signal
- signal
SimpleTimerStart is half of a stopwatch, and the half that does nothing but mark the moment. You drop it in your workflow, ComfyUI runs it, it stamps the current time into the pack's memory, and its one output - a signal - just passes whatever you gave it straight through. The actual numbers come out the other end, at SimpleTimerEnd, which you'll be using for most of the interesting work. This page is about what this node does, because if you only understand it as "the start button" you'll miss the placement trick that makes it useful.
What it actually does
Under the hood it writes time.time() into a module-level global the pack shares with SimpleTimerEnd. The IS_CHANGED method returns float("NaN") - the ComfyUI idiom, documented in the node-plumbing knowledge base, that forces a node to re-run every single execution instead of letting the cache skip it. A timer that let the cache decide "nothing changed, skip" would be useless, so this is the correct (and only) way to build one.
The inputs and outputs are minimal:
- signal - optional, type
*. It's a pass-through. Wire anything in and you get the same thing back, which exists so you can force ordering in the graph. - signal - the output, also
*. The only thing it does downstream is control execution order.
The placement trick
The README spells out two ways to place the Start, and they measure different things:
- Leave it unconnected. Start stamps the time when the workflow begins executing, so SimpleTimerEnd measures from the start of the whole run to the End node. Easiest, and what you want for a quick "how long is my entire generation?"
- Insert it into the middle of the graph. Wire Start's
signalinto some node partway through your pipeline - say, right before your KSampler. Because ComfyUI only runs nodes it needs, and Start only runs when something downstream actually pulls from it, the timer then covers only the stretch from that insertion point to End. This is how you time just the sampling, or just the upscale, without timing the model load.
That ordering trick is the whole reason the pass-through signal exists: the graph can't run SimpleTimerEnd before SimpleTimerStart has fired if the End is downstream of the Start's output.
Gotchas
- One shared clock. Both Start and End read the same module global. Put two Start nodes in one workflow and they fight over it - the second one overwrites the first, and your times get weird. If you want to time two different segments, run two separate workflows or time them in sequence, not side by side.
- It does not stop the clock. Start just stamps a time. The elapsed calculation lives entirely in SimpleTimerEnd, and End wants an IMAGE input. So plan your workflow so that the thing you want timed ends at an image-producing node (a preview, a save) - that's where End slots in.
Installation
No dependencies, no models to download. Install the whole pack once and you get both halves:
cd ComfyUI/custom_nodes
git clone https://github.com/sp8999/ComfyUI-Text-Utils-sp.git
Or search ComfyUI-Text-Utils-sp in ComfyUI Manager and click Install, then restart ComfyUI. Both timer nodes live in the text_utils_sp category. As with the rest of the pack, it's tuned for the Nodes 2.0 frontend - on the old v1 canvas it runs fine but widgets can render at the wrong size.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| signalopt | * | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| signal | * | — |