ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Як прискорити компіляцію за допомогою предкомпілірованних заголовків в С + + Builder
         

     

    Інформатика, програмування

    Як прискорити компіляцію за допомогою предкомпілірованних заголовків в С + + Builder

    Серебров Борис

    Precompiled headers can dramatically increase compilation speeds ...

    С + + Builder Language Guide

    Замість вступу відразу наведу приклад. Повна збірка (build) проекту, що містить близько 170 cpp-модулів, при використанні предкомпілірованних заголовків відбувається за 811 секунд, при цьому число оброблених компілятором строк становить 1,808,780. При компіляції того ж проекту без використання предкомпілірованних заголовків, час збирання складає 2399 секунд, а кількість рядків, оброблених компілятором - 45,261,820. Вражає, чи не так? Плата за це прискорення, в принципі не велика -- предкомпілірованний образ, розмір якого близько 40 Мб.

    При компіляції вихідних текстів, компілятор повинен обробити всі *. cpp файли проекту і всі включені в них *. h - файли. При цьому обробляються як налаштовані заголовки, так і стандартні, такі як vcl.h або Word2k.h. Кількість коду, що знаходиться в стандартних заголовках може бути дуже великим, наприклад розмір файлу Word2k.h перевищує 5 Мб, у ньому більше 130 000 рядків коду.

    Так як вміст стандартних заголовків НЕ змінюється, то їх компіляція при кожній складання проекту є марною тратою часу. Предкомпілірованние заголовки допомагають вирішити цю проблему -- стандартні файли компілюються один раз, а потім використовується скомпільований двійковий образ.

    Принцип дії предкомпілірованних заголовків

    Для управління предкомпілірованнимі призначена директива компілятора # pragma hdrstop. Всі заголовки, включені до цієї директиви, поміщаються в один образ, наприклад:

    # include

    # include

    # pragma hdrstop

    Така послідовність створить образ, що містить скомпільовані vcl.h і string. Цей образ буде використаний для іншого cpp-файлу, якщо в ньому до директиви hdrstop будуть включені ті ж файли, в тому ж порядку. Зверну увагу, що важливий не тільки склад, а й порядок проходження заголовків - навіть якщо наступний cpp-файл включає ті ж заголовки, але спочатку зазначений string, а потім vcl.h, то для цього cpp-файла буде створено новий образ.

    Таким чином, для повторного використання предкомпілірованного заголовка необхідно виконання двох умов:

    - склад включений файлів до директиви hdrstop повинен бути тим же

    - послідовність включення файлів до директиви hdrstop повинна бути тієї ж

    Скоротити витрати на компіляцію стандартних заголовків до мінімуму можна тільки в тому випадку, якщо скомпілювати один образ, що містить всі стандартні заголовки, необхідні для проекту. Для цього потрібно, щоб:

    - ВСЕ cpp-файли проекту мали однаковий блок включений до директиви hdrstop

    - до цього блоку мають входити ВСЕ стандартні заголовки, необхідні для проекту

    Виконати ці умови досить просто, для цього в початок кожного cpp-файлу необхідно помістити наступні рядки:

    # include

    # pragma hdrstop

    де pch.h - файл, що містить включення всіх стандартних заголовків:

    # ifndef PCH_H

    # define PCH_H

    # define INC_VCLDB_HEADERS

    # define INC_VCLEXT_HEADERS

    # include

    # include

    # include

    # include

    # include

    ...

    # endif

    Повний текст моєї версії цього файлу наведений у кінці статті. На h-файли, що входять до предкомпілірованний образ, накладається обмеження - у них не повинно бути ініціалізований даних, наприклад, у math.hpp є рядки:

    static const Extended NaN = 0.0/0.0;

    static const Extended Infinity = 1.0/0.0;

    Через наявність цих констант включити math.hpp в файл pch.h не можна.

    До речі, С + + Builder при додаванні нових модулів в проект реалізує описану стратегію управління предкомпілірованнимі заголовками. Наприклад, при створенні нової програми, файл Unit1.cpp буде таким:

    # include

    # pragma hdrstop

    # include "Unit1.h"

    ....

    Якщо подивитися на текст vcl.h, то можна побачити, що він є оболонкою для включення великої кількості інших стандартних заголовків файлів.

    Керувати складом що включаються в vcl.h заголовків можна за допомогою спеціальних символів (INC_VCLDB_HEADERS, INC_VCLEXT_HEADERS та ін.) У моїй версії pch.h ці символи визначаються за допомогою # define до включення vcl.h, що призводить до збільшення числа включаються файлів.

    Як в існуючому проекті перейти до використання предкомпілірованних заголовків

    Навіть у великому проекті перейти до використання предкомпілірованних заголовків досить просто.

    У властивостях проекту потрібно включити кешування предкомпілірованних заголовків і рекомендується вказати "персональний" файл, в якому буде зберігатися образ предкомпілірованних заголовків: Project -- Options - закладка Compiler, група "Pre-compiled headers". Тут повинно бути вибрано "Cache pre-compiled headers", а в полі "File Name "потрібно ввести" pch.csm ". При такій настройці образ з предкомпілірованнимі заголовками буде знаходиться в папці з проектом, у файлі pch.csm.

    Після цього на початку кожного cpp-модуля необхідно вставити 2 рядки:

    # include "pch.h"

    # pragma hdrstop

    Всі раніше включені заголовки залишаються на своїх місцях, їх видаляти не треба. Наприклад:

    # include "pch.h"// включає vcl.h, string і т.д.

    # pragma hdrstop

    # include

    # include

    ...

    Так як у всіх стандартних заголовках застосовуються варти повторного включення, то повторний їх згадка не тягне за собою повторного включення.

    У принципі, при використанні pch.h, технічна потреба у включенні стандартних заголовків зникає. Однак, корисно все ж вказувати всі необхідні для кожного конкретного модуля заголовки нижче директиви # pragma hdrstop. По-перше, це певною мірою документує модуль - по включаються файлів можна судити, якими можливостями користується цей модуль. По-друге, це полегшує повторне використання модуля в інших проектах, в яких або не використовується pch.h, або його вміст може бути іншим.

    Теоретично можна ще більше підвищити ефективність компіляції, якщо включити в pch.h не тільки стандартні, але й усі призначені для користувача заголовки. Практично, так як налаштовані заголовки міняються досить часто, це може спричинити за собою часту перекомпіляції pch.h, що негативно позначиться на часу компіляції. Крім того, призначені для користувача заголовки зазвичай не бувають дуже великими і компілюються дуже швидко. Тому включати їх pch.h не доцільно.

    Як перевірити, що предкомпілірованние заголовки використовуються ефективно

    При додаванні в проект нових файлів потрібно не забувати включати до них pch.h, інакше для них не буде використаний загальний предкомпілірованний образ. Така ж ситуація може виникнути, якщо в якомусь модулі включаються стандартні заголовки, які не увійшли до pch.h. Для того, щоб відстежити такі файли, є кілька способів:

    - візуальне спостереження за процесом компіляції. Зазвичай, кількість стрічок компільованих в одному файлі не повинно перевищувати 10000-15000 строк

    - якщо для проекту вибрано індивідуальний файл для зберігання образу предкомпілірованних заголовків і цей файл називається pch.csm, то потрібно звернути увагу на наявність допоміжних файлів з іменами pch. # 00, pch. # 01 і т.д. Якщо для всіх файлів проекту використовується один і той же предкомпілірованний образ, то допоміжний файл повинен бути тільки одна -- pch. # 00. Якщо таких файлів більше, це означає що для якихось cpp-модулів створюються додаткові образи.

    Текст pch.h

    # ifndef PCH_H

    # define PCH_H

    # define INC_VCLDB_HEADERS

    # define INC_VCLEXT_HEADERS

    # include

    /* Все, що підключається попередніми 3-ма рядками

    // Core (minimal) Delphi RTL headers

    # include

    # include

    # include

    # include

    # include

    # include

    // Core (minimal) VCL headers

    # if defined (INC_VCL)

    # include

    # include

    # include

    # include

    # include

    # include

    // VCL Database related headers

    # if defined (INC_VCLDB_HEADERS)

    # include

    # include

    # include

    # endif// INC_VCLDB_HEADERS

    // Full set of VCL headers

    # if defined (INC_VCLEXT_HEADERS)

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # endif// INC_VCLEXT_HEADERS

    # endif// INC_VCL

    */

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    # include

    // нестандартні компоненти RxLib і EhLib

    # include "CURREDIT.hpp"

    # include "RXSpin.hpp"

    # include "RxCalc.hpp"

    # include "RxCombos.hpp"

    # include "APPUTILS.hpp"

    # include "RXDBCtrl.hpp"

    # include "Placemnt.hpp"

    # include "DBGridEh.hpp"

    # endif

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.realcoding.net/

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status