Improving memory performance is of paramount importance when attempting to optimize software speed. Luckily, there are a number of techniques that can be used to increase memory efficiency. This paper examines these techniques for improving memory performance, including resolving important store forwarding problems, reducing compulsory cache misses, increasing cache efficiency, using hardware or software prefetch, utilizing non-temporal instructions, avoiding buffer conflicts, avoiding capacity issues, and moving non data dependent work to the locations of cache misses.