Rule #1: Don't assume you know anything.
In the immortal words of Pogo, We have met the enemy, and he is us. Your biggest enemy in dealing with performance is by far all the little assumptions about your application you carry around inside your head. Because you designed the code, because you've worked on the operating system for years, because you did well in your college CS classes, you're tempted to believe that you understand how your application works. Well, you don't. You understand how it's supposed to work. Unfortunately, performance work deals with how things actually work, which in many cases is completely different. Bugs, design shortcuts and unforeseen cases can all cause computer systems to behave (and execute code) in unexpected, surprising ways. If you want to get anywhere with performance, you must continuously test and re-test all assumptions you have: about the system, about your components, about your code. If you're content to assume you know what's going on and never bother to prove yyou know what's going on, start getting used to saying the following phrase: I don't know what's wrong It's supposed to be fast!
That's something many of us forget - we know far less about even our own code than we think we do (BottomFeeder and the blog server have demonstrated that to me time and time again!