From a technical perspective, it's all to do with how matching (or crossing) works. Many exchanges impose a maximum tick frequency just to have an upper limit on the outgoing data.
The order book and the matching engine are usually two independent, orthogonal concepts. There's a working cycle that, at time T0
, takes a state of the order book (a snapshot if you will) and all incoming orders (a snapshot of the order queue) and feeds them to the matching engine.
An order can either result in a cross, in which case something is taken from the book, or when there's no matching cross side an order can be added to the book. Once this cycle is over, the order book (and all executions in that time slot) is disseminated again, and the working cycle can be re-run.
Just a thought experiment now: If they did process each order individually (i.e. start a new round and send the order book afterwards) then I could create a lot of noise by sending an order and its cancellation, or an order and a self-crossing order at the same time (it's called quote stuffing). Everyone could see every single state the order book goes through, in particular they will see my order coming in, only that I'm the only one knowing that this order will be cancelled moments later, and while they decide whether or not to react I can use the time to do something useful, my abusive behaviour has given me a time advantage.
The exact configuration of the time windows above depend on many factors and is often not even disclosed to the public. If you need this number because you're building a trading system and need an upper bound or so, you could check with the exchange's tech or API department.
Edit
Just to clarify, I'm talking about changes in the order book at any level (not necessarily the top level), and since most exchanges for a given price level consolidate all orders (they only show you the total quantity at that price level), they will have to report the new quantity after every round.
Also, I'm using crossing and matching synonymously.
Edit
Not from personal experience, but have a look at Algo's M2 engine (in particular their features), they demonstrate how the cycle in principle looks, but provide no figures how much time is allocated to each step (from Matching Engine Gap Fill to Gap Fill)