paip.提升用户体验----gcc c++ 编译速度提升by预编译头技术 .doc

本文介绍GCC预编译头技术,通过预编译常用头文件为二进制格式,显著减少编译时间,提升C/C++项目编译效率。实测显示,该技术能极大缩短编译耗时。

paip.提升用户体验----gcc c++ 编译速度提升by预编译头技术  .doc

 

作者Attilax ,  EMAIL:1466519819@qq.com 

来源:attilax的专栏

地址:http://blog.youkuaiyun.com/attilax

 

 

预编译头技术 1

标准情况编译情况: 1

建立公共头文件.AtiH.H 2

预编译头为gch文件 2

测试使用gch文件的情况,提高20倍速度 3

添加参数-Winvalid-pch 4

 

 

预编译头技术

///////////////////////////////////////////////////

所谓预编译头,就是把头文件事先编译成一种二进制的中间格式,供后续的编译过程使用。

——预编译头技术节省时间的原理正在于此,尤其是在这样一个事实下:对源代码的“解析”这个步骤,确实是占了编译时间中 很可观的一部分。

预编译头文件是将一些项目中普遍使用的头文件内容的词法分析、语法分析等结 果缓存在一个特定格式的二进制文件中;当然编译实质 C/C++ 源文件时,就不必从头对这些头文件进行词法-语法分析,而只需要利用那些已经完成词法-语法分析的结果就可以了。

 

事实上,GCC 从 3.4.x 版和 4.x 版开始,也支持了这种提高编译效率的机制。只是由于 GNU CC 的手册 中的《Using Precompiled Headers》一节对此介绍不多,也没有简单的自动项目管理工具支持这项功能,因而许多网友还不知道 GNU CC 的这项功能。

 

可以大大节省时间. ...大部分情况哈,可以减少95%的编译时间..速度提升几十倍.

 

 

标准情况编译情况:

////////////////////////////////////////////////////////////////////

 

我们来看看结果。写一个C++Hello world,使用cout输出一行字。包含了什么头文件?当然是iostream。这个头文件对于人们来说,绝对是熟视无睹级别的。然而使用它的时候,你 注意到编译器幕后的累累“罪行”了吗?是的,用 -H 参数编译一下这个Hello world吧!看看总共加载了多少个头文件?我的机器上,总共103个!

我的main.cpp比较复杂,编译了哈,竟然加载了1600多个文件...

建立公共头文件.AtiH.H

////////////////////////////////////////////////////////////////////////////////

不个常用的头文件提取出来..

#ifndef ATIH_H

#define ATIH_H

#include    <assert.h>

#include    <QApplication>

#include    <qfile.h>

#include    <QMainWindow>

#include    <QObject>

#include    <qstring.h>

#include    <QtCore>

#include    <qtextcodec.h>

#include    <qtextstream.h>

#include    <QtWebKitWidgets>

#include    <QtWidgets>

#include    <QWebFrame>

#include    <QWebView>

#include  <QtCore/QVariant>

#include<QtCore/QVariant>

#endif//ATIH_H

 

其他文件include这个文件AtiH.H..最好放得个最前头..

预编译头为gch文件

/////////////////////////////////////////////////////

是的,你应该将它们做成一个.gch文件。如何做?如前所述,再简单不过:只要编译它就可以了:

g++ xxx.h

做成bat文件加载...

cd D:\qtworkspace\build-qqMicro-Desktop_Qt_5_1_1_mingw_cplus-Debug

g++   -pipe -fno-keep-inline-dllexport -w -H -Winvalid-pch -g -frtti -Wall -Wextra -fexceptions -mthreads -DUNICODE -DQT_QML_DEBUG -DQT_DECLARATIVE_DEBUG -DQT_WEBKITWIDGETS_LIB -DQT_QUICK_LIB -DQT_MULTIMEDIAWIDGETS_LIB -DQT_OPENGL_LIB -DQT_PRINTSUPPORT_LIB -DQT_WEBKIT_LIB -DQT_QML_LIB -DQT_MULTIMEDIA_LIB -DQT_WIDGETS_LIB -DQT_NETWORK_LIB -DQT_SENSORS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -DQT_NEEDS_QMAIN -I..\qqMicro -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtWebKitWidgets" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtQuick" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtMultimediaWidgets" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtOpenGL" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtPrintSupport" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtWebKit" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtQml" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtMultimedia" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtWidgets" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtNetwork" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtSensors" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtGui" -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\include\QtCore" -I"debug" -I"." -I"." -I"..\..\Qt\Qt5.1.1\5.1.1\mingw48_32\mkspecs\win32-g++" ..\qqMicro\atih.h

 

最后生成atiH.h.gch..竟然有131M尺寸...这么大阿..

测试使用gch文件的情况,提高20倍速度

///////////////////////////////////////////////////////////////////////////////////

果然,速度的飞快,原来需要1分钟编译,,,而个只要3秒中...

 

添加参数-Winvalid-pch

////////////////////////////////////////////

如 果.gch不可用,编译器会给出一条警告,告诉我们:这个预编译头不能

 Warn about PCH files that are found but not used

 

参考:

浅谈GCC预编译头技术 - wallwind的专栏 博客频道 - youkuaiyun.com.htm

[转载]GCC使用预编译头文件_panp_新浪博客.htm

### PAIP编程珠玑中的示例代码解释 PAIP(Paradigms of Artificial Intelligence Programming)是一本深入探讨人工智能编程范式的书籍,其中包含了大量 Lisp 编写的程序实例。这些例子不仅展示了如何实现特定的人工智能算法,还提供了关于良好软件工程实践的重要见解。 #### 示例:通用求解器框架 书中介绍了一个名为 `defun` 的宏来定义函数,在构建通用问题解决器时非常有用[^1]: ```lisp (defun solve (problem) "Find a solution to the given problem." (let ((solution nil)) ;; Attempt to find a solution using backtracking. (labels ((try-next-option () (when (not solution) (if (no-more-options-p ()) (return-from try-next-option nil) (let* ((option (next-option))) (cond ((goal-reached-p option) (setf solution option)) (t (push-state option) (solve problem) (pop-state)))))))) (try-next-option) solution))) ``` 这段代码实现了回溯法解决问题的一般模式。通过递归调用自身并尝试不同的选项直到找到解决方案为止。如果当前路径无法通向目标,则会恢复之前的状态继续探索其他可能性。 此方法能够有效地处理许多复杂的组合优化类问题,并且由于其灵活性可以很容易地适应各种具体应用场景下的需求变化。 #### 示例:自然语言理解模块 另一个重要的部分涉及到了自然语言处理技术的应用案例——基于语法分析树结构来进行语义解析: ```lisp (defun parse-sentence (sentence) "Parse SENTENCE into its constituent parts and build an interpretation tree." (multiple-value-bind (subject verb-object) (split sentence 'verb) `(sentence :subject ,(parse-noun-phrase subject) :action ,verb-object))) (defun parse-noun-phrase (np-string) "Interpret NP-STRING as either a simple noun or compound phrase." ...) ``` 上述片段演示了如何将输入字符串分割成主谓宾成分,并进一步解析名词短语的具体含义。这种层次化的表示方式有助于后续更高级别的推理操作以及对话管理等功能的设计与实现。 #### 示例:专家系统规则引擎 最后值得一提的是书中对于专家系统的讨论,特别是有关于事实库管理和匹配机制的部分: ```lisp (defstruct fact id pattern bindings) (defun match-patterns (pattern facts) "Return all FACTS that unify with PATTERN, along with their BINDINGS." ...) (defun add-fact (kb new-fact) "Add NEW-FACT to knowledge base KB after checking consistency against existing rules." ...) ``` 这里展示了一种简单而有效的知识表达形式及其相应的查询接口设计思路。通过对模式进行统一化计算从而快速定位符合条件的事实条目;而在更新数据库前则需确保新加入的信息不会引起逻辑矛盾等问题的发生。 以上仅是从《Programming Pearls》一书摘取的一些精彩片段,实际上该著作涵盖了更为广泛的内容领域和技术细节等待读者去发掘学习。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值