Почему условные точки прерывания замедляют мою программу так?

YUI имеет среда тестирования также. Это видео из Театра Yahoo! является хорошим введением, хотя существует много основ о TDD впереди.

Эта платформа универсальна и может быть выполнена против любой библиотеки JavaScript или JS.

14
задан 6 August 2009 в 13:19
поделиться

6 ответов

В дополнение к ответу Мэйсона вы можете сделать сборку int 3 только в том случае, если программа построена с определенным условным условием отладки:

{$ifdef debug}
{$message warn 'debug breakpoint present in code'}
if <condition here> then
  asm int 3 end;
{$endif}

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

Я также включил директиву компилятора $ message, поэтому вы увидите предупреждение когда вы компилируете, чтобы вы знали, что код все еще там. Если вы сделаете это везде, где используете int 3, у вас будет хороший список мест, по которым вы можете дважды щелкнуть, чтобы перейти прямо к проблемному коду.

N @

4
ответ дан 1 December 2019 в 07:27
поделиться

Объяснения Мэйсона довольно хороши.
Его код можно было бы сделать немного более безопасным , проверив, что вы запускаете под отладчиком:

if (DebugHook <> 0) and <your specific condition here> then
  asm int 3 end;

Это ничего не сделает, когда приложение работает нормально, и остановится, если оно работает под отладчиком (независимо от того, запущено ли оно из среды IDE или прикрепленный к отладчику).
А с логическим ярлыком <ваше конкретное условие> даже не будет оцениваться, если вы не используете отладчик.

3
ответ дан 1 December 2019 в 07:27
поделиться

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

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

if <condition here> then
  asm int 3 end;

Это простая инструкция сборки, которая вручную отправляет уведомление о точке останова в ОС. Теперь вы можете оценивать свое состояние внутри программы, не переключая контексты. Просто не забудьте вынуть его снова, когда закончите с ним.

22
ответ дан 1 December 2019 в 07:27
поделиться

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

Я стараюсь временно создать другую подобную переменную (в C, но должен быть выполнимым в Delphi).

int xyzzynum = 600;
while (true) {
    doSomething();
    if (--xyzzynum == 0)
        xyzzynum = xyzzynum;
}

затем я помещаю безусловную точку останова в строку «xyzzynum = xyzzynum;» .

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

Вы можете сделать условие настолько сложным, насколько захотите.

6
ответ дан 1 December 2019 в 07:27
поделиться

Условные точки останова в любом отладчике (я просто предполагаю) требуют, чтобы процесс каждый раз переключался вперед и назад между вашей программой и отладчиком каждый раз при достижении точки останова. Этот процесс занимает много времени, но я не думаю, что вы что-то можете сделать.

1
ответ дан 1 December 2019 в 07:27
поделиться

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

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

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

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