Я столкнулся с проблемой, которая озадачила меня в течение длительного времени. Интересно, может ли кто-нибудь пролить свет на этот вопрос.linux .so производительность вырождается по сравнению с прямым скомпилированным исполняемым файлом
Я написал инвертированный индекс для поддержки поиска текста. Я реализовал два способа поддержки пользовательского запроса, но производительность сильно отличается.
Первый способ: скомпилировать инвертированный индекс с дополнительным тестовым файлом, который содержит основную функцию, которая поддерживает запрос пользователя.
файла: 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.
Для этого же запроса (более двух ключевых слов) время, затраченное на textSearch2, в два раза превышает время, затраченное на textSearch1.
Я тестировал множество запросов с более чем двумя ключевыми словами, но явление повторяется.
Я не мог понять, почему. Я много искал и ничего не нашел.
Пожалуйста, помогите мне, если у вас есть какие-либо идеи.
Большое спасибо.
Обратите внимание, что при компиляции исполняемого файла вам не нужно '-fPIC', этот флаг необходим только при компиляции' .o' для использования в общей библиотеке. –