2013-05-04 4 views
0

Я хочу изобразить производительность небольших выражений, я решаю, что использовать. Рассмотрим приведенный ниже код. Может появиться несколько рекурсивных вызовов.Как измерить производительность небольших выражений?

void foo(void) { 
    i++; 
    if(etc(ch)) { 
    //.. 
    } 
    else if(ch == TOKX) { 
     p=1; 
     baa(); 
     c=0; 
     p=0; 
    } 
    //more ifs 
} 

Вопрос:

Recursives вызовов может случиться foo() и i должен увеличиваться только при p имеет ненулевое значение (это означает, что она будет использоваться в другой части кода) Нужно ли a if(p) i++; или оставить только i++;?

Я должен ответить на вопросы, как это, что я ищу какой-то инструмент. Кто-то может поверить, что это «потеря времени» или сказать, что «optmization - корень зла». Но для подобных случаев я не считаю, что это применимо к моей ситуации. ИМХО. Расскажите нам свое мнение, если вы думаете иначе.

«Идеальный» инструмент, способный показать, сколько времени каждый выражение взято для запуска.

Это заставляет меня думать, как отлаживается программное обеспечение в крупнейших компаниях программного обеспечения, таких как IBM, Microsoft, Sun и т. Д. Возможно, это тема для другой темы. Более полезно, что это здесь, я думаю.

Платформа: Должны быть Linux и MS-Windows.

+0

Как вы думаете, у вас есть глобальные переменные, у вас гораздо больше проблем, чем производительность одного оператора if ... –

+0

@R ..: Спасибо за комментарий. Но глобальные переменные действительно нужны. Может быть, потому что проще. Несколько функций, использующих это значение, все называют друг друга рекурсивно. Пропустить каждую копию по параметру можно было бы слишком много стека. Но поскольку вы упомянули об этом, я рассмотрю вопрос о том, будет ли удалять глобальное значение приращения производительности. – Jack

+0

Это будет «** преждевременная» оптимизация - это корень всего зла ». Оптимизация неплохая; ** преждевременная ** оптимизация - означает, что оптимизация, сделанная до того, как вы знаете, что на самом деле вызывает узкое место, - это плохо. –

ответ

2

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

Тем не менее, вот несколько мыслей:

  • избежать рекурсии, если вы можете

  • на макроуровне, что-то вроде «время» команды в Linux может сказать вам, как долго ваш приложение запущено. Поместите метод в цикл, который выполняется 10k раз и измеряет это, чтобы усреднить цифры

  • Если вы хотите измерить время, затрачиваемое на отдельные функции, профилирование - это то, что вы хотите. Для Visual Studio в Windows есть хорошие встроенные средства, но есть много, много вариантов.

http://en.wikipedia.org/wiki/List_of_performance_analysis_tools

1

Во-первых, пожалуйста, понять, какие измерения значения: есть общее время стена-часы, принятые программы, и есть процент времени, каждый оператор активен, где «активные» означает " на стеке ".

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

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

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

Смежные вопросы