Nodes/Ultra Tools/Ultra Tools Workflow Timer
ComfyUI Node

Ultra Tools Workflow Timer

A stopwatch for your workflow that remembers the last 100 runs

By Yamoon-jjang·Created 14 days ago·Updated 9 days ago· 5
Ultra Tools Workflow Timer
      ◄TimeIdle►
      ◄History ►

      The actual problem

      You change one thing - a sampler, a scheduler, a quant, --fast on the launch flags - and you want to know whether it helped. ComfyUI gives you a progress bar and a console line, both of which vanish the moment your attention does. So you end up with a phone stopwatch and vibes.

      Ultra Tools Workflow Timer is a node that times the run and keeps score. Drop it on the canvas, no wires, and it shows elapsed time live while the prompt executes, then appends the result to a history list with a run count and an average. Last 100 runs, per workflow.

      That's the whole value proposition: a number you can compare against the last number, without leaving the app or trusting your memory of what "it felt faster" means.

      How it works

      Almost entirely in the browser, which is why it needs no inputs.

      The Python class is a stub - RETURN_TYPES = (), run() returns an empty tuple, OUTPUT_NODE = True. Declaring it an output node is what keeps it in the execution pass: ComfyUI prunes nodes that don't contribute to an output, so an inert node without that flag would never be visited. The Time and History values you see are widgets the backend has to declare, but nothing ever writes them from Python.

      The work is in web/workflow_timer.js. It hooks the prompt server's websocket events and drives the display: the elapsed clock updates ten times a second, and there's a one-second watchdog so a stalled or cancelled run can't leave a timer counting forever. When the run finishes, it formats a line into the history widget - timestamp, duration - and recalculates count and average. The history is stored in the node's widget values, which means it lives in the workflow file: save the workflow and the history comes back with it, on any machine.

      The two widgets

      Time - a single-line string, default Idle. It's the live clock. You don't type in it.

      History - a multiline string, the run log plus the summary. Also read-only in practice.

      No outputs, nothing to connect. Placement is irrelevant; put it where the bottom corner of your canvas doesn't have anything important.

      Install

      cd ComfyUI/custom_nodes
      git clone https://github.com/Yamoon-jjang/comfyui-Ultra-Tools
      

      Or ComfyUI Manager → Ultra Tools. Restart and Ctrl+F5, and the hard refresh matters here - the entire node is one JS module, so a cached bundle gives you a node with two dead text boxes in it. requirements.txt installs nothing.

      If an older standalone comfyui-Ultra-* pack is still present, remove it. The unified pack registers the same node class names and duplicates are confusing in a way that costs an hour.

      Reading the number honestly

      Elapsed time is wall-clock for the run, not GPU time. It includes model loading if the model wasn't resident, VAE decode, and any queue wait between the start event and the finish. Two runs of "the same workflow" can differ by a factor of two purely because the first one had to pull 12 GB off disk. Run twice, compare the second and third.

      A cached run is instant and tells you nothing. If nothing actually re-executed, the timer dutifully reports a couple of hundred milliseconds. Great for confirming that changing a prompt re-ran everything, useless as a benchmark.

      It's per workflow, not per model. The README's recommended use - comparing before/after a sampler or resolution change - works because you're timing the same graph. Compare across graphs and you're measuring the graph, not the tweak.

      Don't expect it to survive a crash. History is saved with the workflow, so it's exactly as durable as your last Ctrl+S.

      There's no fancier version of this in core, and the alternatives are console timestamps and third-party benchmark nodes with more moving parts. For the question "was that faster?", this is the right size of tool - it's also, unavoidably, the one node in the pack that does nothing on its own.

      CategoryUltra Tools

      Inputs (2)

      NameTypeDefaultDescription
      TimeSTRINGIdle—
      HistorySTRING —

      Outputs (0)

      No outputs