Я столкнулся с проблемой, которая озадачивала меня долгое время. Интересно, кто-нибудь мог бы пролить свет на этот вопрос?
Я пишу перевернутый индекс для поддержки поиска текста. Я реализовал 2 способа поддержки пользовательских запросов, но производительность сильно отличается.
Первый способ:
скомпилируйте инвертированный индекс с дополнительным тестовым файлом, который содержит основную функцию, поддерживающую пользовательский запрос.
файл: InvertedIndex.cpp UserQuery.cpp
компиляции:
g++ -g -Wall -O3 -fPIC -o textSearch1 InvertedIndex.cpp UserQuery.cpp -I ... -L ...
Второй способ:
скомпилировать инвертированный индекс как динамическую разделяемую библиотеку, тестовый файл содержит основную функцию, связанную с динамической разделяемой библиотекой.
файл: InvertedIndex.cpp UserQuery.cpp
компиляции:
g++ -shared -fPIC -o libInveredIndex.so InvertedIndex.cpp -I ... -L ...
g++ -Wall -O3 -fPIC -o textSearch2 UserQuery.cpp -I ... -L ... -l InveredIndex
Я тестирую и textSearch1, и textSearch2 в предварительно построенном инвертированном индексном файле, и время запроса сильно отличается. Файл инвертированного индекса был загружен mmap.
Для того же запроса (более 2 ключевых слов) время, которое стоит textSearch2, вдвое больше времени, которое стоит textSearch1.
Я проверил много запросов с более чем 2 ключевыми словами, но явление повторяется.
Я не мог понять, почему. Я много искал и ничего не нашел.
Пожалуйста, помогите мне, если у вас есть идеи.
Большое спасибо.
В строке компиляции общей совместно используемой библиотеки вы не указываете -O3
переключатель оптимизации, который, вероятно, сделает вашу библиотеку менее эффективной.
В любом случае, компиляция библиотеки по отдельности и последующее связывание могут быть медленными в любом случае. Компилятор не может оптимизировать так агрессивно, как если бы он компилировал все как единое целое (например, он не мог бы встроить функции — такие как функции вызова библиотеки — что было бы иначе)
Других решений пока нет …