1

Мой код выглядит следующим образом:Оптимизирует ли собственный VBA-компилятор?

#Const debuggingEnabled = False 

Sub debugMessage(str As String) 
    #If debuggingEnabled Then 
     Debug.Print str 
    #End If 
End Sub 

Sub doThings() 
    debugMessage "test" 'Does this get optimised away, or must it be explicitly 
          'wrapped with `#If .. #End If` every time it's called 
          'if one is to avoid the jump and stack push/pop ops? 
End Sub 

оптимизации ли VBA компилятор Microsoft прочь вызовы к процедурам, которые ничего не делают? Как я могу узнать?

+0

Что такое «оптимизация» одного, однобитового, двоичного, булевского теста? Вы уверены, что это значительная часть времени выполнения? Может быть, но шансы довольно отдаленные. Перед оптимизацией сделайте некоторое профилирование, чтобы не тратить время и не беспокоиться о битах кода, которые составляют 0,0001% от вашего времени выполнения. –

+0

@ Jean-FrançoisCorbett: Ну, я хочу, чтобы какой-то отладочный вывод во время цикла повторялся много тысяч раз, но если отладка отключена, это позволит избежать дополнительных накладных расходов последующих операций перехода/стека. Как я могу профилировать VBA для определения количества дополнительных накладных расходов, связанных с такими вызовами? – eggyal

ответ

1

Обновление это от комментариев ответить:

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

Перед оптимизацией всегда выполняйте профилирование, чтобы не тратить время и не беспокоиться о битах кода, которые составляют 0,0001% от вашего времени выполнения.

У VBA нет встроенного профайлера, но есть сторонние опции, некоторые из них бесплатны. Это один, сопровождаемый поучительным чтением: Profiling and Optimizing VBA By bruce mcpherson. A DuckDuckGo search дает множество других отведений.

Итак, ответ на ваш первоначальный вопрос: Я не думаю, что VBA оптимизирует такую ​​процедуру, но я не совсем уверен, и в любом случае это, по всей вероятности, совершенно не имеет значения. Прежде чем беспокоиться об оптимизации, всегда делайте некоторые профилирования, чтобы вы могли потратить свое время мудро. После профилирования вы почти всегда обнаружите, что то, о чем вы думали, замедляет вашу программу, на самом деле очень быстро, и что-то еще является виновником.

1

AFAIK интерпретатор VBA практически не оптимизирует. Если вы проверите это в режиме отладки VBE, вы можете увидеть, как выполнение переходит к «пустующему» югу. Но я бы подумал, что дополнительные накладные расходы в любом случае будут утоплены остальной частью исполнения VBA.

+1

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

+0

У VBA нет отладочной сборки, и для проверки не существует сгенерированного собственного кода. Судя по временным тестам на очевидные вещи, такие как удаление из циклов, которые не меняются, VBA Interpreter (его не компилятор в традиционном смысле слова) практически не оптимизирует. –

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