Good and smart question.
The Elapsed result of a StopWatch varies because modern computers and modern Operating Systems, even on smartphones now, unlike old Dos, are multitask.
So while you do your loop and measure it, some other software processes having software threads run at the same time, as well as the OS kernel itself.
Modern CPU are able to execute several instructions at same time: one per real core. False cores or hardware threads use a context saving system named Hyper-Threading for Intel's CPU. For example Intel sells a Core i7-4770 having 4 cores and 8 threads, two per core.
Multithreading is inside a processes. Multiprocessing is for processes. They are both multitasking. A process is the application launched and it can have some threads. Multitasking is the capacity of the CPU to execute several instructions at the same time. For example Windows 10 on modern Intels supports both multiprocessing and multithreading.
Computer multitasking
True multitasking
CPU multitasking
If you measure a loop in Dos mono-task, you'll get the same result run after run.
But in multitask OS, you should do some runs, say a dozen or a half, and take the avarage.
Hence while you measure a loop, all running processes having registered to system events receive notifications, the kernel do something, the windows explorer too, and all others running apps too... as the task manager and the CPU manage all these running processes as well as I/O interrupts like keyboard and mouse events and drive operations, and drivers like graphic outpout.
You can also read these answers which explain most of the ramp-up where early iterations are slow.
- Why does this delay-loop start to run faster after several iterations with no sleep
- Why can't my CPU maintain peak performance in HPC
Running a loop in full speed does produce various results too, and that can come from an interrupt handler happening to run or not, if you're measuring over very short intervals instead of averaging over a long run time.