Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
У меня появилось желание не просто вызывать уже скомпилированные методы библиотеки glibc, но и иметь возможность работать с исходным кодом этой библиотеки (для чего я уже скачал исходники). Сейчас у этого решения вижу такие плюсы: 1. При отладке можно заглянуть как реализованы методы и возможно как-то оптимизировать их под свой частный случай. 2. Появится возможность некоторые "тяжелые" методы подобным же способом вызывать из других библиотек: Сравнение библиотек 3. Библиотечный код попадет под действие оптимизирующих ключей компилятора, что может повысить производительность. 4. Имея весь код можно более полноценно использовать Profile-guided optimization 5. Можно попробовать собрать итоговый код программы другими компиляторами. Я пробовал собрать всю glibc с помощью компиляторов Clang и Intel, но это не удалось из- за ошибок (а вот gcc собрал). Так как в программе используется только часть функционала glibc, то возможно удастся собрать итоговую программу с помощью Clang и Intel. Думаю эту идею уже многие пробовали, и мне не хочется повторно набивать их шишки. Как попроще включить исходный код glibc в проект? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 19:24 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
А какие "тяжелые методы" есть в glibc? qsort и strstr? Там же в основном обертки для системных вызовов и платформенно-зависимых вещей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 19:48 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
BarloneА какие "тяжелые методы" есть в glibc? qsort и strstr? Там же в основном обертки для системных вызовов и платформенно-зависимых вещей. Под "тяжелыми методами" я подразумеваю те, что занимают основной объем вычислений (возможно много раз вызываясь в циклах). Я привел сравнение производительности библиотек для нескольких методов. Это сравнение показывает, что не всегда glibc имеет самую лучшую производительность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 19:52 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
Как понимаю ты хочешь получить ускорение за счет inline кода библиотеки в твой код во время компиляции. Не получится, т.к. то что может инлайнится уже инлайнится. Это особенность С++: если все прописано в *.h то код инлайнится, но если код в *.cpp то - нет, т.к. это отдельная единица компиляции. Но это не критично. Уйдя от этого ты многократно не ускоришь свой код. ИМХО станет быстрее на проценты, может 10+%, но не в разы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 20:17 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
Dima TКак понимаю ты хочешь получить ускорение за счет inline кода библиотеки в твой код во время компиляции. Не получится, т.к. то что может инлайнится уже инлайнится. Это особенность С++: если все прописано в *.h то код инлайнится, но если код в *.cpp то - нет, т.к. это отдельная единица компиляции. Но это не критично. Уйдя от этого ты многократно не ускоришь свой код. ИМХО станет быстрее на проценты, может 10+%, но не в разы. Про inline нигде не писал, а вот в комментариях к статье из п.4 один товарищ написал о двукратном повышении производительности. Да и п.1 может хорошо сыграть: библиотека написана "на все случаи жизни", поэтому делает кучу лишних телодвижений, которые я могу сэкономить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 20:31 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
ИМХО Вместо того чтобы спрашивать про тюнинг среды решения твоей задачи, ты бы лучше задачу озвучил. Вполне возможно что есть более быстрые решения. PS Свежий пример 21189508 7 часов 10 минут считается тоже и тем же алгоритмом что и 142 секунды у меня 21194586 . Разница в реализации, алгоритм тот же самый. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 20:33 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLПро inline нигде не писал, а вот в комментариях к статье из п.4 один товарищ написал о двукратном повышении производительности. Да и п.1 может хорошо сыграть: библиотека написана "на все случаи жизни", поэтому делает кучу лишних телодвижений, которые я могу сэкономить. inline ускоряет простые функции, т.к. полноценный вызов функции это сохранить все регистры в стэк, вызвать функцию, затем восстановить регистры. Если функция элементарная, то "сохранить/восстановить" получается очень долго по сравнению со временем работы тела функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2018, 20:46 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
Dima TКак понимаю ты хочешь получить ускорение за счет inline кода библиотеки в твой код во время компиляции. Не получится, т.к. то что может инлайнится уже инлайнится. Это особенность С++: если все прописано в *.h то код инлайнится, но если код в *.cpp то - нет, т.к. это отдельная единица компиляции. Но это не критично. Уйдя от этого ты многократно не ускоришь свой код. ИМХО станет быстрее на проценты, может 10+%, но не в разы. дело не только в инлайне. несмотря на порочность идеи ТС (хотя есть же Stali), стоит задуматься - почему одни и те же функции занимают или 8Мб кода, или 200к. и очевидно, что 200к будут исполняться несколько быстрее, особенно если на процессоре небольшой кэш хотя это все из области тонких оптимизаций... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 00:55 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, мне кажется не нужно с исходниками заморачиваться, тынц кстати, для glibc есть много альтернативных реализаций PS: а зачем вам сишная библиотека? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 08:39 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 09:55 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
В настоящий момент трудность в том, чтобы сопоставить вызовам функций конкретные файлы библиотеки glibc (для включения конкретных файлов в проект). 1. При вызове методов библиотеки мы использует директивы include, указывая для нее весьма абстрактные называния. Например, Код: plaintext 1. но при распаковке исходников у меня целая папка "cstdlib", в которой куча с- файлов для нужных мне методов. Например: Код: plaintext 1. 2. 3. 4. 5. Но я не вижу h- файла, который бы содержал интерфейс для метода "strtol". 2. В своем изначальном коде я НЕ использовал директиву Код: plaintext 1. , но несмотря на это для функий atoi, atol и atoll система каким-то чудом нашла библиотеку glibc и начала ее использовать (это показывает Vtune Amplifier). Как такое возможно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 11:01 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
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. и будет тебе счастье (возможно) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 13:28 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, но несмотря на это для функий atoi, atol и atoll система каким-то чудом нашла библиотеку glibc и начала ее использовать (это показывает Vtune Amplifier). Как такое возможно? Есть библиотеки, которые ОС-ный загрузчик грузит в рабочий процесс всегда (файлы же ему как-то читать надо) Например, под виндой kernel32. несложно догадаться что будет под Linux ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 13:34 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL, $ ldd <prog> покажет тебе что использует либа\приложуха ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 13:35 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
kealon(Ruslan)AlekseySQL, $ ldd <prog> покажет тебе что использует либа\приложуха К сожалению, так я вижу только скомпанованные в 1 файл целые бинарные библиотеки, а мне хочется увидеть отдельные h и cpp- файлы, входящие в библиотеку (так я смогу взять из библиотеки только то, что нужно). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 14:13 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQL(так я смогу взять из библиотеки только то, что нужно). Зачем тебе брать такие тривиальные функции? Они же пишутся с нуля левой пяткой. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 14:25 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovAlekseySQL(так я смогу взять из библиотеки только то, что нужно). Зачем тебе брать такие тривиальные функции? Они же пишутся с нуля левой пяткой. Я, например, не знаю как эффективно написать преобразование строки в число. Скорее всего последовательный перебор всех символов, их преобразование по таблице ASCII и суммирование различных степеней 10 - будет самым медленным решением. Например, "184" = 1 * pow(10,2) + 8 * pow(10,1) + 4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 14:59 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLЯ, например, не знаю как эффективно написать преобразование строки в число. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 15:10 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovAlekseySQLЯ, например, не знаю как эффективно написать преобразование строки в число. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Надеюсь проседание производительности будет хотя бы в 10 раз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 16:21 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНадеюсь проседание производительности будет хотя бы в 10 раз... Ты о чем? Это классический способ. Быстрее не бывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 16:24 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLkealon(Ruslan)AlekseySQL, $ ldd <prog> покажет тебе что использует либа\приложуха К сожалению, так я вижу только скомпанованные в 1 файл целые бинарные библиотеки, а мне хочется увидеть отдельные h и cpp- файлы, входящие в библиотеку (так я смогу взять из библиотеки только то, что нужно). Код: plaintext это покажет какие функции используются файлом, если функцию включишь статически список будет пустой Код: plaintext 1. $ 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- файлы ты не увидишь в готовом бинарнике ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 17:34 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНадеюсь проседание производительности будет хотя бы в 10 раз... А ты проверь. У меня-то Линукса с глибцем под рукой нету... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2018, 18:01 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
AlekseySQLНадеюсь проседание производительности будет хотя бы в 10 раз... Оказывается я пернул в лужу! :) При собственной реализации функции преобразования строки в число полное время выполнения программы сократилось до 43 секунд против 62 секунд для библиотечной реализации. Странно, в википедиях написано, что glibc даже ассемблерные оптимизации использует. Никогда бы не подумал, что замена библиотечных вызовов самописками может так сильно поднять производительность (теперь буду знать, что после определения профайлером "горячих" мест надо попробывать переписать их руками). И все же вопрос остается открытым: как прицепить исходники различных библиотек? Ведь хочется просто посмотреть как там все реализовано, чтобы поднимать свой уровень, да и не все методы такие простые. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2018, 01:59 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
Продолжу самобичевание :) Профайлер показал, что библиотечное преобразование занимало 102 секунды процессорного времени, а самописное настолько маленькое, что вовсе пропало из результатов анализа (при этом общее процессорное время сократилось на 103 секунды). При этом я проверял отладчиком: самописное преобразование работает корректно. Народ, а почему происходит такая адовая просадка производительности при вызове библиотечных функций? p.s. Если заглянуть в исходники glibc, то некоторые функции имеют аналоги для sse2! Никогда бы не подумал, что будет такая просадка производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2018, 11:17 |
|
||
|
Как исходные коды библиотек включить в своей проект?
|
|||
|---|---|---|---|
|
#18+
Библиотечные функции рассчитаны на все возможные варианты использования, самописки - обычно специализированные. Мой код выше, например, не умеет отрицательные числа, не обнаруживает переполнение и т.д. и т.п. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2018, 12:46 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=22&tid=2017970]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
| others: | 274ms |
| total: | 409ms |

| 0 / 0 |
