Q1: Які інструменти ви використовуєте для кодування профілю (профілювання, а не тестування)?
Q2: Як довго ви дозволяєте коду працювати (статистика: скільки кроків часу)?
Q3: Наскільки великі випадки (якщо справа вміщується в кеш-пам'яті, вирішувач набирає порядку на швидкість, але тоді я пропущу процеси, пов'язані з пам'яттю)?
Ось приклад того, як я це роблю.
Я відокремлюю тестування (бачачи, скільки часу потрібно) від профілювання (визначаючи, як зробити це швидше). Не важливо, щоб профілер був швидким. Важливо, щоб він підказував, що виправити.
Мені навіть не подобається слово "профілювання", тому що воно створює зображення щось на зразок гістограми, де є планка витрат на кожну процедуру, або "вузьке місце", тому що це означає, що в коді просто небагато місця. фіксований. Обидва ці речі передбачають певний час та статистику, для якої ви вважаєте, що точність важлива. Не варто відмовлятися від розуміння точності виконання часу.
Використання методу I є випадковою паузою, і є повний приклад і слайд - шоу тут . Частина світогляду профілера-вузького місця полягає в тому, що якщо ти нічого не знайдеш, нічого не знайдеш, і якщо ти щось знайдеш і отримаєш певний відсотковий прискорення, ти оголошуєш перемогу та кидаєш. Фанати Profiler майже ніколи не говорять про те, яку швидкість вони отримують, а реклама показує лише штучно надумані проблеми, розроблені так, щоб їх було легко знайти. Випадкова пауза знаходить проблеми, легкі вони чи важкі. Потім виправлення однієї проблеми викриває інші, тому процес можна повторити, щоб отримати складні прискорення.
На моєму досвіді з численних прикладів, ось як це відбувається: я можу знайти одну проблему (випадковою паузою) і виправити її, отримавши прискорення на деякий відсоток, скажімо, на 30% або 1,3х. Тоді я можу це зробити ще раз, знайти іншу проблему і виправити її, отримавши іншу швидкість, можливо менше 30%, а може і більше. Тоді я можу це зробити ще раз, кілька разів, поки справді не зможу знайти нічого іншого, щоб виправити. Кінцевим коефіцієнтом прискорення є діючий продукт окремих факторів, і він може бути дивовижно великим - порядки величини в деяких випадках.
ВСТАВЛЕНО: Просто для ілюстрації цієї останньої точки. Ось детальний приклад тут : слайд-шоу та всі файли, що показують, як було досягнуто прискорення 730x у серії усунення проблем. Перша версія займала 2700 мікросекунд на одиницю роботи. Проблема А була усунена, скоротивши час до 1800, і збільшив відсоток решти проблем у 1,5 рази (2700/1800). Потім Б видалили. Цей процес тривав через шість ітерацій, в результаті чого прискорилося майже 3 порядки. Але техніка профілювання повинна бути дійсно ефективною, оскільки якщо будь-яка з цих проблем не знайдена, тобто якщо ви потрапили в точку, коли ви неправильно вважаєте, нічого більше зробити не можна, процес зупиняється.
ВСТАВЛЕНО: Якщо говорити іншим способом, ось графік загального коефіцієнта прискорення, оскільки усуваються послідовні проблеми:
Так що для Q1 для порівняльного оцінювання достатньо простого таймера. Для "профілювання" я використовую випадкові паузи.
Q2: Я даю йому достатньо робочого навантаження (або просто поставте цикл навколо нього), щоб він працював досить довго, щоб призупинити.
Q3: Очевидно, надайте йому реально велику завантаженість, щоб ви не пропустили проблем із кешем. Вони відображатимуться як зразки в коді, що робить витяг пам'яті.