Интересный доклад про производительность и как ее правильно измерять. Доклад из введения и двух частей.

Суть первой части:

  • производительность приложения довольно сильно зависит от расположения кода и данных в памяти, разница может доходить до 40%;
  • почти любое изменение кода это расположение меняет;
  • оно еще зависит от порядка линковки, размера переменных окружения, версий библиотек, текущей директории и т.п.
  • чувак разработал инструмент, который рандомизирует расположение и позволяет понять лучше влияние изменений на производительность;
  • эксперименты показали, что -O2 и -O3 статистически неразличимы.

Суть второй части:

  • большинство профилировщиков подталкивают на оптимизацию узких мест;
  • этот подход плохо работает для многопоточных приложений;
  • вместо этого надо анализировать DAG вычислений/зависимостей, и искать места, оптимизация которых реально поможет — как будто они лежат на критическом пути в диаграмме Ганта;
  • а еще многие профилировщики измеряют время в контексте всей жизни приложения, а не функции (например, выполнения HTTP-запроса), и чувак сделал профилировщик, который позволяет измерять пропускную способность от точки до точки;
  • под конец результаты оптимизаций на основе анализа результата профилировщиков.