`
qiezi
  • 浏览: 497259 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

标准库的效率--适时选择自己实现

阅读更多
最近在测试简单的轻量级线程调度器。从fiber转换到generator,性能是提升了不少,但却在意想不到的地方出现了瓶颈。

在generator本身切换性能测试时,发现它性能非常高,大概单线程里面每秒切换有2亿次以上,比fiber的200-400万次有了质的提高。但是在实现了一个简单的调度器以后,发现性能急骤下降,到了每秒千万次,实现方式是使用标准库提供的list容器。

在测试了c++标准库的std::list和c#的几个list容器以后,发现它们性能都非常低,每秒仅能处理上千万次尾部添加和头部删除操作。简单分析后可以确认,性能降低是由于频繁的分配释放引起的,改用g++的ext/poll_allocactor.h里面的池分配器以后,性能提升一倍,但还是不能满意。最后把要调度的对象本身实现为List节点,因为这些对象调度的次数比分配释放要多得多,这可以方便的做出快速插入和删除,经过C#上的测试已经可以达到每秒近2亿次generator调度,这才是产品级的效率,足以和erlang的切换性能抗衡。

标准库提供的list容器开销主要是在分配释放上,如果你的对象并不需要频繁分配释放,但却要频繁放入容器和从容器中移除,还是自己实现吧。
分享到:
评论
4 楼 dayn9 2008-06-04  
请教:C++中generator用什么实现?
另外,libevent大概不支持文件异步io吧?
3 楼 qiezi 2008-04-30  
哦。我的意思是说使用池也只是少量提升性能而已,对于有些应用来说绝对不要使用这些库,比如只是频繁改变list容器中对象的位置,简单的写法可以是这样的:

class Task
{
};

std::list<Task*> tasks;
tasks.push_back(new Task);
while(true)
{
  Task* task = tasks.front();
  tasks.pop_front();
  tasks.push_back(task);
}

这种操作会不断分配释放List节点,即便是对象池也会有开销,不如写成这样:

class Task
{
  Task* prev, next;
};

把链表和对象放在一起,这样这种操作每次只需要修改这两个指针,而且移除一个对象也是O(1)的,效率可以提高不少。
2 楼 inshua 2008-04-29  
使用对象池可以吗, 老的对象不销毁
1 楼 yawl 2008-04-28  
如果对象的生命周期适合"allocate many objects and then destroy all of them"这种模型的话, boost_pool是个很好的选择:

http://seclib.blogspot.com/2005/12/compare-performance-of-malloc-and.html

http://seclib.blogspot.com/2005/12/good-experience-with-boost-memory-pool.html

相关推荐

    基于jdbcDriver的MySQL分库分表实现-OShard.zip

    本项目"基于jdbcDriver的MySQL分库分表实现-OShard.zip"提供了使用Java JDBC驱动来实现MySQL数据库分库分表的示例。下面将详细阐述相关知识点。 1. **MySQL数据库**:MySQL是一款开源、免费的关系型数据库管理系统...

    stm32f3标准固件库

    STM32F3标准固件库是为STMicroelectronics(意法半导体)的STM32F3系列微控制器设计的一套软件开发工具。这个库包含了丰富的驱动程序和实用例程,便于开发者在STM32F3平台上进行嵌入式系统的应用开发。STM32F3系列是...

    Python库 | mtgeo-0.5.5-cp36-cp36m-manylinux2014_x86_64.whl

    此外,为了确保与其他库的兼容性以及系统的稳定性,应始终关注mtgeo库的更新,并适时进行升级。 总之,"mtgeo-0.5.5-cp36-cp36m-manylinux2014_x86_64.whl"是一个针对Python 3.6的64位Linux环境的地理信息处理库,...

    Python库 | hippounit-1.3.3-py2-none-any.whl

    在Python的世界里,库是开发者的重要工具,它们提供了丰富的功能,极大地提升了开发效率。今天我们将聚焦于一个名为“hippounit”的Python库,其版本号为1.3.3,以whl格式提供的安装包名为“hippounit-1.3.3-py2-...

    Python库 | pysendpulse-0.1.2-py3-none-any.whl

    1. **Python第三方库**:pysendpulse是Python生态系统中的一个第三方库,它扩展了Python的标准库功能,提供了与SendPulse API的接口。Python社区中有大量这样的库,它们通常在PyPI(Python Package Index)上发布,...

    Python库 | cr_download-0.92.1-py3-none-any.whl

    关于Python库的开发,Python标准库提供了许多基础工具,但为了扩展功能,开发者常常需要利用第三方库。这些库可以在Python的包索引PyPI(Python Package Index)上找到,`cr_download`很可能也在其中注册,以便其他...

    Python库 | lined-0.1.2.tar.gz

    Python的标准库包含了大量内置模块,但开发者还可以从PyPI(Python Package Index)这样的仓库下载和安装第三方库,lined就是其中之一。 lined库可能是一个与文本处理或日志记录相关的工具,因为"lined"这个名字...

    how-to-be-a-programmer-cn.pdf

    - 选择自己感兴趣的领域深入钻研。 - 跟踪该领域最新动态保持热情。 - **职业规划:** - 结合个人长远目标作出决策。 - 考虑行业前景和个人优势。 **8. 如何从你的同伴身上获得最大收益** - **共享知识:** -...

    Python库 | bsbp-0.1.3.tar.gz

    因此,定期检查库的最新版本并适时更新,对于保持项目稳定性和利用最新的功能至关重要。 总结来说,`bsbp-0.1.3.tar.gz`是一个针对Python后端开发的库,提供了压缩源代码,可以通过标准的Python安装流程进行部署和...

    Python库 | li_repo-1.9.31-py2-none-any.whl

    在Python中,库通常以模块的形式存在,这些模块可以被导入并使用,以扩展标准库的功能。"li_repo-1.9.31-py2-none-any.whl" 是一个Python库的特定版本,名为“li_repo”,版本号为1.9.31,适用于Python 2解释器,且...

    哈希表-使用C++实现的哈希表-HashTable.zip

    在C++中,虽然标准库没有直接提供哈希表的实现,但我们可以自定义实现或者使用STL中的`std::unordered_map`或`std::unordered_set`来实现类似的功能。下面将详细介绍哈希表的工作原理、哈希冲突解决方法以及如何使用...

    仓库管理基础知识培训课件.pptx

    仓库管理是企业运营中的关键环节,它涉及到物料的接收、存储、发放以及盘点等一系列操作,对企业的生产效率和成本控制有着直接影响。以下是基于提供的仓库管理基础知识的详细解析: 1. **仓储管理的基本职能**: -...

    Python库 | badfiles-0.1.2.tar.gz

    1. **Python库**:Python库是预先编写好的代码集合,提供特定功能,供开发者在自己的项目中使用。它们极大地提高了开发效率,减少了重复工作。badfiles库可能包含了针对文件检查和管理的函数,如检测文件的损坏、...

    PC与PLC的适时通讯

    ### PC与PLC的适时通讯 #### 一、引言 在现代工业自动化领域,PLC(可编程逻辑控制器)因其高可靠性和强抗干扰能力成为不可或缺的一部分。与此同时,LabVIEW作为一种图形化编程语言,凭借其高效灵活的编程方式及...

    STM32L0系列的官方HAL库

    STM32L0系列是意法半导体...STM32L0系列的HAL库结合其低功耗特性,是物联网、传感器节点、便携设备等领域的理想选择。开发者可以通过学习和实践,充分利用HAL库的便利性,快速开发出高质量、低功耗的嵌入式应用。

    2-認識浪費與效率.pptx

    通过这些JIT技术的实践,企业能够逐步实现精细化管理,提高生产效率,降低成本,增强竞争力。课程中的练习如“羊年造牛”、“分纸”等,旨在帮助学员理解并应用这些理论知识,提升实际操作能力。 【课堂纪律与学习...

    某网络企业仓库管理流程.pptx

    - **目的**: 实现物料在不同仓库之间的有效流转。 - **关键步骤**: - **转库申请**: 提交转库申请单。 - **审核**: 审核转库申请的必要性和合理性。 - **执行**: 执行转库操作。 - **记录**: 更新库存记录。 ##...

    管理系统系列--分销,库存综合管理系统.zip

    通过以上知识点,我们可以理解"管理系统系列--分销,库存综合管理系统.zip"这个压缩包可能包含的组件和功能,它为企业提供了全面的解决方案,旨在提升整体运营效率,降低运营成本,实现可持续的业务增长。...

    交互设计-快速检查清单V1

    - 使用标准的UI组件库。 - 遵循平台指南,如iOS Human Interface Guidelines或Material Design。 **知识点8:界面元素和控件的合理设计** - **定义与目的**:确保界面元素和控件的设计符合用户的期望,包括文字...

    适时生产系统和全面质量管理.ppt

    适时生产系统(Just-in-time System, JIT)与全面质量管理(Total Quality Management, TQM)是现代企业管理中两大核心理念,它们分别关注生产效率和产品质量,共同推动企业的精益生产模式。 JIT哲学源于日本70年代...

Global site tag (gtag.js) - Google Analytics