Improving application performance is an important part of the role of both software engineers and architects. both the major decisions (such as architecture, framework selection, and tools) and minor decisions (code optimization) should be addressed, but it is generally accepted that the correct order is to approach the architectural decisions first, only focusing on the implementation details once the architecture has stabilized.
This page discusses hyperthreading performance