Почему Условная точка останова уменьшает скорость выполнения приложений во время отладки?

Вы могли бы немного уменьшить поля, чтобы они лучше подходили и продолжали выравнивать гибкие элементы влево с помощью justify-content: flex-start; или вместо этого вы можете использовать CSS Grid и определить необходимое gap, а также общее количество столбцов, которое вам нужно (в данном случае 3), с помощью сетки вы можете даже избежать процентных вычислений и просто сообщить каждому элементу использовать часть доступного пространства.

Самым большим преимуществом CSS Grid, я думаю, будет то, что вы избегаете напрасной траты места, которое может остаться в процентах, а также вам не нужно ничего менять в элементах, если вы хотите добавить или удалить столбцы. [ 117]

.block {
  border: 1px solid lightgrey;
  display: flex;
  flex-wrap: wrap;
  padding: 5px;
  max-width: 900px;
  justify-content: flex-start;

}

.block__item {
  background: grey;
  height: 20px;
  margin-right: 2px;
  margin-bottom: 2px;
  width: calc(33.3% - 2px);
}

.block-grid{
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-auto-rows: minmax(20px, auto);
  grid-gap: 2px;
  border: 1px solid grey;
  padding: 5px;
}

.block-grid__item{
  background-color: red;
}
<div class="block">
  <div class="block__item"></div>
  <div class="block__item"></div>
  <div class="block__item"></div>
  <div class="block__item"></div>
  <div class="block__item"></div>
</div>

<div class="block-grid">
  <div class="block-grid__item"></div>
  <div class="block-grid__item"></div>
  <div class="block-grid__item"></div>
  <div class="block-grid__item"></div>
  <div class="block-grid__item"></div>
</div>

7
задан Eric Schoonover 11 February 2009 в 08:13
поделиться

5 ответов

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

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

Я на самом деле не сижу перед VS прямо сейчас, но примерно говорю, Вы щелкаете правой кнопкой в окне точек останова и выбираете что-то как "новая точка прерывания по данным". Вы затем вводите адрес памяти и размера в байтах. Каждый раз, когда значение изменяется, Ваша контрольная точка будет стрелять. Это особенно полезно для выяснения проблем повреждения памяти.

4
ответ дан 7 December 2019 в 05:30
поделиться

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

  • решает, что точка останова является условным выражением
  • оценивает выражение
  • если выражение является ложью, отладчик продолжает выполнение
  • иначе отладчик передает управление Вам

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

2
ответ дан 7 December 2019 в 05:30
поделиться

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

if ( condition ) Debugger.Break();
2
ответ дан 7 December 2019 в 05:30
поделиться

Я предполагаю, что это - потому что это занимает время для выполнения условия. Это еще намного быстрее, чем ручное продвижение необходимого жесткого количества раз.

0
ответ дан 7 December 2019 в 05:30
поделиться

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

Это так или иначе объяснило бы, почему требуется больше времени. Но я просто предполагаю.

0
ответ дан 7 December 2019 в 05:30
поделиться
Другие вопросы по тегам:

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