Я пытаюсь оптимизировать чужую программу для проекта компилятора, и у меня возникла пара вопросов.
Эта программа устанавливает блок памяти только для чтения, а затем записывает в него данные на основе ранее неизвестного ввода. Затем он перехватывает вызываемый SIGSEGV, сохраняет адрес страницы и затем разрешает запись страницы памяти. Таким образом, он может отслеживать, какие страницы были «загрязнены». Это позволяет программе избежать хранения гигабайтов ненужного места.
Мой главный вопрос: какой удар вызывает, а затем ловит SIGSEGV, стоит производительности? Это действительно поможет мне определить, помогут ли некоторые из моих идей по изменению программы или они действительно ухудшат ситуацию.
В идеале я смогу избежать использования метода SIGSEGV, используя умные методы компиляции, но я хочу определить, насколько неэффективен текущий метод в первую очередь.
Спасибо!
Вполне вероятно, что обработка случайных сбоев страниц значительно эффективнее, чем «умные методы компиляции», которые вы имеете в виду, какими бы ни были эти методы.
Конечно, единственный способ убедиться, это измерить оба.
Постскриптум Для некоторых чисел см. https://stackoverflow.com/a/10227511/367273
Других решений пока нет …