2015-01-13 3 views
3

Я профилирую код C++ с callgrind. Это мой первый раз. Я нахожу, что функция наивысшего уровня (тот, который, как я предполагаю, вызывает все снимки для запуска программы), называется _dyld_start. Мне интересно, что это такое.Что означает «_dyld_start» в моих профилирующих результатах?

Кроме того, на некоторых моих программах, которые занимают много времени, моя функция main() занимает около 99% времени всех функций, вызываемых _dyld_start; однако в моей программе, которая занимает более короткое время (примерно полсекунды), я нахожу, что main() занимает около 85% времени _dyld_start, остальное - dyldbootstrap::start(). Я предполагаю, что это функция, связанная с запуском C++-программы. Является ли разумным, чтобы он принимал 85% от времени работы _dyld_start?

Я компилирую свой код, используя стандарт C++ 11. Я компиляции на моем OS/X, поэтому я использую clang. Моя версия valgrind составляет 3.10.0.

+0

« Разве разумно, что это займет 85% времени работы _dyld_start? » - да, если ваша программа очень короткая (hello world или 'return 0') или, скорее, короткая, и хочет, чтобы динамический компоновщик загружал много разделяемых библиотек (зависит от всех графических + openGL libs, создает пустые окна и сразу же закрывает их). Если это 85% одной десятой секунды, это все еще небольшое значение. Если вы хотите иметь меньше времени - не запускайте новый исполняемый файл очень часто, используйте потоки или более длительные процессы и общайтесь с ними. – osgx

ответ

2

Joshua, любая функция high main является частью поддержки времени выполнения C (в широком смысле); и если имя таких функций включает «ld» или «dyld» - они являются частью dynamic linker.

OSX не поддерживает статически связанные приложения (https://stackoverflow.com/a/5259427/196561), поэтому каждый исполняемый файл не может быть загружен без необходимых разделяемых библиотек. dynamic linker загружает исполняемый файл, анализирует его для необходимых разделяемых библиотек и загружает их. Затем компоновщик должен связывать библиотеку и исполняемый файл вместе (заполняя/редактируя некоторые таблицы в памяти), и только после этого он может передать управление в точку ввода CRT, а затем до main.

"Выполнение Mach-O файлов", https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachOTopics/1-Articles/executing_files.html

Маха-О исполняемый файл содержит заголовок, состоящий из набора команд нагрузки. Для программ, использующих общие библиотеки или фреймворки, одна из этих команд указывает местоположение компоновщика, который будет использоваться для загрузки программы. Если вы используете Xcode, это всегда/usr/lib/dyld, стандартный динамический компоновщик OS X.

Dyld люди (перечислены некоторые отладочные переменные для отладки dyld работы): https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/dyld.1.html

Сообщения о dyld: https://www.mikeash.com/pyblog/friday-qa-2012-11-09-dyld-dynamic-linking-on-os-x.html 2012-11-09: dyld: Dynamic Linking на OS X по Гвиннам Raskind ("Что dyld do, во всяком случае? »)