Как записать профилировщику?

Преобразование dict в Dataframe

data = {'col_1': [3, 2, 1, 0], 'col_2': ['a', 'b', 'c', 'd']}
pd.DataFrame.from_dict(data)

do

df.head()
14
задан Agusti-N 15 December 2008 в 16:02
поделиться

5 ответов

Я посмотрел бы на те проекты с открытым исходным кодом сначала:

Затем я посмотрел бы на JVMTI (не JVMPI)

8
ответ дан 1 December 2019 в 09:13
поделиться

Поощрение партии, не мы :)

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

Таким образом, если бы yoyu просто хотят ответы, профилировщик дал бы Вам, пойдите для одного, кто-то еще записал. Если Вы ищете интеллектуальную проблему, почему бы не делать попытку записи той?

Я записал пару для сред выполнения, которые годы представили не важный.

Существует два подхода

  • добавление чего-то к каждой функции или другому важному моменту, который регистрирует время и где это.

  • наличие таймера, уходящего регулярно и посмотревшего, где программа в настоящее время.

Версия JVMPI, кажется, первый вид - ссылка, предоставленная uzhin, показывает, что это может сообщить относительно множества вещей (см. раздел 1.3). Что заставляет выполняемые изменения делать это, таким образом, профилирование может влиять на производительность (и если Вы являетесь профильными, что было иначе очень легкой, но часто вызываемой функцией, это может ввести в заблуждение).

Если можно получить таймер/прерывание, говоря Вам, где счетчик команд был во время прерывания, можно использовать таблицу символов / отладочная информация для разработки, в какой функции это было в то время. Это предоставляет меньше информации, но может быть менее разрушительным. Немного больше информации может быть получено из обхода стека вызовов для идентификации вызывающих сторон и т.д. Я понятия не имею, возможны ли они даже в Java...

Paul.

11
ответ дан 1 December 2019 в 09:13
поделиться

Спецификация JVMPI: http://java.sun.com/j2se/1.5.0/docs/guide/jvmpi/jvmpi.html

Я приветствую Вашу храбрость и храбрость

Править: И, как отмечено пользователем Boune, JVMTI: http://java.sun.com/developer/technicalArticles/Programming/jvmti/

2
ответ дан 1 December 2019 в 09:13
поделиться

Я написал один раз, главным образом как попытку сделать «глубокую выборку» более удобной для пользователя. Когда вы делаете метод вручную, это объясняется здесь . Он основан на выборке, а не на большом количестве маленьких выборок, Вы берете небольшое количество больших выборок.

Это может сказать вам, например, что инструкция I (обычно вызов функции) стоит вам несколько процентов X общего времени выполнения, более или менее, поскольку он появляется в стеке на X% выборок.

Подумайте об этом, потому что это ключевой момент . Стек вызовов существует до тех пор, пока работает программа. Если конкретная инструкция вызова I находится в стеке X% времени, то если эта инструкция может исчезнуть, то X% времени исчезнет. Это не зависит от того, сколько раз выполнено I или сколько времени занимает вызов функции. Так что таймеры и счетчики упускают суть. И в некотором смысле все инструкции являются инструкциями вызова, даже если они вызывают только микрокод.

Сэмплер основан на предпосылке, что лучше знать адрес инструкции I с точностью (, потому что это то, что вы ищете ), чем знать число Х% с точностью. Если вы знаете, что могли бы сэкономить примерно 30% времени путем перекодирования чего-либо, действительно ли вас волнует, что вы можете потерять 5%? Вы все еще хотите исправить это. Количество времени, которое он фактически экономит, не будет больше или меньше уменьшено вашим знанием X.

Таким образом, есть возможность извлекать сэмплы из таймера, но, честно говоря, я обнаружил, что столь же полезно запускать прерывание с помощью пользователь нажимает обе клавиши Shift одновременно. Поскольку 20 сэмплов, как правило, достаточно, и таким образом вы можете быть уверены, что берут сэмплы в соответствующее время (т. Е. Не ожидая ввода пользователя), это было вполне адекватно. Другим способом было бы делать выборки, управляемые таймером, пока пользователь удерживает обе клавиши Shift (или что-то в этом роде).

Меня не беспокоило, что взятие выборок может замедлить программу, потому что целью было не для измерения скорости, но чтобы найти самые дорогие инструкции. После исправления чего-либо общее ускорение легко измерить.

Главное, что предоставил профилировщик, это пользовательский интерфейс, чтобы вы могли безболезненно просматривать результаты. То, что выходит из фазы выборки, представляет собой набор выборок стека вызовов, где каждая выборка представляет собой список адресов инструкций, где каждая инструкция, кроме последней, является инструкцией вызова. Пользовательский интерфейс был в основном так называемым «видом бабочки».

Меня не беспокоило, что взятие образцов может замедлить программу, потому что цель состояла не в том, чтобы измерить скорость, а в том, чтобы найти самые дорогостоящие инструкции. После исправления чего-либо общее ускорение легко измерить.

Главное, что предоставил профилировщик, это пользовательский интерфейс, чтобы вы могли безболезненно просматривать результаты. То, что выходит из фазы выборки, представляет собой набор выборок стека вызовов, где каждая выборка представляет собой список адресов инструкций, где каждая инструкция, кроме последней, является инструкцией вызова. Пользовательский интерфейс был в основном так называемым «видом бабочки».

Меня не беспокоило, что взятие образцов может замедлить программу, потому что цель состояла не в том, чтобы измерить скорость, а в том, чтобы найти самые дорогостоящие инструкции. После исправления чего-либо общее ускорение легко измерить.

Главное, что предоставил профилировщик, это пользовательский интерфейс, чтобы вы могли безболезненно просматривать результаты. То, что выходит из фазы выборки, представляет собой набор выборок стека вызовов, где каждая выборка представляет собой список адресов инструкций, где каждая инструкция, кроме последней, является инструкцией вызова. Пользовательский интерфейс был в основном так называемым «видом бабочки».

Главное, что предоставил профилировщик, это пользовательский интерфейс, чтобы вы могли безболезненно просматривать результаты. То, что выходит из фазы выборки, представляет собой набор выборок стека вызовов, где каждая выборка представляет собой список адресов инструкций, где каждая инструкция, кроме последней, является инструкцией вызова. Пользовательский интерфейс был в основном так называемым «видом бабочки».

Главное, что предоставил профилировщик, это пользовательский интерфейс, чтобы вы могли безболезненно просматривать результаты. То, что выходит из фазы выборки, представляет собой набор выборок стека вызовов, где каждая выборка представляет собой список адресов инструкций, где каждая инструкция, кроме последней, является инструкцией вызова. Пользовательский интерфейс был в основном так называемым «видом бабочки». У него есть текущий «фокус», который является конкретной инструкцией. Слева отображается инструкция вызова непосредственно над этой инструкцией, взятая из образцов стека. Если инструкция фокусировки является инструкцией вызова, то приведенные ниже инструкции отображаются справа, как показано на примерах. На инструкции фокуса отображается процент, который является процентом стеков, содержащих эту инструкцию. Точно так же для каждой инструкции слева или справа процент делится на частоту каждой такой инструкции. Конечно, инструкция была представлена ​​файлом, номером строки и названием функции, в которой она находилась. Пользователь мог легко изучить данные, щелкнув любую из инструкций, чтобы сделать ее новой.

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

Может быть, это не очевидно, поэтому стоит упомянуть некоторые свойства этого метода.

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

  • Обратите внимание, что это не то же самое, что дерево вызовов. Это дает вам стоимость инструкции независимо от того, сколько разных ветвей дерева вызовов она содержит.

  • Производительность пользовательского интерфейса не является проблемой, поскольку количество выборок не должно быть очень большим. Если конкретная инструкция, я в центре внимания, довольно просто определить, как сэмплы могут содержать его, и для каждой смежной инструкции, сколько сэмплов, содержащих I, также содержит соседнюю инструкцию рядом с ней.

  • Как упоминалось ранее, скорость сэмплирования не является проблемой, потому что мы не измеряем производительность, мы диагностируем. Выборка не влияет на результаты, потому что выборка не влияет на то, что делает программа в целом. Алгоритм, для выполнения которого требуется N инструкций, по-прежнему требует N инструкций, даже если он останавливается сколько угодно раз.

  • Меня часто спрашивают, как выбрать программу, которая завершается за миллисекунды. Простой ответ - обернуть его во внешнюю петлю, чтобы сделать выборку достаточно долгой. Вы можете узнать, что занимает X% времени, удалить его, получить ускорение X%, а затем удалить внешний цикл.

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

При обсуждении профилирования часто упускают момент, когда вы можете сделать это несколько раз, чтобы найти несколько проблем. Например, предположим, что инструкция I1 находится в стеке 5% времени, а I2 находится в стеке 50% времени. Двадцать образцов легко найдут I2 , но, возможно, нет I1 . Итак, вы исправляете I2 . Затем вы делаете все это снова, но теперь I1 занимает 10% времени, поэтому, вероятно, его увидят 20 образцов. Этот эффект увеличения позволяет многократно применять профилирование для достижения больших составных коэффициентов ускорения.

8
ответ дан 1 December 2019 в 09:13
поделиться

В качестве другого ответа я только что посмотрел на LukeStackwalker на sourceforge. Это прекрасный небольшой пример стека-семплера, и хорошее место для начала, если вы хотите написать профилировщик.

Вот, на мой взгляд, то, что он делает правильно:

  • Он делает выборку всего стек вызовов.

Вздох ... так близко, но так далеко. Вот что должен делать ИМО (и другие семплеры стека, такие как xPerf):

  • Он должен сохранять необработанные семплы стека. Как бы то ни было, он резюмирует на функциональном уровне, как это делает выборку. Это приводит к потере ключевой информации о номере строки, определяющей местонахождение проблемных участков вызова.

  • Не нужно брать так много выборок, если хранение для их хранения является проблемой. Так как типичные проблемы с производительностью стоят от 10% до 90%, то 20-40 образцов их достаточно достоверно покажут. Сотни образцов обеспечивают большую точность измерений, но они не увеличивают вероятность обнаружения проблем.

  • Пользовательский интерфейс должен резюмировать в терминах операторов, а не функций. Это легко сделать, если сохранить необработанные образцы. Ключевой мерой, которую необходимо приложить к утверждению, является доля содержащих его образцов. Например:

    5/20 MyFile.cpp: 326 for (i = 0; i

Это говорит о том, что строка 326 в MyFile.cpp появилась на 5 из 20 образцы, в процессе вызова strlen . Это очень важно, потому что вы можете сразу увидеть проблему и знать, сколько ускорения вы можете ожидать от ее устранения. Если вы замените strlen (s) на s [i] , он больше не будет тратить время на этот вызов, поэтому эти образцы не будут выполняться, и ускорение будет примерно на 1 / (1-5 / 20) = 20 / (20-5) = 4/3 = 33% ускорения. (Спасибо Дэвиду Торнли за этот пример кода.)

  • Пользовательский интерфейс должен иметь представление «бабочка», показывающее операторы. (Если он тоже показывает функции, это нормально, но действительно важны операторы.) Например:

    3/20 MyFile.cpp: 502 MyFunction (myArgs)
    2/20 HisFile.cpp: 113 MyFunction (hisArgs)

    5/20 MyFile.cpp: 326 для (i = 0; i

    5/20 strlen.asm: 23 ... некоторый ассемблерный код ...

В этом примере строка, содержащая оператор for , является «фокусом внимания». Это произошло на 5 образцах. Две строки над ним говорят, что в 3 из этих образцов он был вызван из MyFile.cpp: 502 , а в 2 из этих образцов он был вызван из HisFile.cpp: 113 ]. Строка под ним говорит, что на всех 5 из этих образцов он был в strlen (неудивительно). В общем, линия фокуса будет иметь дерево «родителей» и дерево «детей». Если по какой-то причине вы не можете исправить линию фокуса, вы можете пойти вверх или вниз. Цель состоит в том, чтобы найти строки, которые вы можете исправить и которые находятся на как можно большем количестве образцов.

ВАЖНО: Профилирование не следует рассматривать как нечто, что вы делаете один раз . Например, в приведенном выше примере мы получили ускорение на 4/3, исправив одну строку кода. Когда процесс повторяется, другие проблемные строки кода должны появляться на 4/3 частоты, которые они делали раньше, и, таким образом, их легче найти. Я никогда не слышал, чтобы люди говорили об итерации процесса профилирования, но это очень важно для получения большого общего ускорения.

PS Если оператор встречается более одного раза в одном образце, это означает, что имеет место рекурсия. Это не проблема. Он по-прежнему считается только одним образцом, содержащим утверждение. Стоимость выписки по-прежнему определяется долей образцов, содержащих ее.

ВАЖНО: профилирование не следует рассматривать как что-то, что вы делаете один раз . Например, в приведенном выше примере мы получили ускорение на 4/3, исправив одну строку кода. Когда процесс повторяется, другие проблемные строки кода должны появляться на 4/3 частоты, которые они делали раньше, и, таким образом, их легче найти. Я никогда не слышал, чтобы люди говорили об итерации процесса профилирования, но это очень важно для получения большого общего ускорения.

PS Если оператор встречается более одного раза в одном образце, это означает, что имеет место рекурсия. Это не проблема. Он по-прежнему считается только одним образцом, содержащим утверждение. Стоимость выписки по-прежнему определяется долей образцов, содержащих ее.

ВАЖНО: профилирование не следует рассматривать как что-то, что вы делаете один раз . Например, в приведенном выше примере мы получили ускорение на 4/3, исправив одну строку кода. Когда процесс повторяется, другие проблемные строки кода должны появляться на 4/3 частоты, которые они делали раньше, и, таким образом, их легче найти. Я никогда не слышал, чтобы люди говорили об итерации процесса профилирования, но это очень важно для получения большого общего ускорения.

PS Если оператор встречается более одного раза в одном образце, это означает, что имеет место рекурсия. Это не проблема. Он по-прежнему считается только одним образцом, содержащим утверждение. Стоимость выписки по-прежнему определяется долей образцов, содержащих ее.

Например, в приведенном выше примере мы получили ускорение на 4/3, исправив одну строку кода. Когда процесс повторяется, другие проблемные строки кода должны появляться на 4/3 частоты, которые они делали раньше, и, таким образом, их легче найти. Я никогда не слышал, чтобы люди говорили об итерации процесса профилирования, но это очень важно для получения большого общего ускорения.

PS Если оператор встречается более одного раза в одном образце, это означает, что имеет место рекурсия. Это не проблема. Он по-прежнему считается только одним образцом, содержащим утверждение. Стоимость выписки по-прежнему определяется долей образцов, содержащих ее.

Например, в приведенном выше примере мы получили ускорение на 4/3, исправив одну строку кода. Когда процесс повторяется, другие проблемные строки кода должны появляться на 4/3 частоты, которые они делали раньше, и, таким образом, их легче найти. Я никогда не слышал, чтобы люди говорили об итерации процесса профилирования, но это очень важно для получения большого общего ускорения.

PS Если оператор встречается более одного раза в одном образце, это означает, что имеет место рекурсия. Это не проблема. Он по-прежнему считается только одним образцом, содержащим утверждение. Стоимость выписки по-прежнему определяется долей образцов, содержащих ее.

другие проблемные строки кода должны появляться на 4/3 частоты, которые они делали раньше, и поэтому их будет легче найти. Я никогда не слышал, чтобы люди говорили об итерации процесса профилирования, но это очень важно для получения большого общего ускорения.

PS Если оператор встречается более одного раза в одном образце, это означает, что имеет место рекурсия. Это не проблема. Он по-прежнему считается только одним образцом, содержащим утверждение. Стоимость выписки по-прежнему определяется долей образцов, содержащих ее.

другие проблемные строки кода должны появляться на 4/3 частоты, которые они делали раньше, и поэтому их будет легче найти. Я никогда не слышал, чтобы люди говорили об итерации процесса профилирования, но это очень важно для получения большого общего ускорения.

PS Если оператор встречается более одного раза в одном образце, это означает, что имеет место рекурсия. Это не проблема. Он по-прежнему считается только одним образцом, содержащим утверждение. Стоимость выписки по-прежнему определяется долей образцов, содержащих ее.

Это не проблема. Он по-прежнему считается только одним образцом, содержащим утверждение. Стоимость выписки по-прежнему определяется долей образцов, содержащих ее.

Это не проблема. Он по-прежнему считается только одним образцом, содержащим утверждение. Стоимость выписки по-прежнему определяется долей образцов, содержащих ее.

0
ответ дан 1 December 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: