C ++ 11 рдореЗрдВ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп

рдЕрдЪреНрдЫреЗ рджрд┐рди, рдореИрдВ рдЕрдкрдиреА рдЫреЛрдЯреА рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред

рдореИрдВ C / C ++ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХрд╛рдордХрд╛рдЬреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдореИрдВ C ++ 11 рдорд╛рдирдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рдордИ рдХреА рдЫреБрдЯреНрдЯрд┐рдпрд╛рдВ рдЖрдИрдВ, рдЦрд╛рд▓реА рд╕рдордп рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдФрд░ рдореИрдВрдиреЗ рдЗрд╕ рдирд┐рд╖рд┐рджреНрдз рдлрд▓ рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдЪреАрдЬ рдЕрднреНрдпрд╛рд╕ рд╣реИред рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдкрд░ рд▓реЗрдЦ рдкрдврд╝рдирд╛ рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рдкрдврд╝рдирд╛ рд╕рд┐рдЦрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯреА рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░реЗрдВ рдЬреЛ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ std :: future, std :: async рдФрд░ рдЗрддрдиреЗ рдкрд░ рд╣реИред рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕рдорд╛рди рдХреБрдЫ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдФрд░ рдЕрдкрдиреЗ рд╕рд┐рд░ рдХреЗ рд╕рд╛рде рд▓реИрдореНрдмреНрдбрд╛ рдХрд╛рд░реНрдпреЛрдВ, рдереНрд░реЗрдбреНрд╕ рдФрд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЙрддрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдереАред рдЫреБрдЯреНрдЯрд┐рдпрд╛рдВ рд╕рд╛рдЗрдХрд┐рд▓ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдордп рд╣реИред





рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдореИрдВрдиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдореЗрд░рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛ред

рдереНрд░реЗрдб рдХреА рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдкреВрд▓ рд╣реИред

рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдореЗрдВ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВред

рдХрд╛рд░реНрдп рд╕реЗ рд╣реА, рдЖрдк рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдмрд╕ рдЗрд╕рдХреЗ рдХрд╛рдо рдХреЗ рдЕрдВрдд рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:



... act::control control(N_THREADS); auto some_task = act::make_task([](std::vector<double>::const_iterator begin, std::vector<double>::const_iterator end) { double sum = 0; for (auto i = begin; i != end; ++i) { sum+=(*i); } return sum; } , data.begin(), data.end()); control << some_task; cout << some_task->get() << endl; ...
      
      







рдЯрд╛рд╕реНрдХ рдХреНрд▓рд╛рд╕


рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:



 template <typename T> class task : public task<decltype(&T::operator())> { }; template <typename ClassType, typename ReturnType, typename ... Args> class task<ReturnType(ClassType::*)(Args...) const> { protected: const ClassType &m_func; std::tuple<Args...> m_vars; ReturnType m_return; public: task(const ClassType &v, Args... args): m_func(v), m_vars(args ...) {} virtual ~task() {} private: };
      
      







рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдПрдХ рд▓рд╛рдВрдмрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдСрдкрд░реЗрдЯрд░ () рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рдирдХрд╛рд░ рд╡рд░реНрдЧ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рд╡рд░реНрдЧ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИ, рдЗрд╕рдХрд╛ рдкреНрд░рдХрд╛рд░ рдлрд╝рдирд░реЗрдЯрд░ рдСрдкрд░реЗрдЯрд░ рдФрд░ рдЯреА :: рдСрдкрд░реЗрдЯрд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╕реЗ рдирд┐рдХрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрд▓рд╛рд╕ рдПрдХ рдлрд╝рд╛рдЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ, std :: tuple рдФрд░ рдПрдХ рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред



рддреЛ рдЕрдм рд╣рдо рд▓реИрдореНрдмрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрдЯреЛрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдм рд╣рдореЗрдВ рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, m_vun рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде m_func рдкрд░ opertator () рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред

рд╢реБрд░реБрдЖрдд рд╕реЗ, рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдерд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди Google рдХреЗ рдмрдврд╝рддреЗ рдЙрдкрдпреЛрдЧ рдФрд░ рджреВрд╕рд░реА рдХрдбрд╝реА рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкрд░рд┐рдгрд╛рдо рдЖрдпрд╛:



  template<int ...> struct seq { }; template<int N, int ...S> struct gens : gens<N-1, N-1, S...> { }; template<int ...S> struct gens<0, S...> { typedef seq<S...> type; };
      
      







рдЗрд╕ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдирд┐рдореНрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрдХреНрд╖рд╛ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:



  ... public: void invoke() { ReturnType r = caller(typename gens<sizeof...(Args)>::type()); } private: template<int ...S> ReturnType caller(seq<S...>) const { return m_func(std::get<S>(m_vars) ...); } ...
      
      







рдХрд╛рд░реНрдп рдХрд╛ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ


рдЕрдм рд╣рдо рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:



  class abstract_task { protected: mutable std::mutex m_mutex; mutable std::condition_variable m_cond_var; mutable bool m_complete; public: abstract_task(): m_complete(false) {} virtual ~abstract_task() {} virtual void invoke() = 0; virtual void wait() const { std::unique_lock<std::mutex> lock(m_mutex); while (!m_complete) { m_cond_var.wait(lock); } } };
      
      





рдХрдХреНрд╖рд╛ рдореЗрдВ рдПрдХ рдореНрдпреВрдЯреЗрдХреНрд╕ рдФрд░ рдПрдХ рд░рд╛рдЬреНрдп рдЪрд░ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдХрд╛рд░реНрдп рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╣рдорд╛рд░реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╡рд░реНрдЧ рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рднреБрдЧрддрдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕реЗ рдореИрдВ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╕реНрд░реЛрдд рдХреЛрдб рдЧрд┐рддреБрдм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред



рдирд┐рд░реНрдорд╛рдг рдХрд╛рд░реНрдп


рдЖрдЗрдП рдХрд╛рд░реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдХрд╛рд░реНрдп рдХрд░реЗрдВ:



  template <typename T, typename ... Args> std::shared_ptr<task<decltype(&T::operator())>> make_task(T func, Args ... args ) { return std::shared_ptr<task<decltype(&T::operator())>>(new task<decltype(&T::operator())>(func, args ...)); }
      
      





рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓ рдХреНрд▓рд╛рд╕ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ рдФрд░ рд╣рдо рдЗрд╕реЗ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рди рдХреЗрд╡рд▓ рдПрдХ рдкреЙрдЗрдВрдЯрд░, рдмрд▓реНрдХрд┐ рдПрдХ рд╕реНрдорд╛рд░реНрдЯ рдкреЙрдЗрдВрдЯрд░ред



рдкреНрд░рдмрдВрдзрди рд╡рд░реНрдЧ


рдЕрдм рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЗрдХрд╛рдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

рдореИрдВ рдХреЗрд╡рд▓ рдХреЛрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рджреВрдВрдЧрд╛:



 ... class control { std::deque<std::shared_ptr<abstract_task>> m_tasks; std::vector<std::thread> m_pool; std::mutex m_mutex; std::condition_variable m_cond_var; std::condition_variable m_empty_cond; std::atomic<bool> m_run; std::vector<bool> m_active; public: control(std::size_t pool_size = 2) { m_run.store(true, std::memory_order_relaxed); auto func = [this](int n) { while (m_run.load(std::memory_order_relaxed)) { std::unique_lock<std::mutex> lock(m_mutex); m_active[n] = true; if (m_tasks.empty()) { m_empty_cond.notify_all(); m_active[n] = false; m_cond_var.wait(lock); } else { std::shared_ptr<abstract_task> t = m_tasks.front(); m_tasks.pop_front(); lock.unlock(); t->invoke(); lock.lock(); m_active[n] = false; } } }; pool_size = pool_size > 0 ? pool_size : 1; m_active.resize(pool_size, false); for(std::size_t i = 0; i < pool_size; ++i) { m_pool.emplace_back(func, i); } } ...
      
      







рдордЬрд╝реЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдирдП рдорд╛рдирдХ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдЖрд╡реЗрджрди рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЙрдЪрд┐рдд рдард╣рд░рд╛ рд╕рдХрддрд╛ рдерд╛ред

рдпрд╣ рд╡рд░реНрдЧ рдмрд╛рд▓ рдзрд╛рдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдбреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдФрд░ рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕реНрдЯреЗрдЯ рд╡реЗрд░рд┐рдПрдмрд▓реНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рддрд╛ рд╣реИред

рдмрдЪреНрдЪреЗ рдХреЗ рдзрд╛рдЧреЗ рдХрд╛ рдореБрдЦреНрдп рд▓реВрдк рдПрдХ рдкрд░рдорд╛рдгреБ рдЪрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдЗрд╕реЗ рдЕрд╕реНрдерд┐рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдИ рджреМрдбрд╝ рд░рд╛рдЬреНрдп рдирд╣реАрдВ рд╣реИ, рдореБрдЦреНрдп рдзрд╛рдЧрд╛ рдХреЗрд╡рд▓ рдЗрд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ рдмрдЪреНрдЪреЗ рдХреЗрд╡рд▓ рдЗрд╕реЗ рдкрдврд╝рддреЗ рд╣реИрдВ)



рдЙрддреНрдкрд╛рджрдХрддрд╛


рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдпрджрд┐ рдпрд╣ рдореЗрд░реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдереЗ std :: async рдХреА рддреБрд▓рдирд╛ рдореЗрдВред

рд╡рд┐рдиреНрдпрд╛рд╕:

рдЗрдВрдЯреЗрд▓ рдХреЛрд░ (TM) i7-2600 CPU @ 3.40GHz

$ рдЬреАрд╕реА --version

рдЬреАрд╕реАрд╕реА (рдбреЗрдмрд┐рдпрди 4.8.2-21) 4.8.2





рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдЬреЛрдбрд╝ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕рднреА рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЬреЛрдбрд╝ рд╣реЛрддреЗ рд╣реИрдВред рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реЛрдЧрд╛:

res = sum (array) * N_P




рд╕рдВрдЦреНрдпрд╛ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдореЗрдВ рд╣реИрдВред



рдкрд░реАрдХреНрд╖рдг 1


рдЕрдиреБрдХреВрд▓рди рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 100,000,000 рд╣реИ, рдЙрддреНрдкрдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 73 рд╣реИ, рдкреВрд▓ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 6 рд╣реИ

рдкрд░рд┐рдгрд╛рдо:

test_act 16775 рдареАрдХ рд╣реИ

test_async 16028 рдареАрдХ рд╣реИ


рдкреНрд░рджрд░реНрд╢рди рддреБрд▓рдиреАрдп рд╣реИред



рдкрд░реАрдХреНрд╖рдг реи


рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 100,000,000 рд╣реИ, рдЙрддреНрдкрдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 73 рд╣реИ, рдкреВрд▓ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 6 рд╣реИ

рдкрд░рд┐рдгрд╛рдо:

test_act 1597.6 рдареАрдХ рд╣реИ

test_async 2530.5 рдареАрдХ рд╣реИ


рдореЗрд░рд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдбреЗрдврд╝ рдЧреБрдирд╛ рддреЗрдЬ рд╣реИред



рдкрд░реАрдХреНрд╖рдг рей


рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 100,000,000 рд╣реИ, рдЙрддреНрдкрдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 73 рд╣реИ, рдкреВрд▓ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 7 рд╣реИ

рдкрд░рд┐рдгрд╛рдо:

test_act 1313.1 рдареАрдХ рд╣реИ

test_async 2503.7 рдареАрдХ рд╣реИ




рдЯреЗрд╕реНрдЯ 4


рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рд╣реИ, рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 100,000,000 рд╣реИ, рдЙрддреНрдкрдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 73 рд╣реИ, рдкреВрд▓ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 8 рд╣реИ

рдкрд░рд┐рдгрд╛рдо:

test_act 1402 рдареАрдХ рд╣реИ

test_async 2492.2 рдареАрдХ рд╣реИ




рдкрд░реАрдХреНрд╖рдг рел


рдЕрдиреБрдХреВрд▓рди рд╕рдХреНрд╖рдо рд╣реИ, рд╕рд░рдгреА рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 100,000,000 рд╣реИ, рдЙрддреНрдкрдиреНрди рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ 173 рд╣реИ, рдкреВрд▓ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ 8 рд╣реИ

рдкрд░рд┐рдгрд╛рдо:

test_act 4435.7 рдареАрдХ рд╣реИ

test_async 5789.4 рдареАрдХ рд╣реИ




рдирд┐рд╖реНрдХрд░реНрд╖ рдФрд░ рдХреАрдбрд╝реЗ


рдпреЗ рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ async рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдереНрд░реЗрдб рдмрдирд╛рддрд╛ рд╣реИ, рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ рдФрд░ рдЙрдирдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реИред

рдмрдЧ - рдПрдХ рд▓реИрдореНрдмреНрдбрд╛ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд╕реНрдХреЛрдк рдЧреБрдВрдЬрд╛рдЗрд╢ рд╡реЗрд░рд┐рдПрдмрд▓ ([] рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдХреЛ SIGSEGV рдХрд╣рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред



рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрд╡рдпрдВ рдХрд┐рддрдиреЗ рдЙрдкрдпреЛрдЧреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдирдП рдорд╛рдирдХ рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд▓рд╛рдЧреВ рдХреАрдВред

рд╕реНрд░реЛрдд рдХреЛрдб



All Articles