2016-05-11 2 views
0

Я столкнулся с проблемой, которая озадачила меня в течение длительного времени. Интересно, может ли кто-нибудь пролить свет на этот вопрос.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.

Я тестировал множество запросов с более чем двумя ключевыми словами, но явление повторяется.

Я не мог понять, почему. Я много искал и ничего не нашел.

Пожалуйста, помогите мне, если у вас есть какие-либо идеи.

Большое спасибо.

+0

Обратите внимание, что при компиляции исполняемого файла вам не нужно '-fPIC', этот флаг необходим только при компиляции' .o' для использования в общей библиотеке. –

ответ

0

В вашей общей сборке разделяемой библиотеки вы не указываете переключатель оптимизации -O3, который, скорее всего, сделает вашу библиотечную процедуру менее эффективной.

В любом случае, компиляция библиотеки раздельно, а затем связь в любом случае может быть медленнее. Компилятор не может оптимизировать так агрессивно, как если бы он компилировал все это как единый блок компиляции (например, он может не иметь возможности встроенных функций, таких как функции вызова библиотеки), что в противном случае он был бы