At one point I developed a habit of converting any recursive algorithm I was writing into a loop instead, since I knew function calls have overhead and all recursion really does is lets you use the calling stack and flow control as an invisible data structure.
Then I got a question about parsing brackets properly during an interview and wrote a loop-based parser to solve it and the guy had to fish for a bit before I remembered recursion and realized that’s the answer he was looking for. My mind just wouldn’t consider using a whole calling stack when an integer would do the trick faster.
Most times overhead is less important than readability and maintainability of code. If someone cannot read your code, they’ll mess it up far worse.
Optimisation is for bottlenecks. No point making code run in 0.01ms rather than 0.02 if it later hits at 0.7s bottleneck like file io or DB. For most things, readability is everything unless you’re developing operating systems or close to metal libraries. Many compilers will inline functions anyway so the only gain is increased suffering of colleagues and later bugs in production when it’s modified by someone else. Cognitive load is very important and why many static code analysis tools pick it up.
At one point I developed a habit of converting any recursive algorithm I was writing into a loop instead, since I knew function calls have overhead and all recursion really does is lets you use the calling stack and flow control as an invisible data structure.
Then I got a question about parsing brackets properly during an interview and wrote a loop-based parser to solve it and the guy had to fish for a bit before I remembered recursion and realized that’s the answer he was looking for. My mind just wouldn’t consider using a whole calling stack when an integer would do the trick faster.
Most times overhead is less important than readability and maintainability of code. If someone cannot read your code, they’ll mess it up far worse.
Optimisation is for bottlenecks. No point making code run in 0.01ms rather than 0.02 if it later hits at 0.7s bottleneck like file io or DB. For most things, readability is everything unless you’re developing operating systems or close to metal libraries. Many compilers will inline functions anyway so the only gain is increased suffering of colleagues and later bugs in production when it’s modified by someone else. Cognitive load is very important and why many static code analysis tools pick it up.