powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как исходные коды библиотек включить в своей проект?
25 сообщений из 26, страница 1 из 2
Как исходные коды библиотек включить в своей проект?
    #39602634
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня появилось желание не просто вызывать уже скомпилированные методы библиотеки glibc, но и иметь возможность работать с исходным кодом этой библиотеки (для чего я уже скачал исходники). Сейчас у этого решения вижу такие плюсы:

1. При отладке можно заглянуть как реализованы методы и возможно как-то оптимизировать их под свой частный случай.
2. Появится возможность некоторые "тяжелые" методы подобным же способом вызывать из других библиотек: Сравнение библиотек
3. Библиотечный код попадет под действие оптимизирующих ключей компилятора, что может повысить производительность.
4. Имея весь код можно более полноценно использовать Profile-guided optimization
5. Можно попробовать собрать итоговый код программы другими компиляторами. Я пробовал собрать всю glibc с помощью компиляторов Clang и Intel, но это не удалось из- за ошибок (а вот gcc собрал). Так как в программе используется только часть функционала glibc, то возможно удастся собрать итоговую программу с помощью Clang и Intel.

Думаю эту идею уже многие пробовали, и мне не хочется повторно набивать их шишки. Как попроще включить исходный код glibc в проект?
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602643
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А какие "тяжелые методы" есть в glibc? qsort и strstr?
Там же в основном обертки для системных вызовов и платформенно-зависимых вещей.
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602646
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BarloneА какие "тяжелые методы" есть в glibc? qsort и strstr?
Там же в основном обертки для системных вызовов и платформенно-зависимых вещей.

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

Я привел сравнение производительности библиотек для нескольких методов. Это сравнение показывает, что не всегда glibc имеет самую лучшую производительность.
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602650
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как понимаю ты хочешь получить ускорение за счет inline кода библиотеки в твой код во время компиляции.

Не получится, т.к. то что может инлайнится уже инлайнится. Это особенность С++: если все прописано в *.h то код инлайнится, но если код в *.cpp то - нет, т.к. это отдельная единица компиляции.

Но это не критично. Уйдя от этого ты многократно не ускоришь свой код. ИМХО станет быстрее на проценты, может 10+%, но не в разы.
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602654
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TКак понимаю ты хочешь получить ускорение за счет inline кода библиотеки в твой код во время компиляции.

Не получится, т.к. то что может инлайнится уже инлайнится. Это особенность С++: если все прописано в *.h то код инлайнится, но если код в *.cpp то - нет, т.к. это отдельная единица компиляции.

Но это не критично. Уйдя от этого ты многократно не ускоришь свой код. ИМХО станет быстрее на проценты, может 10+%, но не в разы.

Про inline нигде не писал, а вот в комментариях к статье из п.4 один товарищ написал о двукратном повышении производительности. Да и п.1 может хорошо сыграть: библиотека написана "на все случаи жизни", поэтому делает кучу лишних телодвижений, которые я могу сэкономить.
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602655
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО Вместо того чтобы спрашивать про тюнинг среды решения твоей задачи, ты бы лучше задачу озвучил. Вполне возможно что есть более быстрые решения.

PS Свежий пример 21189508 7 часов 10 минут считается тоже и тем же алгоритмом что и 142 секунды у меня 21194586 . Разница в реализации, алгоритм тот же самый.
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602657
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLПро inline нигде не писал, а вот в комментариях к статье из п.4 один товарищ написал о двукратном повышении производительности. Да и п.1 может хорошо сыграть: библиотека написана "на все случаи жизни", поэтому делает кучу лишних телодвижений, которые я могу сэкономить.
inline ускоряет простые функции, т.к. полноценный вызов функции это сохранить все регистры в стэк, вызвать функцию, затем восстановить регистры. Если функция элементарная, то "сохранить/восстановить" получается очень долго по сравнению со временем работы тела функции.
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602685
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TКак понимаю ты хочешь получить ускорение за счет inline кода библиотеки в твой код во время компиляции.

Не получится, т.к. то что может инлайнится уже инлайнится. Это особенность С++: если все прописано в *.h то код инлайнится, но если код в *.cpp то - нет, т.к. это отдельная единица компиляции.

Но это не критично. Уйдя от этого ты многократно не ускоришь свой код. ИМХО станет быстрее на проценты, может 10+%, но не в разы.
дело не только в инлайне.

несмотря на порочность идеи ТС (хотя есть же Stali), стоит задуматься - почему одни и те же функции занимают или 8Мб кода, или 200к.
и очевидно, что 200к будут исполняться несколько быстрее, особенно если на процессоре небольшой кэш

хотя это все из области тонких оптимизаций...
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602728
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

мне кажется не нужно с исходниками заморачиваться, тынц

кстати, для glibc есть много альтернативных реализаций

PS: а зачем вам сишная библиотека?
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602754
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)AlekseySQL,

мне кажется не нужно с исходниками заморачиваться, тынц

кстати, для glibc есть много альтернативных реализаций

PS: а зачем вам сишная библиотека?

Спасибо, за советы по теме топика.

В предлагаемой ссылке рассматривается статическое связывание ВСЕГО glibc (и говорится что это невозможно). Но у меня нет такой задачи: я хочу всего- навсего оптимизировать несколько "горячих" функций из библиотеки, подставив их исходный код, и проведя над ним оптимизацию. А остальные вызовы glibc пусть остаются динамическими.

В частности мои "горячие" вызовы:
Vtune Amplifier__GI_____strtoll_l_internal libc.so.6 113.956s
__GI_strchr libc.so.6 73.730s
pow libm.so.6 13.097s
strtol libc.so.6 5.755s
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602794
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В настоящий момент трудность в том, чтобы сопоставить вызовам функций конкретные файлы библиотеки glibc (для включения конкретных файлов в проект).

1. При вызове методов библиотеки мы использует директивы include, указывая для нее весьма абстрактные называния. Например,
Код: plaintext
1.
#include <cstdlib>



но при распаковке исходников у меня целая папка "cstdlib", в которой куча с- файлов для нужных мне методов. Например:
Код: plaintext
1.
2.
3.
4.
5.
strtol_l.c
strtol.c
strtold_l.c
strtold_nan.c
strtold.c



Но я не вижу h- файла, который бы содержал интерфейс для метода "strtol".

2. В своем изначальном коде я НЕ использовал директиву
Код: plaintext
1.
#include <cstdlib>



, но несмотря на это для функий atoi, atol и atoll система каким-то чудом нашла библиотеку glibc и начала ее использовать (это показывает Vtune Amplifier). Как такое возможно?
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602927
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLВ предлагаемой ссылке рассматривается статическое связывание ВСЕГО glibc (и говорится что это невозможно). Он оттуда включит только используемые функции

AlekseySQLВ частности мои "горячие" вызовы:
Vtune Amplifier__GI_____strtoll_l_internal libc.so.6 113.956s
__GI_strchr libc.so.6 73.730s
pow libm.so.6 13.097s
strtol libc.so.6 5.755s
ну и зачем такую байду разводить из-за пары функций?

реализуешь сам эти функции,
алисуешь на них:
Код: plaintext
1.
2.
#define pow  my_pow  
#define strtol my_strtol 


и будет тебе счастье (возможно)
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602934
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL, но несмотря на это для функий atoi, atol и atoll система каким-то чудом нашла библиотеку glibc и начала ее использовать (это показывает Vtune Amplifier). Как такое возможно?
Есть библиотеки, которые ОС-ный загрузчик грузит в рабочий процесс всегда (файлы же ему как-то читать надо)

Например, под виндой kernel32. несложно догадаться что будет под Linux
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602935
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

$ ldd <prog>

покажет тебе что использует либа\приложуха
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602981
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kealon(Ruslan)AlekseySQL,

$ ldd <prog>

покажет тебе что использует либа\приложуха

К сожалению, так я вижу только скомпанованные в 1 файл целые бинарные библиотеки, а мне хочется увидеть отдельные h и cpp- файлы, входящие в библиотеку (так я смогу взять из библиотеки только то, что нужно).
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39602986
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL(так я смогу взять из библиотеки только то, что нужно).

Зачем тебе брать такие тривиальные функции? Они же пишутся с нуля левой пяткой.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39603026
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAlekseySQL(так я смогу взять из библиотеки только то, что нужно).

Зачем тебе брать такие тривиальные функции? Они же пишутся с нуля левой пяткой.


Я, например, не знаю как эффективно написать преобразование строки в число. Скорее всего последовательный перебор всех символов, их преобразование по таблице ASCII и суммирование различных степеней 10 - будет самым медленным решением.

Например, "184" = 1 * pow(10,2) + 8 * pow(10,1) + 4
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39603040
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЯ, например, не знаю как эффективно написать преобразование строки в число.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
long long result = 0;
for (const char* p = line; *p; p++)
{
   if (*p >= '0' && *p <= '9')
   {
     result *= 10;
     result += *p - '0';
   }
   else throw "Фигня какая-то";
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39603162
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovAlekseySQLЯ, например, не знаю как эффективно написать преобразование строки в число.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
long long result = 0;
for (const char* p = line; *p; p++)
{
   if (*p >= '0' && *p <= '9')
   {
     result *= 10;
     result += *p - '0';
   }
   else throw "Фигня какая-то";
}




Надеюсь проседание производительности будет хотя бы в 10 раз...
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39603172
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНадеюсь проседание производительности будет хотя бы в 10 раз...
Ты о чем? Это классический способ. Быстрее не бывает.
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39603237
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLkealon(Ruslan)AlekseySQL,

$ ldd <prog>

покажет тебе что использует либа\приложуха

К сожалению, так я вижу только скомпанованные в 1 файл целые бинарные библиотеки, а мне хочется увидеть отдельные h и cpp- файлы, входящие в библиотеку (так я смогу взять из библиотеки только то, что нужно).
Код: plaintext
 nm -D <prog>

это покажет какие функции используются файлом, если функцию включишь статически список будет пустой
Код: plaintext
1.
$ g++   main.cpp test.cpp -o prog
$ nm -D prog
U __cxa_atexit
w __gmon_start__
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
w _Jv_RegisterClasses
U __libc_start_main
U _ZNSolsEi
U _ZNSolsEPFRSoS_E
U _ZNSt8ios_base4InitC1Ev
U _ZNSt8ios_base4InitD1Ev
0000000000601080 B _ZSt4cout
U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
$ ldd prog
linux-vdso.so.1 => (0x00007fffe20bb000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f46940e0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4693d10000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4693a00000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4694600000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f46937d0000)

$ g++ -static main.cpp test.cpp -o prog2
$ nm -D prog2
nm: prog2: no symbols

$ ldd prog2
not a dynamic executable

а отдельные h и cpp- файлы ты не увидишь в готовом бинарнике
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39603265
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНадеюсь проседание производительности будет хотя бы в 10 раз...

А ты проверь. У меня-то Линукса с глибцем под рукой нету...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39603386
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQLНадеюсь проседание производительности будет хотя бы в 10 раз...

Оказывается я пернул в лужу! :)

При собственной реализации функции преобразования строки в число полное время выполнения программы сократилось до 43 секунд против 62 секунд для библиотечной реализации. Странно, в википедиях написано, что glibc даже ассемблерные оптимизации использует. Никогда бы не подумал, что замена библиотечных вызовов самописками может так сильно поднять производительность (теперь буду знать, что после определения профайлером "горячих" мест надо попробывать переписать их руками).

И все же вопрос остается открытым: как прицепить исходники различных библиотек? Ведь хочется просто посмотреть как там все реализовано, чтобы поднимать свой уровень, да и не все методы такие простые.
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39603422
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Продолжу самобичевание :)

Профайлер показал, что библиотечное преобразование занимало 102 секунды процессорного времени, а самописное настолько маленькое, что вовсе пропало из результатов анализа (при этом общее процессорное время сократилось на 103 секунды). При этом я проверял отладчиком: самописное преобразование работает корректно.

Народ, а почему происходит такая адовая просадка производительности при вызове библиотечных функций?

p.s. Если заглянуть в исходники glibc, то некоторые функции имеют аналоги для sse2! Никогда бы не подумал, что будет такая просадка производительности.
...
Рейтинг: 0 / 0
Как исходные коды библиотек включить в своей проект?
    #39603436
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Библиотечные функции рассчитаны на все возможные варианты использования, самописки -
обычно специализированные. Мой код выше, например, не умеет отрицательные числа, не
обнаруживает переполнение и т.д. и т.п.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как исходные коды библиотек включить в своей проект?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]