c++程序性能调优

1.尽量减少值传递,多用指针和引用来传递参数

  值传递要拷贝对象,引用传递不用

2.++i和i++的效率问题

  i++开辟了临时变量,效率低

3.将小粒度函数声明为内联函数

  内联函数直接会直接展开,不需要函数调用的开销

4.减少函数调用

  函数调用需要两次跳转,外加栈帧的内存操作

5.优先使用迭代而不是递归

  理由和上面一样

6.多使用直接初始化,而不是拷贝初始化

转载自:https://www.jb51.net/article/54773.htm

  当对一个类对象初始化时,如果“=”右边不是一个类对象时,会先调用转换构造函数生成一个临时变量作为拷贝构造函数的形参,再调用拷贝构造函数;编译器可能会给你优化,把 ClassTest ct2 = "ab"; 优化为 ClassTest ct2("ab") ,就不会有上述的过程,但有的编译器它也不优化

7.尽量少使用dynamic_cast

  dynamic_cast运算符用于将基类的指针或引用安全地转换成派生类的指针或引用,这种转换是非常低效的,对程序的性能影响也比较大,尽量少用

8.用vector的swap操作代替vector的赋值

  vector的swap操作,它只是将两个vector指向空间等等信息交换了一下,而不会引起元素的拷贝,它的操作是常数级的,和交互对象中元素数目无关

9.gcc编译优化

  gcc编译的时候有O1~O3的优化选项,O0为不优化,gcc编译时的默认值

10.循环引发的选择

//代码1
for(int i = 0; i < n; ++i)
{
  fun1();
  fun2();
}

//代码2
for(int i = 0; i < n; ++i)
{
  fun1();
}
for(int i = 0; i < n; ++i)
{
  fun2();
}

1)如果这多个函数的代码语句很少,则代码1的运行效率高一些,但是若fun1和fun2的语句有很多,规模较大,则代码2的运行效率会比代码1显著高得多

2)由于CPU只能从内存在读取数据,而CPU的运算速度远远大于内存,所以为了提高程序的运行速度有效地利用CPU的能力,在内存与CPU之间有一个叫Cache的存储器,它的速度接近CPU。而Cache中的数据是从内存中加载而来的,这个过程需要访问内存,速度较慢

3)Cache的设计原理:时间局部性和空间局部性,时间局部性是指如果一个存储单元被访问,则可能该单元会很快被再次访问,这是因为程序存在着循环。空间局部性是指如果一个储存单元被访问,则该单元邻近的单元也可能很快被访问,这是因为程序中大部分指令是顺序存储、顺序执行的,数据也一般也是以向量、数组、树、表等形式簇聚在一起的

4)如果fun1和fun2的代码量很大,例如都大于Cache的容量,则在代码1中,就不能充分利用Cache了(由时间局部性和空间局部性可知),因为每循环一次,都要把Cache中的内容踢出,重新从内存中加载另一个函数的代码指令和数据,而代码2则更很好地利用了Cache,利用两个循环语句,每个循环所用到的数据几乎都已加载到Cache中,每次循环都可从Cache中读写数据,访问内存较少,速度较快,理论上来说只需要完全踢出fun1的数据1次即可

11.局部变量VS静态变量

  局部变量使用的是栈,当一个数据被反复读取的时候,数据会留在CPU的Cache中,访问速度非常快。这样来看就是局部变量效率更高了

12.在稿纸上简化方程式

13.时间复杂度和空间复杂度的置换

14.尽量用移位操作>>和<<来代替乘除法

15.字符数组的初始化

转载自:https://blog.csdn.net/yunhua_lee/article/details/6381866

  字符数组如果可以不初始化就不进行初始化,即使你初始化部分数组的元素,底层默认也会调用memset()帮你初始化其他元素为0,增大开销

原文地址:https://www.cnblogs.com/Joezzz/p/10568057.html

时间: 2024-10-28 15:21:05

c++程序性能调优的相关文章

下载深入Java程序性能调优(阿姆达尔定律、缓存组件、并行开发、线程池、JVM调优)

深入Java程序性能调优(阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:http://pan.baidu.com/s/1cvD3rw 密码:eevh 1.1. 性能概述--两个实战在线项目对比突出性能的重要性1.2. 性能概述--阿姆达尔定律解决性能的关键点2.1. 设计优化--模式在实际开发中运用012.2. 设计优化--模式在实际开发中运用02-延迟加载的核心2.3. 设计优化--模式在实际开发中运用03-基于动态代理的拦截器2

Java性能调优_深入Java程序性能调优(并行开发、JVM调优)

深入Java程序性能调优(阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优)课程讲师:special课程分类:Java核心适合人群:初级课时数量:33课时更新程度:完成用到技术:阿姆达尔定律.缓存组件.并行开发.线程池.JVM调优涉及项目:模式在实际开发中运用深入Java程序性能调优下载: http://pan.baidu.com/s/1ntn0ZTB 密码: ijluJava性能调优:国内关于Java性能调优的课程非常少,如此全面深入介绍Java性能调优,北风算是独家,Special讲师,

程序性能调优的利器

gprof,oprofile,perf的使用 gprof 用户手册 http://sourceware.org/binutils/docs-2.17/gprof/index.html oprofile官方站点 http://oprofile.sourceforge.net/ 使用 GNU profiler 来提高代码运行速度 http://www-128.ibm.com/developerworks/cn/linux/l-gnuprof.html 使用 OProfile for Linux on

Java程序性能调优深入浅出视频下载

国内关于Java性能调优的课程非常少,如此全面深入介绍Java性能调优,北风算是独家,Special讲师,十余年Java方面开发工作经验,资深软件开发系统架构师,本套课程系多年工作经验与心得的总结,课程有着很高的含金量和实用价值,一套拥有,高薪可求!一.本课程是怎么样的一门课程(全面介绍)   1.1.课程的背景    该课程是让大多数java开发者立足于编写高质量的程序,去感受java开发中的大智慧, 让java程序更优美. 1.2.课程内容简介 专注于java应用程序的优化方法,技巧和思想,

Java程序性能调优的基本知识和JDK调优

一 基本知识 1.1 性能是什么 在性能调优之前,我们首先来了解一下性能是什么?关于性能,我想每个学习过Java的人都能列出几点,甚至可以夸夸其谈.在<Java TM Platform Performance>一书中,定义了如下五个方面来作为评判性能的标准: 1) 运算的性能--哪一个算法的执行性能最好? 2) 内存的分配--程序运行时需要耗费多少内存? 3) 启动的时间--程序启动需要多长时间?这在Web项目中的影响不大,但要注意部分程序需要部署或运行在客户端时的情形(比如applet程序)

java程序性能调优---------------性能概述

一.程序的性能通过哪几个方面表现 1.执行速度(程序反应反应是否迅速.响应时间是否足够短) 2.分配内存 (分配内存是否合理,是否过多的消耗内存或者内存溢出) 3.启动时间(程序从运行到可以正常处理业务需要花费多长时间) 4.负载承受能力(当系统压力上升时,系统的执行速度.响应时间的上升曲线是否平缓) 二.性能的参考指标 1.执行时间(一段代码从开始运行到运行结束,所使用的时间) 2.CPU时间(函数或者线程占用CPU实际) 3.内存分配(程序在运行时占用的内存空间) 4.磁盘吞吐量(描述I/O

深入Java程序性能调优视频教程

下载:http://pan.baidu.com/s/1bi7Kj8 密码:mujd 课程专注于java应用程序的优化方法,技巧和思想,深入剖析软件设计层面.代码层面.JVM虚拟机层面的优化方法,理论结合实际,使用丰富的示例帮助学员理解理论知识. 第一课(性能概述--两个实战在线项目对比突出性能的重要性) 第二课(性能概述--阿姆达尔定律解决性能的关键点) 第三课(设计优化--模式在实际开发中运用01) 第四课(设计优化--模式在实际开发中运用02--延迟加载的核心) 第五课(设计优化--模式在实

[development][profile][dpdk] KK程序性能调优

KK程序: 1. 两个线程,第一个从DPDK收包,通过一个ring数据传递给第二个线程.第二个线程将数据写入共享内存. 2. 第二个内存在发现共享内存已满时,会直接丢弃数据. 3. 线程二有个选项debug,用于每一次ring_dequeue之后,都将数据写入内存. 当这个选项为on时,内存未满,也不会丢包. 现象:当内存已满的时候,可以千兆线速收包.当内存未满时,丢包率为20%. 分别做三次gprof: 1. gmon-empty-off.txt 0.08 0.42 471955/471955

成为Java GC专家(5)—Java性能调优原则

这是"成为Java GC专家"系列的第五篇文章.在第一篇深入浅出Java垃圾回收机制中,我们已经学习了不同的GC算法流程.GC的工作原理.新生代(Young Generation)和老年代(Old Generation)的概念.你应该了解了JDK7中5种GC类型以及各种类型对应用程序的影响. 在第二篇如何监控Java的垃圾回收中,阐述了JVM是怎样实际执行垃圾回收的,我们怎样去监控GC以及哪些工具能让这个过程更高效. 第三篇如何如何优化Java垃圾回收机制中展示了一些基于真实案例的最佳