Ваша інтуїція може вдосконалюватися з часом. Я б викинув це, можливо, трохи суперечливо, але за багато років використання VTune та CodeAnalyst, а тепер і CodeXL, я б сказав, що я набагато точніший у своїй інтуїції, ніж раніше щодо того, де будуть точки доступу, принаймні до момент, коли мене більше не впіймають цілком поза охороною, коли я профайлюю якийсь код. Це не означає, що я намагаюся оптимізувати речі наосліп.
Профілювання фактично збільшило мою залежність від профілів, а не зменшило його. Я просто кажу, що я можу з легкістю передбачити, якими будуть результати профілювання певною мірою, і, крім того, успішно усунути гарячі точки та покращити час, необхідний для завершення операції з кінцевим користувачем, не беручи сліпих ударів у темряві та відсутніх (щось, що ви може це робити навіть при використанні профайлера, поки ви не почнете розуміти не тільки те, що є гарячими точками, але і чому саме вони є гарячими точками стосовно, скажімо, пропусків кешу).
Однак я не почав вдосконалювати цю інтуїцію лише тоді, коли я почав використовувати профілі. Однією з причин є те, що якщо ви добре знайомі зі своїм кодом, ваші переслідування можуть бути правильними щодо найбільших і найбільш очевидних точок доступу, але не всіх тонкощів між ними. Природно, якщо у вас є операція, що займається користувачем, яка займає одну годину, і є один розкиданий квадратичний алгоритм складності, який обробляє вхід, що охоплює сто тисяч елементів, ви, напевно, зможете отримати багатий азартний ігровий накопичувач протягом усього життя, думаючи, що це квадратична складність алгоритм тут винен. Але це не дає вам детального розуміння або, скажімо, повідомляє саме те, що не сприяє часу.
Настільки велике значення має бути, коли ви починаєте профілювати і бачити, де всі речі, які ви думали, що могли бути більшими учасниками часу, не сприяли багато часу; не зенітні очевидні джерела неефективності, але ті, у яких ви підозрювали, могли бути дещо неефективними, але після профілювання, усвідомлюючи, що вони ледве не сприяли будь-якому часу. І це потенційно там, де ви отримуєте найінтуїтивніше розуміння - це виявити себе неправильним у всіх тих тонких областях, де не очевидно, скільки саме часу витрачається.
Інтуїція людини поза очевидною алгоритмічною складністю часто починається невірно, оскільки те, що ефективно для машини і те, що є ефективним для людського розуму, дуже відрізняється. Спочатку не так інтуїтивно думати про ієрархії пам'яті, що переходять від регістрів до кешу процесора до DRAM на диск. Інтуїтивно не думати, що надмірна арифметика може бути швидшою, ніж робити більше розгалужень або доступу до пам'яті оглядової таблиці, щоб пропустити якусь обробну роботу. Ми схильні думати з точки зору того, як багато роботи потрібно зробити, знижуючи такі речі, як вартість прийняття рішень та завантаження пам'яті та магазини. Те, що є ефективним для апаратного забезпечення, часто є дуже інтуїтивно зрозумілим, щоб порушити всі ваші людські припущення, починаючи з початку,
Удосконалення цієї інтуїції може допомогти за допомогою профілювання інтерфейсу . Дизайн інтерфейсу дуже дорого змінюється заднім числом, при цьому витрати збільшуються пропорційно кількості місць залежно від інтерфейсу. Коли ви почнете вдосконалювати свою інтуїцію, ви можете вперше почати конструювати інтерфейси краще таким чином, що залишає місця для подальшої оптимізації без дорогих змін дизайну. Знову ж таки, ця інтуїція - це те, що ти, як правило, розвиваєш, і продовжуєш розвиватись нескінченно, завжди маючи в руках цей профілер.