1. C++ / Говнокод #3071

    +908

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    template <typename Handler>
      void start_connect_op(socket_type descriptor,
          per_descriptor_data&, Handler handler)
      {
        boost::asio::detail::mutex::scoped_lock lock(mutex_);
        if (!shutdown_)
        {
          boost::shared_ptr<bool> completed(new bool(false));
          connect_handler_wrapper<Handler> wrapped_handler(
              descriptor, completed, *this, handler);
          bool interrupt = write_op_queue_.enqueue_operation(
              descriptor, wrapped_handler);
          interrupt = except_op_queue_.enqueue_operation(
              descriptor, wrapped_handler) || interrupt;
          if (interrupt)
            interrupter_.interrupt();
        }
      }

    Как дико зафрагментировать кучу?!
    Столько хороших идей и так много говнокода в реализации.
    //boost::shared_ptr<bool> completed(new bool(false)); - это один из шедевров кривокодирования!!!

    Запостил: mock, 22 Апреля 2010

    Комментарии (10) RSS

    • Отсюда нужно было только одну строчку запостить:
      boost::shared_ptr<bool> completed(new bool(false));
      Ответить
      • Нет, запостил функцию полностью для наглядности всей нелепости такого вот замечательного плюсового трюка. Судите сами - время жизни переменной completed ограничено максимум (!) несколькими десятками миллисекунд; имея хотя бы 1К коннектов в секунду мы рискуем зафаршмачить кучу до состояния печени алкоголика при циррозе (дикая фрагментированность плюс объем описателей распределенной памяти будет в разы превышать объем самой распределенной памяти - если кто не въехал в метафору). Я уже не говорю об отсутствии прироста производительности при параллельной обработке коннектов, ведь весь потоковый пул будет стоять в очереди за подаянием у менеджера кучи. Трагизм еще и в том, что реактор ведь не один пользует эту самую злополучную кучу.
        Ответить
        • Недавно наткнулся на то, как повышается производительность кучи под виндой:

          http://permalink.gmane.org/gmane.comp.lib.boost.devel/202907

          Обсуждался частный случай увеличения производительности в 10 раз при переходе vs2008->vs2010.

          Что касается ограниченности времени жизни, то, видимо, предполагалось, что bool, положенный в completed, может быть использован не только в этом треде (скажем, по мере дописания кода). AFAIK, просто так передать значение из shared_ptr нельзя (см. конструктор wrapped_handler) - скорее всего, там передаётся именно shared_ptr.

          С другой стороны, например, можно было бы забацать класс, совместимый с bool, и с перегруженным и оптимизированным оператором new, чтобы работало побыстрее.

          Ну и, конечно, делать 1000 коннектов в секунду - тоже извращение :)
          Ответить
    • У вас поражён моск. Нормальный кот.
      Ответить

    Добавить комментарий