返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么分析和提高C/C++程序的编译速度
  • 704
分享到

怎么分析和提高C/C++程序的编译速度

2023-06-16 11:06:36 704人浏览 独家记忆
摘要

这篇文章主要讲解了“怎么分析和提高C/C++程序的编译速度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么分析和提高C/c++程序的编译速度”吧!硬件、编译器造成的使用好点的电脑无疑是一个

这篇文章主要讲解了“怎么分析和提高C/C++程序的编译速度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么分析和提高C/c++程序的编译速度”吧!

硬件、编译器造成的

使用好点的电脑无疑是一个操作上的最佳选择,其次,对于编译器也是可以编译选项优化的,例如在VS环境中,可以通过配置属性来实现,具体步骤如下,大家可以参考:https://blog.csdn.net/yizhou2010/article/details/52635288

代码编写风格

多使用自加、自减指令和复合赋值表达式

你觉得使用i++ ,i = i + 1,i += 1有区别吗?我们来测试一下C代码:

void asd() {}  int main() {      int i=0;      i++;      asd();//方便区分上下文      ii=i+1;      asd();      i+=1;      return 0;  }

反汇编:

mov     [rbp+i], 0//i的初始化  add     [rbp+i], 1//i++;  call    _Z3asdv         ; asd(void)  add     [rbp+i], 1//ii=i+1;  call    _Z3asdv         ; asd(void)  add     [rbp+i], 1//i+=1;

我们看到这个结果是一样的,但是在更加复杂的表达式中就会多生成几个指令了,而且用 i += 1 的,总是比写 i = i + 1的要稍微那么好看些。

除法换成乘法或者移位来表达

除法就是由乘法的过程逆推来的,依次减掉(如果x够减的)y^(2^31),y^(2^30),...y^8,y^4,y^2,y^1。减掉相应数量的y就在结果加上相应的数量,一般来说,更耗时间一些,用一个demo来测试一下

auto time_start = std::chrono::system_clock::now();  int iCount = 100000;  double k ;  for (int i = 0; i < 1000000; i++)  {       tmp = iCount / 2;  }  std::chrono::duration<double> time_spend = std::chrono::system_clock::now() - time_start;  double test1 = time_spend.count() * 1000;  cout<<"test1 cost "<<time_cost<<" ms"<<endl;  time_start = std::chrono::system_clock::now() ;  for (int i = 0; i < 1000000; i++)  {       tmp = iCount * 0.5f;  } time_spend = std::chrono::system_clock::now() - time_start;  test2 = time_spend.count() * 1000;  cout<<"test2 cost "<<time_cost<<" ms"<<endl;  time_start = std::chrono::system_clock::now() ;  for (int i = 0; i < 1000000; i++)  {       tmp = iCount >>1;  }  time_spend = std::chrono::system_clock::now() - time_start;  test3 = time_spend.count() * 1000;  cout<<"test3 cost "<<time_cost<<" ms"<<endl;

我们输出结果会发现,移位和乘法比除法要省3-5倍时间,移位相对而言是最省时间的。

多用直接初始化,少用拷贝初始化

string s1 = "hiya";    // 拷贝初始化  string s2("hello");    // 直接初始化  string s3(10, 'c');    // 直接初始化

当我们使用拷贝初始化时,我们要求编译器将右侧运算对象拷贝到正在创建的对象中,如果需要的话还要进行类型转换,会浪费一定的资源时间,而直接初始化是要求编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数和拷贝构造函数。

我们来看看Primer中怎么说的

当用于类类型对象时,初始化的复制形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,复制初始化总是调用复制构造函数。复制初始化首先使用指定构造函数创建一个临时对象,然后用复制构造函数将那个临时对象复制到正在创建的对象”

还有一段说到:

通常直接初始化和复制初始化仅在低级别优化上存在差异,然而,对于不支持复制的类型,或者使用非explicit构造函数的时候,它们有本质区别: 

ifstream file1("filename")://ok:direct initialization  ifstream file2 = "filename";//error:copy constructor is private

局部变量、静态局部变量、全局变量与静态全局变量

  •  局部变量是存在于堆栈中的,对其空间的分配仅仅是修改一次esp寄存器的内容即可;

  •  静态局部变量是定义在函数内部的,静态局部变量定义时前面要加static关键字来标识,静态局部变量所在的函数在多调用多次时,只有第一次才经历变量定义和初始化;

  •  当一个文件或者数据反复使用时,应该存储在全局变量中,避免重复加载使用;

  •  静态全局变量是静态存储方式,静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。

静态变量是低效的,当一块数据被反复读写,其数据会留在CPU的一级缓存(Cache)中

代码冗余度

避免大的循环,循环中避免判断语句

在写程序过程中,最影响代码运行速度的往往都是循环语句,我记得当时在写matlab的时候,处理大数据,都是禁止用循环的,特别是多层嵌套的循环语句。

其次,尽量将循环嵌套控制在 3 层以内,有研究数据表明,当循环嵌套超过 3 层,程序员对循环的理解能力会极大地降低。同时,这样程序的执行效率也会很低。因此,如果代码循环嵌套超过 3 层,建议重新设计循环或将循环内的代码改写成一个子函数。

for (i=0;i<100;i++)  {      for (j=0;j<5;j++)      {         for (j=0;j<5;j++)          {                        }      }  }

多重 for 循环中,如果有可能,应当尽量将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数

for (i=0;i<100;i++)  {      for (j=0;j<5;j++)      {                    }  }

改为:

for (j=0;j<5;j++)  {      for (i=0;i<100;i++)      {                    }  }

逻辑判断不要在循环中使用,当 for 循环的次数很大时,执行多余的判断不仅会消耗系统的资源,而且会打断循环“流水线”作业,使得编译器不能对循环进行优化处理,降低程序的执行效率

if (condition)  {      for (i = 0;i < n;i++)      {                }  }  else  {      for (i = 0;i < n;i++)      {                }  }

尽量避免递归,递归就是不停的调用自身,所以非常消耗资源,甚至造成堆栈溢出和程序崩溃等等问题!

int Func(int n)  {  if(n < 2)  return 1;  else  return n*Func(n-1);  }

因此,掌握循环优化的各种实用技术是提高程序效率的利器,也是一个高水平程序必须具备的基本功。

尽量不使用继承和多重继承

多重继承增加了类的继承层次的复杂性,调试难度增加当然风险也增加了,而且使用父类指针指向子类对象变成了一件复杂的事情,得用到C++中提供的dynamic_cast来执行强制转换。但是dynamic_cast是在运行期间而非编译期间进行转换的,因此会会带来一些轻微的性能损失,建议类型转换尽量采用c++内置的类型转换函数,而不要强行转换

少用模板,因为模板是编译期技术,大量采用模板也会增加编译时间

在c++primer3中,有一句话:

在多个文件之间编译相同的函数模板定义增加了不必要的编译时间简单点说,对于一个zhidaovector的函数,比如size(),如果在不同的cpp中出现,在这些文件编译的时候都要把vector::size()编译一遍。然后在链接的时候把重复的函数去掉,很显然增加了编译时间。模版函数需要在编译的时候实例化zhidao,所以呢,不把模版的实现代码放到头文件中的话(在头文件中实例化),那么每个使用到这个模版的cpp的都要把这个模版重新实例化一遍,所以增加了编内译时间

编码依赖性

声明与实现分离,删除不必要的#include

  •  使用include时,只需要include这个接口头文件就好

  •  并不是所有的文件都需要包含头文件 iOStream,定义了输出函数引用就好

  •  ostream头文件也不要,替换为 iosfwd, 为什么,参数和返回类型只要前向声明(forward declared )就可以编译通过

尽量减少参数传递,多用引用来传递参数。

bool func1(string s1,  string s2)  bool func2(string *s1, string *s2)  bool func3(string &s1, string &s2)

指针和引用都不会创建新的对象,函数func2和func3不需要调用析构和构造函数,函数func1使用值传递在参数传递和函数返回时,需要调用string的构造函数和析构函数两次。

适当的采用PIMPL模式

很实用的一种基础模式,通过一个私有的成员指针,将指针所指向的类的内部实现数据进行隐藏。将实现放到CPP里,主要作用在于编译分离,其实是增加了编码量以及初次编译时长,增量编译才体现作用。例如:指针的大小为(64位)或32(8位),X发生变化,指针大小却不会改变,文件c.h也不需要重编译。

感谢各位的阅读,以上就是“怎么分析和提高C/C++程序的编译速度”的内容了,经过本文的学习后,相信大家对怎么分析和提高C/C++程序的编译速度这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么分析和提高C/C++程序的编译速度

本文链接: https://lsjlt.com/news/283451.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么分析和提高C/C++程序的编译速度
    这篇文章主要讲解了“怎么分析和提高C/C++程序的编译速度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么分析和提高C/C++程序的编译速度”吧!硬件、编译器造成的使用好点的电脑无疑是一个...
    99+
    2023-06-16
  • ubuntu怎么编译c++程序
    本篇内容介绍了“ubuntu怎么编译c++程序”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!ubuntu中编译c++程序的方法:打开终端使用...
    99+
    2023-07-04
  • linux怎么编译c++程序
    在Linux上编译C++程序通常使用gcc编译器。以下是在Linux上编译C++程序的步骤: 创建一个C++源文件,例如hell...
    99+
    2024-03-01
    linux c++
  • 怎么编译C语言程序
    这篇文章主要介绍了怎么编译C语言程序的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么编译C语言程序文章都会有所收获,下面我们一起来看看吧。编译/执行 C 程序实例#include <stdio.h>...
    99+
    2023-06-17
  • C语言中程序编译系统的示例分析
    这篇文章主要介绍C语言中程序编译系统的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!程序的翻译环境和执行环境在ANSI C的任何一种实现中,存在两个不同的环境 :第1种是翻译环境,在这个环境中源代码被转换为可...
    99+
    2023-06-29
  • vscode怎么编译运行c程序
    在VSCode中编译和运行C程序,需要进行以下步骤: 安装C/C++插件:在VSCode中点击"Extensions"图标(左侧...
    99+
    2023-10-23
    vscode
  • c语言程序怎么反编译
    如何反编译 c 语言程序:使用反编译工具(如 ghidra、ida pro 或 hopper)反编译;加载可执行文件;选择反编译选项,以将编译后的指令转换为汇编语言;分析汇编语言代码,以...
    99+
    2024-05-21
    c语言
  • 怎么提高Laravel应用程序的速度
    今天小编给大家分享一下怎么提高Laravel应用程序的速度的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。提高 Laravel...
    99+
    2023-07-04
  • C语言 程序的编译系统解析
    目录程序的翻译环境和执行环境编译和链接翻译环境编译的几个阶段预处理编译汇编链接运行环境今天我来补一下C语言篇的程序的编译的一篇文章,也算是有一个结尾了。 程序的翻译环境和执行环境 在...
    99+
    2024-04-02
  • c编译程序指的是什么
    这篇文章给大家分享的是有关c编译程序指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。c编译程序又称c语言编译器,是指用c语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。c编译程序首先会检查源...
    99+
    2023-06-06
  • C语言程序的编译与预处理实例分析
    本篇内容介绍了“C语言程序的编译与预处理实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!程序的翻译环境和执行环境在ANSIC的任何一种...
    99+
    2023-06-30
  • Java编程算法:如何提高Windows下程序的Load速度?
    在Windows系统下,程序的Load速度是非常重要的。如果程序Load速度过慢,将会极大地影响用户的使用体验。因此,程序员们需要关注如何提高程序的Load速度。本文将介绍一些Java编程算法,帮助程序员们提高Windows下程序的Loa...
    99+
    2023-10-27
    load 编程算法 windows
  • 怎么在Ubuntu/Debian Linux上编写、编译和运行一个C程序
    这篇文章给大家分享的是有关怎么在Ubuntu/Debian Linux上编写、编译和运行一个C程序的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。步骤 1: 编写你的 C 程序,并使用一个 .c ...
    99+
    2023-06-15
  • linux中怎么使用gcc编译c语言程序
    在Linux中使用gcc编译C语言程序,可以按照以下步骤操作:1. 打开终端窗口(Terminal)。2. 进入要编译的C语言程序所...
    99+
    2023-09-21
    linux c语言
  • Go编程中的API和HTTP:如何使用算法提高应用程序的速度?
    Go是一种高效的编程语言,特别适用于开发高性能应用程序。其中,API和HTTP是其中最重要的一部分。在这篇文章中,我们将探讨如何使用算法来提高应用程序的速度,并通过演示代码来说明。 首先,让我们来看看API和HTTP的基础知识。API是应...
    99+
    2023-07-23
    编程算法 api http
  • 在C#程序编译另一个程序的实现方法是怎样的
    本篇文章为大家展示了在C#程序编译另一个程序的实现方法是怎样的,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。C#程序编译编译前,要用到VS2005提供的一个编译工具 devenv.exe,这个在VS...
    99+
    2023-06-18
  • 通俗易懂的C语言快速排序和归并排序的时间复杂度分析
    目录快速排序和归并排序的时间复杂度分析——通俗易懂归并排序的时间复杂度分析快速排序的时间复杂度快速排序的最坏情况O(n^2)总结快速排序和归并排序的时间复杂度...
    99+
    2023-01-28
    C语言排序时间复杂度 C语言快速排序归并排序
  • 怎么使用VS2022开发在线远程编译部署的C++程序
    这篇文章主要介绍“怎么使用VS2022开发在线远程编译部署的C++程序”,在日常操作中,相信很多人在怎么使用VS2022开发在线远程编译部署的C++程序问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用V...
    99+
    2023-06-22
  • 利用PHP编程算法,提高HTTP请求的速度和效率。
    随着互联网的不断发展,HTTP请求已经成为了许多网站运行的核心。然而,随着网站访问量的不断增加,传统的HTTP请求方式往往会导致速度和效率的下降。在这种情况下,利用PHP编程算法可以提高HTTP请求的速度和效率,从而提高网站的访问速度和用户...
    99+
    2023-06-16
    http 编程算法 编程算法
  • PHP框架API中的异步编程:能否提高应用程序的响应速度?
    在如今的互联网时代,应用程序的响应速度是用户评估其质量的重要因素之一。为了提高应用程序的响应速度,开发人员通常会采用异步编程技术。PHP作为一种流行的服务器端编程语言,也支持异步编程。在PHP框架API中,异步编程能否提高应用程序的响应速...
    99+
    2023-10-12
    框架 api 异步编程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作