Глядя на этот тест пользовательской реализации 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
Почему атрибут noinline игнорируется gcc-15.1.0 в этом примере? ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1762016715
Anonymous
Глядя на этот тест пользовательской реализации std::function: https://github.com/PacktPublishing/Hands-On-Design-Patterns-with-CPP-Second-Edition/blob/main/Chapter06/09_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();
Подробнее здесь: [url]https://stackoverflow.com/questions/79806437/why-is-attribute-noinline-ignored-by-gcc-15-1-0-in-this-example[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия