Почему встроенная функция в этом случае стоит больше времени?код следующим образом: - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь проверить, как встроенная функция сэкономит время для компилятора C ++.Поэтому я пишу демонстрационный код для проверки разницы во времени выполнения между функцией, использующей inline (f1), и другой функцией, не использующей inline (f2).Однако после теста я обнаружил, что встроенный корпус будет стоить намного дороже, чем встроенный.И я попытался изменить порядок проверки f1 и f2 в основной функции (проверка f2 стоит время), в этом случае f2 будет стоить дешевле.Поэтому, кажется, что результат всегда будет тем, что на передних часах будет стоить дороже, нет связи с inline или не inline.Почему встроенная функция в этом случае стоит больше времени?код следующий:

#include <stdio.h>
#include <time.h>
#include <iostream>
#include <sstream>
using namespace std;

inline const string& f1(const string &s1, const string &s2)
{
    return s1.size() < s2.size() ? s1 : s2;
}

const string& f2(const string &s1, const string &s2)
{
    return s1.size() < s2.size() ? s1 : s2;
}

int main ()
{
   clock_t start_t,end_t;
   char s[10]="1000";
   static int N = 100000;
   clock_t start2_t,end2_t;
   char s2[10]="1000";
   static int i =0;

   start_t = clock();
   for(i = 0;i<N;i++)
       f1("100",s);
   end_t = clock();

   start2_t = clock();
   for(i = 0 ;i<N;i++)
       f2("100",s);
   end2_t = clock();

   printf("Inline:It took %d .\n",(int)(end_t - start_t)); 
   printf("No-Inline:It took %d .\n",(int)(end2_t - start2_t)); 
}

Вот результат:

    Inline:It took 10246 .
    No-Inline:It took 9385 .

1 Ответ

0 голосов
/ 18 ноября 2018

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

/mnt/v/CLionProjects/StackOverflow/cmake-build-release/StackOverflow
Inline:It took 0 .
No-Inline:It took 0 .

Process finished with exit code 0

Отладочная сборка (неоптимизированная):

/mnt/v/CLionProjects/StackOverflow/cmake-build-debug/StackOverflow
Inline:It took 15625 .
No-Inline:It took 15625 .

Process finished with exit code 0

Оптимизированные запуски не требуют времени, потому что компиляторпризнает, что код ничего не выполняет (кроме как тратить циклы процессора).Метрики производительности сложно спроектировать, чтобы гарантировать, что они действительно тестируют то, что вы думаете, они тестируют, особенно с включенными оптимизациями.Но чаще всего требуется производительность оптимизированного кода.Если вы на самом деле не прикладываете усилий для разработки хороших тестов производительности, лучше всего часто писать код приложения и тестировать его с использованием реальных данных или верить в то, что вам говорят эксперты.Хотя я не являюсь экспертом по компиляции и генерации объектного кода, я узнал за эти годы, что советовать компилятору встроенному коду просить его отдавать предпочтение скорости по сравнению с размером, а просить компилятор не включать встроенный код -предпочитайте размер скорости.Но ни один запрос не является обязательным для компилятора.

...