C++ 应用程序性能优化

C++ 应用程序性能优化

eryar@163.com

1. Introduction

对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方程,以及非线性优化的一些算法,如BFGS,FRPR,PSO等等用于多元函数的极值求解,所以这些数值算法的性能直接影响系统的性能。软件的性能优化是计算机软件开发过程中需要一直关注的重要因素,因此有必要学习下C++应用程序性能优化的方法。

在网上寻找相关资料时,发现这方面的资料也很少,最后发现一本由电子工业出版社出版的《C++应用程序性能优化方法》,从中可以学习下IBM的性能优化方法。

本文主要结合《C++性能优化方法》并结合代码实例来说明内存优化处理对程序性能的影响。看完本书,其实发现C++性能优化方法主要还是依赖的计算机相关的基础知识,比如说计算机操作系统,数据结构与算法等等。

2.Memory Optimize

C++程序中的存储空间可以分为静态/全局存储区,栈区和堆区。静态/全局存储区和栈区的大小一般在程序编译阶段决定;而堆区则随着程序的运行而动态变化,每一次程序运行都会有不同的行为。这种动态的内存管理对于一个程序在运行过程中占用的内存大小及程序的性能有非常重要的影响。

因为静态/全局存储区在编译时就已经确定了,而栈区则是由操作系统在管理,这些都不劳程序员费神。就是这个堆区是提供给程序员的自由舞台,可以任性发挥。堆区的存储区域怎么玩呢?理解了这三个问题应该就知道了:一是堆区数据怎么产生(从哪儿来)?二是堆区的数据怎么销毁(到哪儿去)?堆区数据怎么访问?由C++标准规定得知,C++实现通过全局的new和delete来提供动态内存的访问和管理。而堆区数据的访问就是通过指针了。当使用new/delete来操作堆上的存储区域时,操作系统就要对堆的存储区域进行管理,所以这个管理工作就会对应用程序的性能有影响。

为了解决内存泄露问题,即new之后不再使用时并没有delete,OpenCASCADE中入了Handle智能指针的宏定义。Handle的使用也很简单,只需要将用Handle(Class)就可以了。

利用默认的内存管理new/delete在堆上分配和释放内存会有一些额外的开销。系统在接收到一定大小内存请求时,首先查找内部维护的内存空闲块表,并且需要根据一定的算法(例如分配最先找到的不小于申请大小的内存块给请求者,或者分配最适于申请大小的内存块等)找到合适大小的内存块。如果该空闲内存块过大,还需要切割成已分配的部分和较小的空闲块,然后系统更新内存块表,完成一次内存分配。类似地,在释放内存时,系统把释放的内存块重新加入到空闲内存块表中。如果有可能的话,可以把相邻的空闲块合并成较大的空闲块。

默认的内存管理函数还考虑到多线程的应用,需要在每次分配和释放内存时加锁,同样增加开销。可见,如果应用程序频繁地在堆上分配格释放内存,则会导致性能的损失。并且会使系统中出现大量的内存碎片,降低内存的利用率。

由此可见,在简单的new和delete背后,系统默默地为我们做了这么多的事,而做这些事都是要花时间的啊!虽然默认的内存管理算法也考虑了性能,但是考虑的是更通用的情况,为了应付更复杂、更广泛的情况,需要做更多额外工作。而对于具体的应用程序来说,适合自身特定的内存管理则可以获得更好的性能,为此OpenCASCADE引入了自己的内存管理机制,与内存池概念类似。OCCT的内存通过配置,可以使用没的优化技术,或者不使用任何优化直接使用系统的malloc和free。这些配置都是通过环境变量来实现,其中打开和关闭内存优化的开关是环境变量:MMGT_OPT,这个默认是0,即不使用任何优化;设置成1就是使用;设置成2就是使用TBB的内存优化技术(这个的前提是第三方库正确配置,如果没有还是使用的malloc和free;

// paralleling with Intel TBB
#ifdef HAVE_TBB
  #include <tbb/scalable_allocator.h>
  using  namespace tbb;
#else
  #define scalable_malloc malloc
  #define scalable_calloc calloc
  #define scalable_realloc realloc
  #define scalable_free free
#endif

下面通过代码来看看使用内存管理的性能有什么变化。

3.Code Example

下面通过程序来看看使用这些技术对性能的影响:


/*
*    Copyright (c) 2016 Shing Liu All Rights Reserved.
*
*           File : main.cpp
*         Author : Shing Liu(eryar@163.com)
*           Date : 2016-07-31  11:54
*        Version : OpenCASCADE7.0.0
*
*    Description : Test OCCT Memory Manager and Handle(smart pointer).
*/

#include <OSD_Timer.hxx>

#include <Poly.hxx>
#include <Poly_Triangulation.hxx>

#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")

/*
*@brief test memory without Handle(smart pointer) management.
*
 
*/
void testMemory(Standard_Integer theCount)
{
    OSD_Timer aTimer;
    aTimer.Start();

    for (Standard_Integer i = 0; i < theCount; i++)
    {
        Poly_Triangulation* aTriangulation = new Poly_Triangulation(10, 5, Standard_False);

        delete aTriangulation;
    }

    aTimer.Stop();
    aTimer.Show();
}

/*
*@brief test memory with Handle(smart pointer) management.
*
*/
void testHandle(Standard_Integer theCount)
{
    OSD_Timer aTimer;
    aTimer.Start();

    for (Standard_Integer i = 0; i < theCount; i++)
    {
        Handle(Poly_Triangulation) aTriangulation = new Poly_Triangulation(10, 5, Standard_False);
    }

    aTimer.Stop();
    aTimer.Show();
}

/*
* @brief set environment variable MMGT_OPT=0 to use malloc/free directly;
*        set environment varialbe MMGT_OPT=1 to use OCCT memory optimization technique;
*        set environment variable MMGT_OPT=2 to use paralleling with Interl TBB;
 
*/
int main( int argc, char* argv[])
{
    int aCount = 100000;

    std::cout << "\ntest pointer without handle" << std::endl;
    testMemory(aCount);

    std::cout << "\ntest pointer with handle" << std::endl;
    testHandle(aCount);

    return 0;
}

如果直接运行上面的代码编译的程序,得到的结果如下图所示:

wpsECE0.tmp

由图可知,当使用Handle(智能指针)的时候,时间上影响不大,即使用Handle对性能影响基本上可以忽略,但是得到很多好处,主要的就是不用自己去delete了。使用Visual Studio的性能分析工具查看,结果也类似:

wpsECF1.tmp

时间的开销也是集中在内存的分配上面:

wpsED02.tmp

注意到上面的Allocate()是类Standard_MMgrRaw的,即是直接使用的系统的malloc和free来管理内存。下面设置环境变量MMGT_OPT=1来使用OCCT的内存优化类看看对性能影响如何?

wpsED03.tmp

程序运行的结果如下图所示:

wpsED13.tmp

与没有使用内存优化的时候0.1相比,使用了内存优化处理的要快40%左右。

由下图可以看出,性能热点也是集中在内存的分配上面:

wpsED14.tmp

注意现在内存分配使用的是Standard_MMgrOpt类中的Allocate函数:

wpsED15.tmp

总的来说,将环境变量MMGT_OPT设置成1来使用OCCT的内存优化算法,性能提升还是很明显的。

4.Conclusion

当程序规模越来越大,算法越来算复杂的时候,找到性能的瓶颈越麻烦一些。性能优化第一步是测量,找到合适的测量工具。《C++应用程序性能优化》一书中提供的是IBM Rational Quantify,在网上搜了下还有Intel VTune Amplifier等,功能都很强大。在Windows中开发程序使用的Visual Studio自带了性能分析功能,使用起来也比较方便。

找到性能瓶颈,就要对其进行分析原因,进而修改程序,提高性能。这方面的方法论可以借鉴《C++应用程序性能优化》,从数据结构、程序启动、内存管理等方面来分析。摘出此书中程序性能优化的流程图:

wpsED16.tmp

5. References

1.冯宏华,徐莹,程远,汪磊. C++应用程序性能优化. 电子工业出版社.

2.Scott Meryers. Effective C++(评注版). 电子工业出版社. 2011

3.OpenCASCADE Foundation Classes Document 7.0.0. 2016

PDF Version: C++应用程序性能优化

weixin_33971205
关注 关注
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCascade源码分析之StlAPI(网格离散化后导出stl文件)
sswai的博客
10-14 1650
OpenCascade源码分析之StlAPI(网格离散化后的导出stl文件操作),网上的资料太少了,自己读源码来分析运行机制吧
C++性能优化(一)——应用程序性能优化简介
天山老妖
02-21 2699
一、程序性能优化简介 1、程序性能优化简介 在计算机发展的早期阶段,硬件资源相对而言是非常昂贵的,CPU运行时间与内存容量给程序开发人员设置了极大限制。因此,早期的程序对运行性能和内存空间占用的要求是非常严格的,很多开发人员为了减少1%的CPU运行时间,为减少几十个甚至几个字节而不懈努力。随着计算机技术的快速发展,硬件资源变得相对便宜。但如果认为软件开发时,程序的性能优化不再重要,硬件将解决性能问题也是片面的。计算机硬件的发展解决了部分软件的性能问题,但随着硬件计算能力的提高,用户对软件功能的要求也越来
【超级好】C++应用程序性能优化.pdf
11-14
C++应用程序性能优化C++应用程序性能优化
c++ 性能优化策略
D_Guco的专栏
07-22 9922
1 关于继承:不可否认良好的抽象设计可以让程序更清晰,代码更看起来更好,但是她也是有损失的,在继承体系中子类的创建会调用父类的构造函数,销毁时会调用父类的析构函数,这种消耗会随着继承的深度直线上升,所以不要过度的抽象和继承,更为严重的是当多重继承中并且有虚函数的存在时情况更为复杂,的确,这些问题涉及开销,但是,多重继承减少了编码的负担,同时也让问题的解决方案更加简洁,这当然要付出一些代价.总之,与...
C++应用程序性能优化——操作系统内存管理
天涯路的专栏
02-07 372
1. 工作集: 概念:操作系统中驻留在物理内存中的内存页成为进程的工作集。 工作集的大小: 操作系统为每个进程定义了最小工作集(20-50MB),和最大工作集(45-345MB)(具体与系统的物理内存大小有关) 工作集的增长: 当执行到未被调入内存的代码页或数据页时,这些页会被调入内存,工作集随之增长。 当工作集达到最大工作集,进程需要再次调入新页到物理内存时,虚拟内存管理器会将原来工作集中某些页置换出内存,把需要调入的新页调入内存。 访问内存的性能: 工作集中的内存驻留在物理内存中,因
c++ 应用程序性能优化 第二版
03-07
本资源只是业余学习之用,如有涉及侵权,还请其他告知,谢谢
C++应用程序性能优化_第二版
04-06
C++应用程序性能优化 第二版 高清图书 相当经典相当不从的,取于网络,还于网络,亲给个好评啊!!
C++应用程序性能优化
10-15
C++应用程序性能优化,算是介绍的很详细的书记。主要针对的是C++程序的性能优化,深入介绍C++程序性能优化的方法和实例。
c++应用程序性能优化
06-27
本书深入浅出的讲解了C++性能优化,由程序优化基础,内存使用优化,程序启动性能优化以及性能工具4部分组成
C++应用程序性能优化(三)——C++语言特性性能分析
weixin_34357436的博客
06-07 419
C++应用程序性能优化(三)——C++语言特性性能分析 一、C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高但性能要求并不是很高的程序。因为大多数开发人员认为,C++语言设计时因为考虑到支持多种编程模式(如面向对象编程和范型编程)以及异常处理等,从而引入了太多新的语言特性。新的语言特性往往使得C++编译器在...
OpenCascade与三角剖分 笔记
一直被超越,从未被模仿
01-18 9204
笔记摘自 http://www.cppblog.com/eryar/archive/2013/05/26/200605.html概述三角剖分是平面剖分中的一个重要课题,在数字图像处理、计算机三维曲面造型、有限元计算、逆向工程等领域有着广泛应用。由于三角形是平面域中的单纯形,与其他平面图形相比,其有描述方便、处理简单等特性,很适合于对复杂区域进行简化处理。因此,无论在计算几何、计算机图形处理、模式识别
C++性能优化
C语言与CPP编程的博客
03-21 1750
前言性能优化不管是从方法论还是从实践上都有很多东西,从 C++ 语言本身入手,介绍一些性能优化的方法,希望能做到简洁实用。实例1在开始本文的内容之前,让我们看段小程序://获取一个整数对...
C++ OpenCV学习笔记(多线程,多个摄像头进行基于Haar+Adaboost实现的人脸检测功能)
qq_42145185的博客
04-11 2081
#include <opencv2/core/core.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/opencv.hpp> #include <vector> #include <cstdio> #include <wind...
容易成为性能瓶颈的C++语言特性
07-20 879
C++应用程序性能优化笔记(四)——构造函数性能2010-05-18 20:39容易成为性能瓶颈的C++语言特性对程序的性能问题,根本原因并非采用什么语言编写程序。如果程序的框架设计不作修改,单纯地把一个C++程序用C或者汇编改写,也不能保证总体性能会有提高。因此,正确的思路应该
国产三维CAD华天软件STNOVATION 几何造型内核CRUX IV 解析
山涧果子(JIanhongwei810)
09-23 4719
1.SINOVATION产品发展史 SINOVATION软件作为一款从日本引进源代码技术基础上开发的工业设计软件,华天软件购买日本UEL公司CADmeister软件源代码! 三维CAD软件不只是设计工具,还包含知识和经验的凝练,不掌握源代码,就只能永远跟在别人的后面。“国外的软件公司都有工业背景,UEL公司原来就是主要为丰田公司的汽车生产服务的,20多年都是围着制造业在转。”制造业发达,才可能有高端的制造业软件,因为软件归根结底是对生产经验的一种总结。 依托目前国内最大的3D CAD/CAM研发团队,..
OpenCASCADE:构建线程
希望我的博客,能帮上你解决学习中工作中所遇到的问题
07-20 731
OpenCASCADE:构建线程OpenCASCADE:构建线程创建曲面定义二维曲线建立边缘和线创建线程 OpenCASCADE:构建线程 创建曲面 到目前为止,您已经学习了如何从 3D 曲线中创建边。您现在将学习如何从 2D 曲线和曲面创建边。要了解 Open CASCADE 技术的这一方面,您将使用圆柱表面上的 2D 曲线构建螺旋轮廓。该理论比前面的步骤更复杂,但应用它非常简单。作为第一步,您计算这些圆柱面。您已经熟悉Geom包的曲线。现在您可以使用以下方法创建圆柱面 ( Geom_Cylindrica
C++应用程序性能优化读书笔记
潜行
07-03 3042
粗浅的看了下,有点虎头蛇尾。暂且记下。 第一篇 C++程序优化基础第1章 C++对象模型1.1 基本概念1.1.1 程序使用内存区    一个程序占用的内存区一般分为5种:全局/静态数据区、常量区、代码区、栈、堆。    例子代码:    #include     #include     int nGlobal = 100;
C++应用程序性能优化》之程序内存
幻天城主的博客
10-22 2305
一个程序占用的内存区通常分5种,如下: 全局/静态数据区: 常量数据区: 代码区:     栈: 堆:
c++应用程序性能优化 第二版 pdf
最新发布
09-21
《C 应用程序性能优化 第二版 pdf》是一本关于 C 应用程序性能优化的重要参考书籍。该书深入解析了如何通过优化代码来提高 C 应用程序的性能。 首先,这本书介绍了性能优化的基本原则和方法。它教会了读者如何使用...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • js合并两个对象的方法 31439
  • CPU优化建议使用cpupower设置CPU Performance模式 23080
  • Red Hat Enterprise Linux 8.0 正式版镜像下载 21403
  • No transaction aspect-managed TransactionStatus in scope 20107
  • LIghtroom CC中.xmp预设文件怎么导入?lr预设xmp文件导入教程! 14081

最新评论

  • 如何解决SVN Commit failed (details follow): Access denied

    weekeew: 谢谢,我也遇到了这个问题,按照您说的方法解决了。

  • win10 git bash 闪退

    weixin_59693579: 今天打开又说我安装了来历不明的系统文件

  • win10 git bash 闪退

    weixin_59693579: 您好 我按照您的方法弄完 并且用了您分享的文件覆盖完。确实安装成功且没有闪退,但是等我再打开的时候又闪退,并且这个null文件一直start,我stop不了,一直说我控制不了它 不知道为什么

  • 3D圣诞树源码[强力推荐]

    2201_75670803: 打不开、

  • java使用httpclient调用上传图片接口[示例]

    weixin_49916230: 出现乱码情况怎么办

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 就差一点点-微妙的强制类型转换
  • Android开发学习之路-环境搭建
  • matlab练习程序(LMS)
2019年365篇
2018年743篇
2017年961篇
2016年502篇
2015年424篇
2014年336篇
2013年331篇
2012年274篇
2011年193篇
2010年157篇
2009年124篇
2008年79篇
2007年66篇
2006年54篇
2005年21篇
2004年6篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司鞍山网站推广多少钱张掖高端网站设计报价坪地推广网站推荐长春网络营销价格哈尔滨seo排名价格黔东南网站制作伊犁seo网站推广价格长春网站建设报价湘潭网络营销哪家好白城网站seo优化朔州模板推广报价淮南推广网站推荐郑州企业网站建设推荐延边企业网站改版宜春百搜标王多少钱鹤岗网站改版哪家好贵港seo优化价格临夏企业网站设计推荐平湖seo推荐平湖SEO按天计费公司清徐至尊标王深圳网站优化推广推荐绵阳网站优化排名报价巢湖网站seo优化多少钱长沙seo曲靖企业网站制作价格钦州网站推广系统公司滨州外贸网站建设推荐宝安SEO按天扣费哪家好咸宁百姓网标王推广推荐歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化