профилирование/оптимизация C++: Как получить лучше профильную гранулярность в оптимизированной функции

В дополнить полезный и эффективный ответ Марса :

PowerShell имеет две в значительной степени эквивалентные синтаксические формы для определения параметров [11109 ] - оставляя определения PSv5 + class в стороне [1] sup>:

Примечание. Для краткости списки параметров помещаются в одну строку ниже; однако обе синтаксические формы позволяют размещать отдельные параметры в отдельной строке. sup>

  • Только для функций: :

    [ 11147]
  • C / C # -подобный: a , -разделенный список объявлений переменных-параметров внутри (...) после функции [1142 ] имя и до открытия { ; Например:

    function foo ($bar, $baz) {
      # ... 
    }
    
    • Для скриптов и функционируют также , а также блоки сценариев ({ ... }, которые похожи на анонимные функции):

      • для PowerShell : , -разделенный список объявлений переменных параметров внутри param(...) , который должен быть первым оператором внутри Тело (кроме комментариев и using директив):

        # --- Script foo.ps1
        param($bar, $baz)
        
        # ...
        
        
        # --- Function
        # This example is fully equivalent to `foo ($bar, $baz) { ...` above.
        # Note that no () is needed after the function name.
        function foo {
          param($bar, $baz)
          # ...
        }
        
        # --- Script block
        & {
          param($bar, $baz)
          # ...
        } # arguments...
        

    Для краткости, следующее необязательные элементы были опущены выше:

    • В отдельных объявлениях параметров :

      • Ввод ]; например, чтобы объявить параметр $foo как тип [int] (System.Int32):

        • [int] $foo li> ul>
        • [1151 ] Атрибуты параметра , обычно, но не исключительно через атрибут [Parameter()]; среди прочего, последний определяет, является ли связанный параметр обязательным ; Например:

          • [Parameter(Mandatory=$true)] [int] $foo li> ul>
        • Выше оператора param(...) только :

          • Атрибут [CmdletBinding()], который делает функцию или сценарий расширенной , с поведением наравне с (скомпилированным) PowerShell командлеты - см. about_Functions_Advanced

        В простых (не продвинутых) скриптах и ​​функциях это также опция вообще не объявлять какие-либо параметры , при этом любые передаваемые аргументы содержатся в автоматической переменной $args , которая является регулярной Массив PowerShell ([object[]]).
        Вы даже можете комбинировать $args с объявленными параметрами: $args затем содержит только те аргументы, которые не привязаны к объявленным.

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


        Когда выбирать, какой синтаксической формы:

        • Файлы сценариев и блоки сценариев должны использовать оператор param(...) - C # -подобный синтаксис недоступен.

        • Функции могут технически использовать C # -подобный синтаксис и param(...) взаимозаменяемо , за исключением , если [ 1124] необходим атрибут, в этом случае работает только синтаксис param(...).

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

          • Кроме того, использование C # -подобного синтаксиса часто может привести к путанице в синтаксисе , когда вызывает функцию , учитывая, что командлеты PowerShell и функции вызываются как команды оболочки (без скобок, аргументы, разделенные пробелами), а не как методы C # ; например,
            foo 1 2 (или foo -bar 1 -baz 2), а не foo(1, 2)

        [1] объявления методов в class определениях должны использовать C # -подобный синтаксис, и атрибуты параметров не поддерживаются (они поддерживаются только в свойствах ). Точно так же, как методы в нативных типах .NET, методы класса также должны быть с именем с синтаксисом метода - см. этот ответ и раздел справки about_Classes . Sup> [ 11108]

6
задан Adam 8 April 2009 в 16:24
поделиться

3 ответа

If you're on linux, use oprofile. If you're on Windows, use AMD's CodeAnalyst.

Both will give sample-based profiles down to the level of individual source lines or assembly instructions and you should have no problem identifying "hot spots" within functions.

5
ответ дан 9 December 2019 в 20:48
поделиться

Для чего-то подобного я всегда использовал способ «старой школы»:

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

Если накладные расходы на функцию вызывают это не проблема, вы также можете принудительно отключить встраивание с помощью -fno-inline-small-functions -fno-inline-functions -fno-inline-functions-называемых один раз -fno-inline (I Я не совсем уверен, как эти переключатели взаимодействуют друг с другом, но я думаю они независимы). Затем вы можете использовать свой обычный профилировщик, чтобы просмотреть профиль графа вызовов и посмотреть, какие вызовы функций занимают какое количество времени.

6
ответ дан 9 December 2019 в 20:48
поделиться

Я потратил десятилетия на настройку производительности.

Люди любят свои инструменты, но я клянусь этот метод .

1
ответ дан 9 December 2019 в 20:48
поделиться
Другие вопросы по тегам:

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