Почему атрибут noinline игнорируется gcc-15.1.0 в этом примере?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему атрибут noinline игнорируется gcc-15.1.0 в этом примере?

Сообщение Anonymous »

Глядя на этот тест пользовательской реализации std::function: https://github.com/PacktPublishing/Hand ... function.C
Я попытался воспроизвести пример и заметил, что, несмотря на объявление этой простой функции, вот так: __attribute__((noinline)) auto function_no_inline(int a, int b, int c, int d) -> int { return a + b + c + d; , время, которое это потребовало, было таким же, как и для встроенной функции, но оно было намного больше, если функция была фактически определена в другом модуле компиляции. Кажется, атрибут по какой-то причине был проигнорирован. Почему? Аргументы получаются из rand().
Benchmark Time CPU Iterations
-----------------------------------------------------------------------
BM_invoke_function 1.35 ns 1.35 ns 504544141
BM_invoke_function_no_inline 0.271 ns 0.271 ns 2584830443
BM_invoke_function_inline 0.270 ns 0.270 ns 2580073503
BM_invoke_std_function 2.21 ns 2.17 ns 324669753

Это мой код. Он связан с библиотекой тестов Google

#include

#include

auto function(int a, int b, int c, int d) -> int;

__attribute__((noinline)) auto function_no_inline(int a, int b, int c, int d) -> int { return a + b + c + d; }

inline auto function_inline(int a, int b, int c, int d) { return a + b + c + d; }

template
auto invoke(int a, int b, int c, int d, const Callable& callable)
{
return callable(a, b, c, d);
}

// Benchmarks
void BM_invoke_function(benchmark::State& state)
{
int a{rand()};
int b{rand()};
int c{rand()};
int d{rand()};

for (auto _ : state)
{
benchmark::DoNotOptimize(invoke(a, b, c, d, function));
benchmark::ClobberMemory();
}
}

void BM_invoke_function_no_inline(benchmark::State& state)
{
int a{rand()};
int b{rand()};
int c{rand()};
int d{rand()};

for (auto _ : state)
{
benchmark::DoNotOptimize(invoke(a, b, c, d, function_no_inline));
benchmark::ClobberMemory();
}
}

void BM_invoke_function_inline(benchmark::State& state)
{
int a{rand()};
int b{rand()};
int c{rand()};
int d{rand()};

for (auto _ : state)
{
benchmark::DoNotOptimize(invoke(a, b, c, d, function_inline));
benchmark::ClobberMemory();
}
}

void BM_invoke_std_function(benchmark::State& state)
{
int a{rand()};
int b{rand()};
int c{rand()};
int d{rand()};

std::function std_function{function};

for (auto _ : state)
{
benchmark::DoNotOptimize(invoke(a, b, c, d, std_function));
benchmark::ClobberMemory();
}
}

BENCHMARK(BM_invoke_function);
BENCHMARK(BM_invoke_function_no_inline);
BENCHMARK(BM_invoke_function_inline);
BENCHMARK(BM_invoke_std_function);

BENCHMARK_MAIN();


Подробнее здесь: https://stackoverflow.com/questions/798 ... is-example
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»