# Various timing measurements for Prysm on Altair
## Setup
- mbp16
- 2.6GHz 6‑core 9th‑generation Intel Core i7
- 16GB
- Prysm commit: `45bfd82c8832f2da4803e73a319dfa0b3236f388`
## Definitions
* *process_epoch_process_time*: The time it takes to process [process_epoch](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#epoch-processing)
* *state_transition_process_time*: The time it takes to process [state_transition](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#beacon-chain-state-transition-function)
* *on_block_until_update_head_time*: The time it takes to process [on_block](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/fork-choice.md#on_block)
* *update_head_time*: The time it takes to update head and process [get_head](https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/fork-choice.md#get_head)
## Results
* *process_epoch_process_time* takes **80ms** to **120ms**

* *state_transition_process_time* takes **100ms** normal case and **180ms** worst case when process epoch is invovled. It means without epoch processing, `process_block` takes **>100ms**

* *on_block_until_update_head_time* takes **150ms** normal case and **350ms** worst case at epoch boundary. The **350ms** here is a good optimizaiton target

* *update_head_time* takes **60ms**

## Conclusion
- First optimization target is `on_block_until_update_head_time`.
If we compare the worst times between `on_block_until_update_head_time` and `state_transition_process_time`, there's an extra **170ms** that we can shred off.
Example:
```python=
# Update justified checkpoint
if state.current_justified_checkpoint.epoch > store.justified_checkpoint.epoch:
if state.current_justified_checkpoint.epoch > store.best_justified_checkpoint.epoch:
store.best_justified_checkpoint = state.current_justified_checkpoint
if should_update_justified_checkpoint(store, state.current_justified_checkpoint):
store.justified_checkpoint = state.current_justified_checkpoint
# Update finalized checkpoint
if state.finalized_checkpoint.epoch > store.finalized_checkpoint.epoch:
store.finalized_checkpoint = state.finalized_checkpoint
# Potentially update justified if different from store
if store.justified_checkpoint != state.current_justified_checkpoint:
# Update justified if new justified is later than store justified
if state.current_justified_checkpoint.epoch > store.justified_checkpoint.epoch:
store.justified_checkpoint = state.current_justified_checkpoint
return
# Update justified if store justified is not in chain with finalized checkpoint
finalized_slot = compute_start_slot_at_epoch(store.finalized_checkpoint.epoch)
ancestor_at_finalized_slot = get_ancestor(store, store.justified_checkpoint.root, finalized_slot)
if ancestor_at_finalized_slot != store.finalized_checkpoint.root:
store.justified_checkpoint = state.current_justified_checkpoint
```
- Second optimization target is `process_epoch`. The **120ms**