zoukankan      html  css  js  c++  java
  • priority_deque作为Timer时间队列底层容器的一些思考

    https://www.bbsmax.com/A/D854VkZxzE/

    设置底层容器可以分离出两个逻辑上独立的问题:

    >如何存储构成优先级队列(容器)的实际元素,以及
    >如何组织这些元素以有效地实现优先级队列(priority_queue适配器类).

    例如,当容量远大于其实际大小时,矢量的标准实现不需要自行缩小.这意味着如果您有一个由向量​​支持的优先级队列,如果您将许多元素排入队列然后将所有元素出列,则可能最终浪费内存,因为向量将保留其旧容量.另一方面,如果您实现自己的shrinking_vector类,它实际上在需要时会减少其容量,您可以获得priority_queue接口的所有好处,同时更有效地使用存储.

    另一个可能的示例 – 您可能希望更改正在使用的分配器,以便从特殊资源池分配优先级队列的元素.您可以通过将priority_queue的容器类型设置为具有自定义分配器的向量来实现此目的.

    还有一个想法 – 假设您正在存储一个非常大的对象的priority_queue,其复制时间非常长.在这种情况下,向量动态调整自身大小并复制其旧元素(或者至少在C03编译器中)的事实可能是您不愿意支付的.因此,您可以切换到其他类型,可能是deque,它在调整大小时不会复制元素,并且可以实现一些重大的性能获胜.

    在高并发的http服务器下,定时器底层使用deque作为底层容器比vector要好的多,在C++reference上有介绍到deque容器的存储空间会根据需要被自动扩展或收缩。当并发量很大时,一方面deque不具有容量的概念,不会因为扩容产生vector的“重新配置,复制,释放”三个过程,并发量很大时,这三个过程时非常耗时的。另一方面,当并发量下来之后,之前高并发的内存会被合理释放合理收缩,vector是做不到的,除非实现自己的shrinking_vector类

  • 相关阅读:
    定时任务的分布式调度
    springmvc 静态资源 配置
    activemq 持久化
    函数式编程与面向对象编程的比较
    LeetCode 108——将有序数组转化为二叉搜索树
    LeetCode 104——二叉树中的最大深度
    LeetCode 700——二叉搜索树中的搜索
    线性代数之——四个基本子空间
    线性代数之——线性相关性、基和维数
    线性代数之——秩和解的结构
  • 原文地址:https://www.cnblogs.com/AKUN-FYK/p/10982214.html
Copyright © 2011-2022 走看看