The feed rate is a speed limit, not a promise
An F word doesn’t tell the tool how fast to move. It tells the tool how fast it’s allowed to move. Whether it ever reaches that speed depends on whether it has room. It’s the difference between a road’s speed limit and your average speed down a short street full of stop signs: the limit might be 60, but you never get near it. On a CNC, the “stop signs” are the start and end of every move and every corner.
Every move is a trapezoid
A controller can’t switch from stopped to full feed instantly. That would need infinite acceleration. So each move follows a trapezoidal velocity profile: it ramps up at the machine’s acceleration limit, cruises at the programmed feed, then ramps back down. The flat top is the only part actually running at F.
Short moves are triangles and never reach the feed
Short moves run out of room. The tool is still accelerating when it must start braking for the stop or the next corner. The profile collapses from a trapezoid into a triangle, and the peak sits below the programmed feed.
There’s a clean threshold. Starting and ending at rest, a move has to be at least
Lmin = v² / a
long to ever touch feed speed v, where a is the machine’s acceleration. Shorter than that and the peak speed is only √(a·L).
Put real numbers on it. Take a feed of F3000 (that’s 50 mm/s) and an acceleration of 500 mm/s², ordinary hobby to midrange values. The move has to be at least 50² / 500 = 5 mm just to reach F3000. A contour broken into 1 mm steps? Its peak speed is only √(500×1) ≈ 22 mm/s, about 1340 mm/min, under half the programmed feed. This is exactly why a part full of fine detail runs so much slower than feed rate math predicts: the machine spends most of its time ramping, never cruising.
Corners: the second tax
Corners take their share too. Through a direction change, the machine carries only what the corner’s geometry and its own acceleration allow, capped at
v = √(a · R)
where R is the radius the tool is turning through. A gentle, large radius curve barely slows it. A tight corner drops it close to a stop, after which it has to accelerate all over again. A true sharp corner is R → 0, which means a near complete stop.
Numbers again: with that same 500 mm/s² acceleration, a 2 mm radius corner caps the tool at √(500×2) ≈ 32 mm/s. That is about 1900 mm/min, well under the F3000 you asked for. Every corner in the program pays a version of this tax.
Why this makes cycle time impossible to guess from feed
A real program is a mix: long moves that reach feed, short moves that don’t, and corners that dip and recover. The tool’s average speed ends up well below the programmed feed, by an amount that depends entirely on the geometry and your machine’s acceleration. There’s no single fudge factor. The gap is different for every program. Path ÷ feed gives you the floor. The real run sits above it, and simulation tells you how far.
Acceleration is the real lever
Notice that a, acceleration, appears in every formula above. It sets how fast moves reach feed and how much speed survives a corner. Two machines with identical feed rates but different acceleration will post very different cycle times on the same file. The higher acceleration machine simply wastes less time ramping. It’s also why a rigid machine that can run high accelerations finishes detailed work so much faster than its feed rate alone would suggest.
See it on your own file
UltraNC plans exactly this for every move (a trapezoidal profile with corner limiting from the true local radius, or a jerk-limited S-curve if your controller works that way) using your machine’s rapid, acceleration and jerk limits. Load a file and you can watch where the tool reaches feed and where it never does, then read the cycle time that falls out of it. Nothing is uploaded, and there’s no sign up.
Common questions
Why doesn't my CNC reach the programmed feed rate?
Because it has to accelerate up to that speed and decelerate back down. On a move that's too short, or that ends at a sharp corner, the tool is still speeding up when it has to start slowing down, so it peaks below the commanded feed and never gets there.
How long does a move have to be to reach the feed rate?
Starting and ending at rest, a move needs at least v²/a of length to touch feed speed v, where a is the machine's acceleration. For example, at 50 mm/s (3000 mm/min) and an acceleration of 500 mm/s², that is 5 mm. Anything shorter peaks below the programmed feed.
Does higher acceleration lower cycle time?
Yes, often dramatically on detailed work. A machine with higher acceleration reaches feed sooner and carries more speed through corners, so two machines with the same feed rate but different acceleration can have very different cycle times on the same program.
Part of the guide: How to estimate CNC machining time from G-code
Next: How to calculate G-code run time: the method, worked line by line.