Optimization means different things to different people. In some situations, you might simply want your code to run as fast as possible. However, if you are writing code for an embedded system, you might prefer to optimize for code density to reduce the memory footprint of your application.
Often these optimization constraints work against each other. For example, loop-unrolling is an optimization technique that can improve performance, but this optimization comes at the expense of increased code size. The first step in optimization is deciding what you want to optimize.