Play determinism means our ability to play the game the same way with each measurement. One such example is to have the ability to script gameplay from the player's perspective (meaning developer or QA, of course, leaving it for shipping build would essentially constitute a cheat). The basic form of this can be a virtual controller – you do a test run, capturing your inputs, and later when profiling you replay the input capture thus repeating every action in exactly the same fashion. An alternative to input capture is the ability to programmatically hook into every action, which will allow manual construction of sequences that happen exactly the way required, without the need to know controls very well or depend on variable input latency.
Of course, for this to work properly, you need to start from the same state (save, level, stage, etc.) and the game logic must be deterministic (e.g. NPC doing the same actions, their spawns predetermined, if randomness is used, the seed must be the same between captures). Some games are necessarily deterministic (for example, competitive ones), but others might not have such a constraint; if that's the case, it's still advisable to be deterministic for development and testing simplicity. On the other hand, if a game doesn't have game logic determinism, our options become quite limited. One should still strive to replicate the situation on as many parameters as possible, do more measurements, and average them, as well as keep the capture length to a minimum – trying to capture the exact problematic spot.
Even if game logic is fully deterministic, the game itself as software system – almost never is. Consider starting a level 20 seconds from the game boot and 30 seconds: the memory can find itself in a different state, if there is a garbage collection, it may now fire at a different time, not to mention other processes running on the device, which also use system resources, and you have no control of. Generally, you can't do much to alleviate these problems (aside from doing every test from a clean boot, which is a good idea anyway), but if they are severe – a development task of reducing their impact is in order. For example, the garbage collector can be forced in key moments, say before a level starts, so we have a more consistent memory state, if a game is resource-constrained or has poor memory management – switching to better allocators or lifetime management can help.
If we're profiling our game in most non-trivial cases (e.g. when there isn't one large shining bottleneck), we need to capture reproducible game sequences, otherwise comparing the optimized results to the base case could get difficult (both numerically and visually when hunting for bugs). The way to achieve this differs from game to game and may require some creativity if the game is particularly badly behaved. To simplify this a little, we're seeking three co-related behaviors: play determinism, game logic determinism, and system determinism.