Part Timer (Stopwatch)
A stopwatch for your workflow, because the queue UI doesn't tell you anything
- START
- STOP
- start_passthrough
- stop_passthrough
PartTimer is exactly what it says on the tin: a stopwatch node you drop into a workflow to measure how long something between two points actually takes. Wire anything into START, wire anything into STOP, and when both have fired it prints the elapsed time to the ComfyUI console - formatted as HH:MM:SS and in raw seconds. That's the whole job, and it does it without breaking your graph.
Why would a beginner need this? Because ComfyUI's own timing is coarse - you get a per-node total in the UI, but if you want to know "how long does just the upscale stage take" or "is my VAE decode the bottleneck," a timer you can place around arbitrary sections beats staring at aggregate numbers. It's the profiling tool you build yourself when you realize the built-in one isn't granular enough.
How it works
The trick that makes it painless is the AnyType wildcard - the well-known "match anything" hack from pythongossss's nodes. The START and STOP inputs accept any data type, so you can tap any wire in your graph without type errors, and the node passes both inputs straight through untouched as start_passthrough / stop_passthrough. That means you can insert it inline - your actual data keeps flowing through the graph, and the timer just rides along.
When START first receives any non-null value, it records the wall-clock time and prints [label] Stopwatch STARTED. When STOP later receives a value, it prints the elapsed time and resets. No state leaks between runs beyond a single instance, and the label input (default "Timer") lets you run several stopwatches at once and tell them apart in the console.
The inputs that matter
- label - a name shown in every console message. If you're timing three different stages, this is what makes the output readable.
- START - wire any output here to start the clock. It doesn't have to be "the start of the pipeline" - it just has to fire before STOP.
- STOP - wire any output here to stop and print.
Outputs: start_passthrough and stop_passthrough - exact copies of whatever you fed in, so the timer never interrupts your data flow. In practice you can ignore them; the useful output is the console.
Installing it
Part of DJZ-Nodes. ComfyUI Manager → Install Custom Nodes → search DJZ-Nodes → install → restart, or:
cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/DJZ-Nodes
cd DJZ-Nodes
pip install -r requirements.txt
This one is pure Python stdlib - it doesn't touch a single dependency in the pack's requirements. If you already have DJZ-Nodes installed, PartTimer just works.
Common issues
The main thing to know: the output goes to the console/terminal, not the ComfyUI UI. Beginners wire it up, see nothing in the interface, and assume it's broken - it isn't, look at the terminal window where ComfyUI is running. Second, it measures wall-clock time from first non-null START to first non-null STOP, so if your STOP input arrives before START (or START never gets a value because a node upstream was bypassed), it never prints - make sure both sides actually fire. And because it's wall-clock, not per-execution, it includes queue and decode overhead that happens between the two taps. For "how long does stage X actually run," place the taps tight around it.
Inputs (3)
| Name | Type | Default | Description |
|---|---|---|---|
| label | STRING | Timer | — |
| STARTopt | * | — | |
| STOPopt | * | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| start_passthrough | * | — |
| stop_passthrough | * | — |