« Поставить закладку » « Сделать стартовой »

« Форумы » « Блоги » « Статьи » « Новости » « Файлы » « Realcoding IRC » « Site map » « Поиск »


Главная Главная
Анонсы Анонсы
Форумы Форумы
Каталог Каталог
Поиск Поиск
Опросы Опросы
Книжный магазин Книжный магазин
Реклама на сайте
Публикации Публикации
Партнеры Партнеры
Карта Карта сайта
Рассылки Рассылки
RSS экспорт
Настройки Настройки
О нас пишут О нас пишут
Контакты Контакты
Гостевая книга Гостевая книга


ПнВтСрЧтПтСбВс
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
    Популярное
Создай язык сам, или конструктор для программиста

Про ПИВО !!!

Глава 4. Классы окон библиотеки MFC

Функция CreatePolygonRgn

Безопасное программирование на языке Perl

Функция GetWindow

Интеграция журнала LiveJournal в персональный сайт

Удобные сокращения при работе с DOM

Метод Callee

Характеристики подсистемы ввода/вывода




    Архив файлов



    Сообщества

    Документация

    Кто на сайте
Вы не зарегистрированы.
Имя:

Пароль:

Запомнить

Регистрация позволит Вам пользоваться дополнительными сервисами.
Сейчас на сайте:
Гостей: 168
Пользователей: 1
  • Zharova

  • Статьи:: C/С++ :: C++ Builder :: С++ Builder: как ускорить компиляцию с помощью предкомпилированных заголовков



    отправить ссылку другу версия для печати  Обсудить на форуме

    С++ Builder: как ускорить компиляцию с помощью предкомпилированных заголовков

    Вместо вступления сразу приведу пример. Полная сборка (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 <vcl.h>
    
    #include <string>
    #pragma hdrstop

    Такая последовательность создаст образ, содержащий скомпилированные vcl.h и string. Этот образ будет использован для другого cpp-файла, если в нем до директивы hdrstop будут включены те же файлы, в том же порядке. Обращу внимание, что важен не только состав, но и порядок следования заголовков - даже если следующий cpp-файл включает те же заголовки, но сначала указан string, а потом vcl.h, то для этого cpp-файла будет создан новый образ.

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

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

    Сократить затраты на компиляцию стандартных заголовков до минимума можно только в том случае, если скомпилировать один образ, содержащий все стандартные заголовки, необходимые для проекта. Для этого нужно, чтобы:
     
      - ВСЕ cpp-файлы проекта имели одинаковый блок включений до директивы hdrstop
      - в этот блок должны входить ВСЕ стандартные заголовочные файлы, необходимые для проекта
       

    Выполнить эти условия достаточно просто, для этого в начало каждого cpp-файла необходимо поместить следующие строки:
     
    #include <pch.h>
    
    #pragma hdrstop

    где pch.h - файл, содержащий включения всех стандартных заголовков:
     
    #ifndef PCH_H
    
    #define PCH_H

    #define INC_VCLDB_HEADERS
    #define INC_VCLEXT_HEADERS
    #include <vcl.h>

    #include <sysset.h>
    #include <IniFiles.hpp>
    #include <AppEvnts.hpp>
    #include <ActnMan.hpp>
    ...
    #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 <vcl.h>   
    
    #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 <vcl.h>
    #include <string>
    ...

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

    В принципе, при использовании 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 <vcl.h>
    /* Все, что подключается предыдущими 3-мя строчками
    // Core (minimal) Delphi RTL headers
    #include <System.hpp>
    #include <Types.hpp>
    #include <Windows.hpp>
    #include <Messages.hpp>
    #include <SysUtils.hpp>
    #include <Classes.hpp>

    // Core (minimal) VCL headers
    #if defined(INC_VCL)
    #include <Controls.hpp>
    #include <Graphics.hpp>
    #include <Forms.hpp>
    #include <Dialogs.hpp>
    #include <StdCtrls.hpp>
    #include <ExtCtrls.hpp>

    // VCL Database related headers
    #if defined(INC_VCLDB_HEADERS)
    #include <DBCtrls.hpp>
    #include <DB.hpp>
    #include <DBTables.hpp>
    #endif // INC_VCLDB_HEADERS

    // Full set of VCL headers
    #if defined(INC_VCLEXT_HEADERS)
    #include <Buttons.hpp>
    #include <ChartFX.hpp>
    #include <ComCtrls.hpp>
    #include <DBCGrids.hpp>
    #include <DBGrids.hpp>
    #include <DBLookup.hpp>
    #include <DdeMan.hpp>
    #include <FileCtrl.hpp>
    #include <GraphSvr.hpp>
    #include <Grids.hpp>
    #include <MPlayer.hpp>
    #include <Mask.hpp>
    #include <Menus.hpp>
    #include <OleCtnrs.hpp>
    #include <OleCtrls.hpp>
    #include <Outline.hpp>
    #include <Tabnotbk.hpp>
    #include <Tabs.hpp>
    #include <VCFImprs.hpp>
    #include <VCFrmla1.hpp>
    #include <VCSpell3.hpp>
    #endif // INC_VCLEXT_HEADERS

    #endif // INC_VCL
    */

    #include <sysset.h>
    #include <IniFiles.hpp>
    #include <AppEvnts.hpp>
    #include <ActnMan.hpp>
    #include <ActnCtrls.hpp>
    #include <BandActn.hpp>
    #include <CustomizeDlg.hpp>
    #include <ImgList.hpp>
    #include <ToolWin.hpp>
    #include <ExtDlgs.hpp>
    #include <ActnList.hpp>

    #include <IBDatabase.hpp>
    #include <IBCustomDataSet.hpp>
    #include <IBQuery.hpp>
    #include <IBTable.hpp>
    #include <IBSQL.hpp>
    #include <IBServices.hpp>

    #include <math.h>
    #include <assert.h>
    #include <complex.h>
    #include <values.h>

    #include <map>
    #include <list>
    #include <set>
    #include <vector>
    #include <algorithm>
    #include <functional>
    #include <string>
    #include <memory>
    #include <fstream>

    //нестандартные компоненты 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


    О вышеизложенном
    Если по поводу изложенного материала есть вопросы и замечания, то я готов их принять - пишите seb.goo@gmail.com.

    Автор: Серебров Борис
    Источник: www.people.overclockers.ru




    Рубрика: C++ Builder




    HTML 5: пять вещей вызывающих особый интер....

    Html

    HTML 5 — это грядущее обновление гипертекстового языка разметки, основного способа создания контента для размещения его во всемирной паутине. Разработка HTML остановилась в 1999 году, на версии HTML 4.01 и с тех пор web-содержимое изменилось так, что текущие спецификации HTML перестали соответствовать сегодняшним требованиям. HTML 5 нацелен на то, чтобы увеличить функциональную совместимость HTML и соответствовать растущим требованиям разнообразного и смешанного web-контента. HTML 5 так же нацелен на устранение недостатков четвертой версии. В этой статье мы взглянем на 5 новых интересных вещей в HTML 5.


    Подробнее... | Рубрика: Html | Добавлено: 22.12.2008

    asp.net: ListView с разных сторон.

    .NET компоненты

    Элемент управления ListView был представлен в .Net Framework 3.5 как замена устаревшему GridView. Новый элемент имеет более расширенный функционал, чем его предшественник, но в тоже время лишен некоторых внутренних механизмов, что впрочем целиком следствие из расширенной универсальности ListView. Среди отличий ListView и GridView можно назвать и гибкую настройку разметки, что позволяет выводить данные не только в табличном виде, но и вообще в любом каком пожелает программист. Благодаря шаблонам ItemTemplate, EditItemTemplate, InsertItemTeplate можно настроить внешний вид при любом из состояний ListView: редактировании или выборе элемента.


    Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

    Создание кросс-таб отчета в Stimulsoft Rep....

    .NET компоненты

    Компания Стимулсофт предоставляет для разработчиков мощный набор инструментов для создания отчетов для Microsoft Visual Studio .Net 2005 и 2008; эти инструменты доступны как для Windows Forms, так и для Web Forms. Это генератор отчетов Stimulsoft Reports.Net. Генератор отчетов Stimulsoft Reports.Net имеет ряд особенностей: простая работа с дизайнером отчетов, полная поддержка экспорта в PDF, Word, Excel и многие другие форматы. Crystal Report и Microsoft Reporting Service – очень хорошие программные продукты для повседневной работы, но, если Вам необходимо создать отчеты с поддержкой кросс-табов, drill down, Ajax, штрих-кодов и возможностью подключения одновременно более одного источника данных, то Stimulsoft Reports.Net поможет Вам сэкономить массу времени. Также, данный генератор отчетов позволяет пользователям создавать свои собственные отчеты любой сложности. И все эти особенности делают Stimulsoft Reports.Net хорошим выбором в сфере программных продуктов для Business Intelligence.


    Подробнее... | Рубрика: .NET компоненты | Добавлено: 22.12.2008

    Остальные статьи:

    VivaMP - инструмент для OpenMP
    Создаем контекстно-зависимое WPF-приложени...
    Windows Vista SP2: что внутри и что важно?
    Вышел MySQL 5.1.30, первый стабильный рели...
    Тестирование параллельных программ
    Архитектура AMD64 (EM64T)
    Платформа 2009. Определяя будущее
    Windows Vista Bridge Sample Library - упра...
    Оптимизация 64-битных программ
    Подгрузка через AJAX HTML-кода, содержащег...
    Обзор нового релиза самой мощной Ajax библ...
    Firebug 1.3 и 1.4 alpha — что нового и инт...
    Релиз Microsoft Silverlight 2.0. Что новог...
    XML документация в C#
    Курсоры в MySQL 5
    Microsoft опубликовала подробности о сесси...
    Microsoft делится подробностями о том, что...
    Тестируем новый javascript от нового брауз...
    MySQL Query Cache
    Использование провайдеров компиляции в As...


    Цитата дня (все,добавить):

    Портал фрилансеров

    работа на дому


        Рубрикатор

    Программирование

    C/С++
    Обучение
    Windows API
    XAML
    Моделирование
    Паттерны
    Visual Basic 7 .NET
    WxWidgets
    Функции WinApi
    Функции С++
    Разработка под Mac OS
    Eiffel
    Visual Studio 2008
    UI дизайн
    Алгоритмы
    Конкурсные статьи
    Turbo Pascal
    Visual Studio
    CASE-средства
    Visual Studio 2005
    Без VCL
    Delphi
    Тех. документация
    Тестирование
    Software Testing
    ООП
    TCP/IP
    Google Android
    Windows Installer
    .NET Framework
    Драйвера
    C# C Sharp
    Справка
    Проектирование
    Информ. системы
    Visual Basic
    Assembler
    Оптимизация кода
    Gtk+
    Компоненты
    Реинжиниринг
    Управление проектами
    Extreeme programming
    Lotus Notes
    Алгебраическое проектирование


    Интернет технологии

    PHP
    Perl
    ASP
    WAP
    Cookies
    SSI
    CGI
    Web Servers
    VB Script
    DNS
    CSS
    XML
    Html
    Java Script
    Java2ME
    Firewall
    Flash
    .htaccess
    Apache
    VRML
    Протоколы
    Поисковые системы
    Технология JAVA
    Учебник по PHP
    Учебник по JavaScript
    Учебник по XML
    Java Q&A
    AJAX
    DHTML
    XHTML
    Dreamweaver
    Web 2.0
    Python
    Вебмастеру
    Cisco
    Ruby on Rails
    Silverlight

    Базы данных

    Access
    InterBase
    MySQL
    Oracle
    ADO .NET
    Основы SQL
    Учебник по Access 2002
    MS
    Microsoft FoxPro
    Доступ к данным
    XML в MS SQL Server 2000
    ODBC и MyODBC
    Обучение
    Caché
    DB2
    PostgresSQL
    Sybase
    Теория
    Хранилища данных
    Безопасность
    Реляционные данные
    MySQL и mSQL

    Остальное:

    Разное
    Обзоры книг
    Безопасность
    Графика и дизайн
    Юмор
    Linux
    Фракталы
    Microsoft Axapta
    Многоядерность
    Сети
    Microsoft Office
    Работа
    MS-DOS
    Криптография
    Графика и игроделание
    Новости SDK
    Системы защиты
    Учебник по AutoCad
    CVS
    Windows XP
    Windows Server 2003
    Windows Vista
    Windows 7
    Мероприятия