維's profileIT : 是工作還是嗜好?PhotosBlogListsMore Tools Help

Blog


    April 21

    善用C++Builder 2009的Pre-Compiled header精靈

    也許是我的記憶已經很模糊了,我記得在C++Builder 5時能夠提供了背景編譯的能力,允許BCB的開發人員在IDE中編譯專案時能夠啟動在背景編譯,如此一來BCB的開發人員就可以在等待BCB編譯專案的同時在IDE中執行一些其他的工作,BCB之所以提供這個功能實則是因為C++是一個3-pass的編譯器,因此需要遠多於One-Pass的Delphi編譯器更多的編譯時間。但當時BCB 5的背景編譯有許多的限制,例如開發人員無法異動正在編譯中的專案,也無法異動編譯專案的圖形使用者介面設計等,因此大部份BCB開發人員使用背景編譯編譯BCB專案時,大都是在BCB的IDE中對其他的專案進行同時開發的工作。

    另外一個BCB非常重要的功能就是Code Insight,這個功能能夠幫助開發人員大幅減少需要撰寫打字的程式碼,進而增加開發的生產力。但是我知道很多BCB的開發人員關閉了這項功能,因為在早期的BCB版本中這個功能實在太慢了,導致許多BCB的開發人員抱怨為什麼BCB無法像Delphi的Code Insight一樣那麼的快速。其實BCB的Code Insight太過緩慢的問題我個人也是感同身受,因為我記得每次在做BCB的活動時,為了避免在BCB編輯器中撰寫程式碼反應太過緩慢的問題,我也都是關閉了BCB的Code Insight功能。


     
    最後一個我要討論的問題就是BCB的Pre-Compiler Header了,雖然BCB很早就提供了Pre-Compiler Header功能以加快編譯速度,但老實說早期BCB提供的Pre-Compiler Header雖然的確能夠幫助開發人員加快編譯速度,但這個Pre-Compiler Header在C++Builder 2009之前已經有數年沒有改善了,因此仍然有很大的進步空間。

    OK,看到這裡您可能會想,為什麼同時敘述上述的三個問題呢?是它們有什麼共點嗎?不然這篇文章到目前看起來是令人摸不著頭緒的。OK,現在就讓我們回到本篇文章的正題。

    下圖是我在RAD Studio 2009中的一個範例BCB專案,在沒有使用新的Pre-Compiled header精靈之前,在第一次編譯這個C++Builder專案時RAD Studio仍然會為這個專案建立Pre-Compiled header,如此一來當開發人員稍後再次編譯這個專案時,編譯速度就會加快。例如如果我修改下圖中的
    this->Button1->Caption = "test";

    this->Button1->Caption = "測試";

    接著再次編譯,那麼此時C++Builder 2009需要再次編譯21281行的程式碼,雖然整個編譯速度算是相當快速,但仍然令人奇怪,為什麼只是修改一行的程式碼卻需要編譯21281行。


    其實仔細觀察原始程式就可以發現問題所在,因為在原始程式中存在如下的程式碼:
    #include <vcl.h>
    #pragma hdrstop
    #include "SecondForm.h"
    #include "MainForm.h"
    舊的BCB Pre-Compiled header精靈只把VCL.H相關的程式碼預先編譯,但再看看原始程式的表頭檔,我們卻發現了下面的程式碼:
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    #include <DB.hpp>
    #include <DBCtrls.hpp>
    #include <DBGrids.hpp>
    #include <ExtCtrls.hpp>
    #include <Grids.hpp>

    問題似乎就出現在這裡,因此我們需要一個能夠分析整個專案的Pre-Compiled header精靈幫助我們產生最佳的預先編譯表頭資訊,並且能夠讓開發人員進行客製化的調整。

    C++Builder 2009新的Pre-Compiled header精靈就可以幫助我們完成這些工作,讓我們現在就來看看它的功效如何。
    首先點選Tools|Pre-Compiled header Wizard…功能表啟動精靈,如下圖所示,如果你是第一次使用這個精靈,那麼請選擇第一個選項為專案進行一次完整的分析:

     
    在精靈成功分析之後,它會顯示如下的對話盒,詢問你客製化的設定,例如你可以設定要包含那些表頭檔或是排除特定的表頭檔。
     
    點選『Next>>』按鈕之後會顯示最後精靈進行的設定,它決定了預先編譯表頭檔中包含的資訊:
     
    繼續點選『Next>>』按鈕,最後BCB會產生一個新的表頭檔pch1.h,例如在我的範例中最後的pch1.h包含如下的資訊:
    /*
      This precompiled header include file was generated on 2009/4/21 下午 03:00:09
      by the RAD Studio Precompiled Header Wizard with the following settings:

      Project: G:\MyBogs\20090421\Demos\pBCBDemo.cbproj
      AllowUnguarded = 0
      ExcludeProjectFiles = -1
      IncludePathsOn = -1
      IncludePaths =
      ExcludePaths =
      IncludeCount = 1
      ManageHeader = -1
    */

    #ifndef pch1_H
    #define pch1_H
    #include <vcl.h>
    #include <tchar.h>
    #include <DB.hpp>
    #include <DBClient.hpp>
    #include <DBGrids.hpp>
    #include <DBXMsSQL.hpp>
    #include <Provider.hpp>
    #include <SqlExpr.hpp>
    #include <DBXInterbase.hpp>
    #endif

    在精靈產生了pch1.h並且加入到專案之中後,請先進行一次完整的專案Build讓BCB編譯器建立新的預先編譯表頭檔。有了新的預先編譯表頭檔之後如果我再回到前面修改:
    this->Button1->Caption = "測試";

    this->Button1->Caption = "第2次測試";

    接著選擇make專案,那麼現在BCB只會編譯86行的程式碼,比使用舊的預先編譯方式快了好幾倍的速度
    更棒的是,使用新的Pre-Compiled header精靈之後由於它會產生最佳化的表頭資訊,因此此時如果你再使用BCB的Code Insight,你會發現Code Insight快速的不得了,例如在我的機器中此時再使用BCB的Code Insight功能,它的反應速度幾乎和Delphi的Code Insight一樣快了現在再也不需要關閉BCB的Code Insight功能了

    BTW,RAD Studio 2009的Update 3不但修改了許多的臭蟲,IDE的速度又加快了不少,例如對於相同的BCB專案,使用Update 3的編譯速度硬是比Update 1和Update 2又快了許多,絕對建議您儘快昇級到Update 3。

    OK,解決了預先編譯和Code Insight的問題之後,最後就是BCB的背景編譯了,在C++Builder 2006/2007/2009中背景編譯都被移除了,因為舊的背景編譯限制太多,在BCB 5那時沒有多核CPU的時代,舊的背景編譯架構也無法利用現在最新的多核CPU,不過我知道下一版的BCB也許將提供全新的背景編譯技術,不但速度快,限制又少,甚至可以讓開發人員在背景編譯專案的同時又進行相同專案的持續開發,這對於大型的BCB專案來說實在太棒了。

    試著想想,未來在BCB中我們將可結合預先編譯表頭,背景編譯和快速的Code Insight,那麼使用BCB來進行C++專案的開發將會非常的愉快,因為如此一來BCB即可讓C++的開發人員享受類似Delphi,C#和Java等快速開發的環境了

    Comments (7)

    Please wait...
    Sorry, the comment you entered is too long. Please shorten it.
    You didn't enter anything. Please try again.
    Sorry, we can't add your comment right now. Please try again later.
    To add a comment, you need permission from your parent. Ask for permission
    Your parent has turned off comments.
    Sorry, we can't delete your comment right now. Please try again later.
    You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
    Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
    Complete the security check below to finish leaving your comment.
    The characters you type in the security check must match the characters in the picture or audio.

    To add a comment, sign in with your Windows Live ID (if you use Hotmail, Messenger, or Xbox LIVE, you have a Windows Live ID). Sign in


    Don't have a Windows Live ID? Sign up

    RUwrote:
    也希望能增加一些demo可以參考…
    例如cb中已經沒有indy的demo了,想研究的人還真不知從何下手

    不知李老師是否能丟一些簡單的demo出來呢?
    不然挫折感實在太大了呀~~~~~

    (雖然…會的人好像也不少,是天才太多,還是我的資質太差…@@)
    Apr. 22
    維 李wrote:
    >Delphi 2009 Update 3 is literally days away now.

    就是說Delphi Update 3/4已經快出了啦, 看了http://www.delphi.org/2009/04/27-nick-hodges-rd-manager/ 之後應該更確定月底之前沒問題了
    Apr. 22
    James 縹緲wrote:
    剛看到 Nick Hodges 這篇
    http://www.delphi.org/2009/04/27-nick-hodges-rd-manager/
    好像 Update3 已經出了一樣
    剛剛才用 Filezilla 下載 12.0.3390.20513.4 這個 build 說...4/19 的版本,不知道是不是最後一個 build
    Apr. 22
    維 李wrote:
    >RAD Studio 2009的Update 3.....一直好像是個謎團,官網上從來沒有正式發佈過,倒是網路上傳了一堆,有人還說裝完 help->about 中會變成 Update4,沒個準,只敢待在 Update2 觀望中

    Update 3還在Beta中, 我最近也才拿到, 我想這個月底之前Update 3/Update 4就會正式推出了.
    Apr. 22
    James 縹緲wrote:
    好久不見新文章了說....沒想到內容是很久沒談過的 BCB
    看到網路上有 Delphi 2010 的測試版,也蠻癢的想下載來玩玩,還說相容性比 Delphi2009 好很多,很多 component 可以直接從 D2007 的版本升級上來不用改,不過近來 Delphi 改版有點眼花撩亂,才把 D2009 安裝好了,相關 3-Party 的的元件也備便了,準備好好拿來寫程式了說
    RAD Studio 2009的Update 3.....一直好像是個謎團,官網上從來沒有正式發佈過,倒是網路上傳了一堆,有人還說裝完 help->about 中會變成 Update4,沒個準,只敢待在 Update2 觀望中
    Apr. 22
    維 李wrote:
    >這麼說來,是指DELPHI RAD STUDIO 2010要準備出版了嗎………

    還早吧, 每年BCB/Delphi大概都是年底左右出吧, 我只是從BCB/Delphi的Roadmap以及一些CG的人的談話中推測的
    Apr. 22
    RUwrote:
    「OK,解決了預先編譯和 Code Insight的問題之後,最後就是BCB的背景編譯了,在C++Builder 2006/2007/2009中背景編譯都被移除了,因為舊的背景編譯限制太多,在BCB 5那時沒有多核CPU的時代,舊的背景編譯架構也無法利用現在最新的多核CPU,不過我知道下一版的BCB也許將提供全新的背景編譯技術,不但速度快,限制又少,甚至可以讓開發人員在背景編譯專案的同時又進行相同專案的持續開發,這對於大型的BCB專案來說實在太棒了。」
    這麼說來,是指DELPHI RAD STUDIO 2010要準備出版了嗎………
    Apr. 22

    Trackbacks

    The trackback URL for this entry is:
    http://gordonliwei.spaces.live.com/blog/cns!CCE1F10BD8108687!3379.trak
    Weblogs that reference this entry
    • None