У переважній більшості випадків вдосконалення алгоритмів мають більшу різницю, ніж поліпшення оптимізації. Алгоритми також більш портативні, ніж оптимізації низького рівня. Моя порада - дотримуватися загальних найкращих практик щодо компонування пам’яті для повторного використання кешу, уникати надмірних копій чи зв’язку, обробляти файлову систему розумним способом, а ядра з плаваючою комою мають достатню деталізацію для векторизації. Іноді цього достатньо, щоб досягти прийнятно високої частки "піку" (для цієї операції).
Завжди замальовуйте модель продуктивності для тих операцій, які ви вважаєте важливими (або які ви виявите, що вони важливі шляхом профілювання). Тоді ви можете використовувати модель продуктивності, щоб оцінити, що може налагодити високоналагоджена реалізація. Якщо ви вирішили, що прискорення варто того (стосовно інших речей, які ви могли б робити), то зробіть оптимізацію.
Мабуть, найскладнішим завданням є проектування важливих (у тому сенсі, що багато коду залежатиме від цих варіантів) інтерфейсів та структур даних, щоб потім можна було оптимізувати, не потребуючи змін API. На відміну від конкретних оптимізацій та загальних рекомендацій, я не знаю, як цього навчити, окрім досвіду. Робота з чутливим до продуктивності програмним забезпеченням з відкритим кодом допомагає. Як і у випадку будь-якого рішення API, важливо зрозуміти проблемний простір.