I'm always afraid to rely so heavily on profiling. A game (or any complex program) seems like a huge mess of fluctuating circumstances, where any small dynamic change can have a noticeable effect on performance. Is there a way to find the bottlenecks when the necks can morph and move around as the game state changes? In addition, newer programmers may write a lot of sluggish routines, which when used together, wouldn't create a bottleneck at all, right? Or at least not one that stands out much.
Modern processors are fast at processing. In the x86 family, each processor currently has a maximum rate of 4 CPU instructions per cycle. Internally within the OOO core some modern processors can perform upwards of 20 micro-operations per cycle. You get roughly two billion cycles per second, per processor.
All total it is something around thirty billion to sixty billion per second, depending on the exact usage. Individual CPU instructions are plentiful and cheap. The slightly bigger costs are when you need to make a round trip out to memory which takes a small number of nanoseconds.
A single instruction is almost no time. A single memory lookup is almost no time. The cost comes when you run massive loops, running through thousands of items thousands of times. Suddenly the "almost no time" gets multiplied by very large numbers and becomes "a noticeable time".
It is generally best to just write code. Don't worry too much about performance. Solve the problem using any algorithm you can think of. Then, only if performance becomes an issue, you can use a profiler to find the issues.
Over the years, most of the big problems I've seen are not the use of an errant multiplication. The problem is when programmers accidentally embed nested loop inside a nested loop inside a nested loop, with the inner-most loop requiring a lot of memory loads. Then it shows up as a blip on the profiler as something that is slightly slow.
The nearly half-century old saying that "premature optimization is the root of all evil" still applies today. That does not mean we should make intentionally bad implementations, but instead that for nearly all source code (with ad-hoc numbers suggesting between 97% to 99% of the time) performance doesn't matter. For the small <3% of the time that performance actually does matter, there are tools to help you identify exactly what needs to be changed. Usually those few changes are easy for an experienced developer to identify and correct.
Don't worry about it, just write whatever works.