Size: a a a

2020 May 24

N

Neargye in pro.cxx
Dollar Føølish
Много ли вы видели однопоточных программ которым была бы полезна такая оптимизация?
Игры!
источник

v

vehlwn in pro.cxx
Dollar Føølish
Много ли вы видели однопоточных программ которым была бы полезна такая оптимизация?
- оптимизировать кубический алгоритм заменой uint32_t на uint64_t;
- оптимизировать однопоточную программу удалением локов с статик локалок.
источник

DF

Dollar Føølish in pro.cxx
В играх правда может пригодиться ?
источник

AZ

Alexander Zaitsev in pro.cxx
дело не в том, сколько процентов перфа мы выиграем от этого. а в том, что если можно что-то из программы выкинуть, при этом полностью сохранив её работоспособность - это по-хорошему надо выкинуть
источник

DF

Dollar Føølish in pro.cxx
Тогда по флажку -lpthread можно
источник

AZ

Alexander Zaitsev in pro.cxx
так как программа будет работать не медленнее, то оно пригодиться примерно везде. Где вы сможете это заметить - совсем другая история :)
источник

DF

Dollar Føølish in pro.cxx
Через Вик символ
источник

AZ

Alexander Zaitsev in pro.cxx
я знаю, почему так сделали
источник

А

Андрей in pro.cxx
Alexander Zaitsev
дело не в том, сколько процентов перфа мы выиграем от этого. а в том, что если можно что-то из программы выкинуть, при этом полностью сохранив её работоспособность - это по-хорошему надо выкинуть
че то кстати эти мьютексы на статики плохо с принципом zero cost работают
источник

AZ

Alexander Zaitsev in pro.cxx
до тех пор, пока программа сохраняет своё наблюдаемое поведение - пусть оптимайзят
источник

DF

Dollar Føølish in pro.cxx
можно слегка спросить про gdb? какая практическая польза от команды info stack если уже есть bt?
источник

DF

Dollar Føølish in pro.cxx
чет я пару раз попробовал, не увидел профитов
источник

KS

Kepler’s Supernova in pro.cxx
Судя по https://sourceware.org/gdb/current/onlinedocs/gdb/Backtrace.html, это одно и то же:

> The names where and info stack (abbreviated info s) are additional aliases for backtrace.
источник

DF

Dollar Føølish in pro.cxx
Да , спасибо что нашли
источник

ЮП

Юрий Першин... in pro.cxx
Mikhail Matrosov
нет. скорее так: если мы можем сделать переменную static constexpr, то следует это сделать
за исключением тех случаев, когда она при исполнении уже не нужна
источник

AS

Anatoly Shirokov in pro.cxx
@igor_akhmetov Andrey Игорь, Андрей, привет!

Препарирую coroutines ts в текущей реализации MSVC (Visual Studio Community 2019 16.5.5), у меня по логу фуннция-член initial_suspend промиса вызывается раньше, чем его конструктор:
[thrid][this    ]message
-------------------------------------------------------------------------------------------------------------
[26788][01335708]auto __thiscall coreturn::result_type<int>::promise_type::initial_suspend(void) entered ???
[26788][01335708]auto __thiscall coreturn::result_type<int>::promise_type::initial_suspend(void) leaved
[26788][0133573C]__thiscall tracer::tracer(struct tracer &&) noexcept entered
[26788][0133573C]__thiscall tracer::tracer(struct tracer &&) noexcept leaved
[26788][01335708]__thiscall coreturn::result_type<int>::promise_type::promise_type(void) entered ???
[26788][01335708]__thiscall coreturn::result_type<int>::promise_type::promise_type(void) leaved
код простой:
  template<typename T>
 struct result_type
 {
   struct promise_type;
   using coroutine_handle = std::experimental::coroutine_handle<promise_type>;

   result_type(coroutine_handle handle) : handle {handle}
   {
     scope_tracer _{ __FUNCSIG__, this};
   }
   result_type(result_type const&)
   {
     scope_tracer _{ __FUNCSIG__, this };
   }
   ~result_type()
   {
     scope_tracer _{ __FUNCSIG__, this };
   }
   T get() {
     scope_tracer _{ __FUNCSIG__, this };
     return handle.promise().value;;
   }
   struct promise_type {
     T value;
     promise_type() : value{  } {
       scope_tracer _{ __FUNCSIG__, this };
     }
     promise_type(tracer param) : value{ } {
       scope_tracer _{ __FUNCSIG__, this };
     }
     ~promise_type() {
       scope_tracer _{ __FUNCSIG__, this };
     }
     auto get_return_object() {
       scope_tracer _{ __FUNCSIG__, this };
       return result_type<T>{coroutine_handle::from_promise(*this)};
     }
     auto initial_suspend() {
       scope_tracer _{ __FUNCSIG__, this };
       return co_suspend_never{};
     }
     auto return_value(T v) {
       scope_tracer _{ __FUNCSIG__, this };
       logger::info("return value is ", value = v);
       return co_suspend_never{};
     }
     auto final_suspend() noexcept {
       scope_tracer _{ __FUNCSIG__, this };
       return co_suspend_never{};
     }
     void unhandled_exception() {
       scope_tracer _{ __FUNCSIG__, this };
       std::terminate();
     }
   };
   coroutine_handle handle;
 };

 result_type<int> co_return_func(tracer param)
 {
   scope_tracer _(__FUNCSIG__);
   logger::info("co_return: 42");
   co_return 42;
 }


это как-то можно объяснить?

И вопрос по поводу вызова конструктора promise_type. Если конструктор промиса принимает аргументы функции, то ведь он должен быть вызван, а не дефолтный:
promise_type(tracer param) : value{ } {
       scope_tracer _{ __FUNCSIG__, this };
     }
а MSVC требует default constructor.
источник

EP

Egor Pugin in pro.cxx
Anatoly Shirokov
@igor_akhmetov Andrey Игорь, Андрей, привет!

Препарирую coroutines ts в текущей реализации MSVC (Visual Studio Community 2019 16.5.5), у меня по логу фуннция-член initial_suspend промиса вызывается раньше, чем его конструктор:
[thrid][this    ]message
-------------------------------------------------------------------------------------------------------------
[26788][01335708]auto __thiscall coreturn::result_type<int>::promise_type::initial_suspend(void) entered ???
[26788][01335708]auto __thiscall coreturn::result_type<int>::promise_type::initial_suspend(void) leaved
[26788][0133573C]__thiscall tracer::tracer(struct tracer &&) noexcept entered
[26788][0133573C]__thiscall tracer::tracer(struct tracer &&) noexcept leaved
[26788][01335708]__thiscall coreturn::result_type<int>::promise_type::promise_type(void) entered ???
[26788][01335708]__thiscall coreturn::result_type<int>::promise_type::promise_type(void) leaved
код простой:
  template<typename T>
 struct result_type
 {
   struct promise_type;
   using coroutine_handle = std::experimental::coroutine_handle<promise_type>;

   result_type(coroutine_handle handle) : handle {handle}
   {
     scope_tracer _{ __FUNCSIG__, this};
   }
   result_type(result_type const&)
   {
     scope_tracer _{ __FUNCSIG__, this };
   }
   ~result_type()
   {
     scope_tracer _{ __FUNCSIG__, this };
   }
   T get() {
     scope_tracer _{ __FUNCSIG__, this };
     return handle.promise().value;;
   }
   struct promise_type {
     T value;
     promise_type() : value{  } {
       scope_tracer _{ __FUNCSIG__, this };
     }
     promise_type(tracer param) : value{ } {
       scope_tracer _{ __FUNCSIG__, this };
     }
     ~promise_type() {
       scope_tracer _{ __FUNCSIG__, this };
     }
     auto get_return_object() {
       scope_tracer _{ __FUNCSIG__, this };
       return result_type<T>{coroutine_handle::from_promise(*this)};
     }
     auto initial_suspend() {
       scope_tracer _{ __FUNCSIG__, this };
       return co_suspend_never{};
     }
     auto return_value(T v) {
       scope_tracer _{ __FUNCSIG__, this };
       logger::info("return value is ", value = v);
       return co_suspend_never{};
     }
     auto final_suspend() noexcept {
       scope_tracer _{ __FUNCSIG__, this };
       return co_suspend_never{};
     }
     void unhandled_exception() {
       scope_tracer _{ __FUNCSIG__, this };
       std::terminate();
     }
   };
   coroutine_handle handle;
 };

 result_type<int> co_return_func(tracer param)
 {
   scope_tracer _(__FUNCSIG__);
   logger::info("co_return: 42");
   co_return 42;
 }


это как-то можно объяснить?

И вопрос по поводу вызова конструктора promise_type. Если конструктор промиса принимает аргументы функции, то ведь он должен быть вызван, а не дефолтный:
promise_type(tracer param) : value{ } {
       scope_tracer _{ __FUNCSIG__, this };
     }
а MSVC требует default constructor.
другие компилеры не пробовал?
источник

AS

Anatoly Shirokov in pro.cxx
Egor Pugin
другие компилеры не пробовал?
не, пока MSVC
источник

IA

Igor Akhmetov in pro.cxx
Anatoly Shirokov
@igor_akhmetov Andrey Игорь, Андрей, привет!

Препарирую coroutines ts в текущей реализации MSVC (Visual Studio Community 2019 16.5.5), у меня по логу фуннция-член initial_suspend промиса вызывается раньше, чем его конструктор:
[thrid][this    ]message
-------------------------------------------------------------------------------------------------------------
[26788][01335708]auto __thiscall coreturn::result_type<int>::promise_type::initial_suspend(void) entered ???
[26788][01335708]auto __thiscall coreturn::result_type<int>::promise_type::initial_suspend(void) leaved
[26788][0133573C]__thiscall tracer::tracer(struct tracer &&) noexcept entered
[26788][0133573C]__thiscall tracer::tracer(struct tracer &&) noexcept leaved
[26788][01335708]__thiscall coreturn::result_type<int>::promise_type::promise_type(void) entered ???
[26788][01335708]__thiscall coreturn::result_type<int>::promise_type::promise_type(void) leaved
код простой:
  template<typename T>
 struct result_type
 {
   struct promise_type;
   using coroutine_handle = std::experimental::coroutine_handle<promise_type>;

   result_type(coroutine_handle handle) : handle {handle}
   {
     scope_tracer _{ __FUNCSIG__, this};
   }
   result_type(result_type const&)
   {
     scope_tracer _{ __FUNCSIG__, this };
   }
   ~result_type()
   {
     scope_tracer _{ __FUNCSIG__, this };
   }
   T get() {
     scope_tracer _{ __FUNCSIG__, this };
     return handle.promise().value;;
   }
   struct promise_type {
     T value;
     promise_type() : value{  } {
       scope_tracer _{ __FUNCSIG__, this };
     }
     promise_type(tracer param) : value{ } {
       scope_tracer _{ __FUNCSIG__, this };
     }
     ~promise_type() {
       scope_tracer _{ __FUNCSIG__, this };
     }
     auto get_return_object() {
       scope_tracer _{ __FUNCSIG__, this };
       return result_type<T>{coroutine_handle::from_promise(*this)};
     }
     auto initial_suspend() {
       scope_tracer _{ __FUNCSIG__, this };
       return co_suspend_never{};
     }
     auto return_value(T v) {
       scope_tracer _{ __FUNCSIG__, this };
       logger::info("return value is ", value = v);
       return co_suspend_never{};
     }
     auto final_suspend() noexcept {
       scope_tracer _{ __FUNCSIG__, this };
       return co_suspend_never{};
     }
     void unhandled_exception() {
       scope_tracer _{ __FUNCSIG__, this };
       std::terminate();
     }
   };
   coroutine_handle handle;
 };

 result_type<int> co_return_func(tracer param)
 {
   scope_tracer _(__FUNCSIG__);
   logger::info("co_return: 42");
   co_return 42;
 }


это как-то можно объяснить?

И вопрос по поводу вызова конструктора promise_type. Если конструктор промиса принимает аргументы функции, то ведь он должен быть вызван, а не дефолтный:
promise_type(tracer param) : value{ } {
       scope_tracer _{ __FUNCSIG__, this };
     }
а MSVC требует default constructor.
Как повторить? На таком коде https://gcc.godbolt.org/z/mkqMap 16.6 сначала вызывает конструктор.
источник

DS

Dmitry Sokolov in pro.cxx
Андрей
че то кстати эти мьютексы на статики плохо с принципом zero cost работают
Сгенерированный компилятором dclp для синглтона это как раз zero cost для многопоточки по сравнению с ручной реализацией. Выполняется один раз и после этого не стоит ровно ничего. В msvc с этой фичей долго тянули, только в 2015 вроде появилась.
источник