Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Команда

Читайте также:
  1. quot;Призрак бродит по Европе. Как забродит - будем гнать!" Команда КВН МАГМА
  2. Без справок и медицинской книжки руководителя - команда к участию в смене не допускается.
  3. В плей-офф турнира, в следующую стадию проходит команда одержавшая победу.
  4. Вместе как команда
  5. Вопрос 2. Команда – разновидность коллектива.
  6. Глава 7. Ваша команда. Участие в турнирах
  7. Для построения отделения в двухшереножном строю подается команда: “Отделение в две шеренги - СТАНОВИСЬ”.

[команда2]

[командаN]

Цель обычно представляет собой имя файла, генерируемого программой make; примерами

целей являются исполняемые или объектные файлы. Цель может также быть именем

выполняемого действия, как, например, clean.

Зависимость – это файл, используемый как вход для порождения цели. Часто цель зависит от нескольких файлов.

Команда – это действие, выполняемое утилитой make. Правило может иметь более чем одну команду, каждую на своей собственной строке. Внимание: каждая строка, содержащая команду, должна начинаться с символа табуляции. Обычно команда употребляется в правиле с зависимостями и служит для создания целевого

файла, если какая-либо из зависимостей изменилась.

Пример простейшего make-файла:

main.o: main.cpp

g++ -c main.cpp

Он содержит правило для make, указывающее на необходимость вызова компиляции файла main.cpp в файл main.o при изменении файла main.cpp.

Правило, в котором цель зависит от нескольких файлов:

10_Make_Qt: main.o numerical.o text_statistics.o

g++ main.o numerical.o text_statistics.o -o 10_Make_Qt

Когда цель является файлом, этот файл должен быть перекомпилирован или перекомпонован, если изменилась любая из его зависимостей. Кроме того, любые зависимости, которые

автоматически генерируются, должны обновляться первыми. В этом примере 10_Make_Qt

зависит от каждого из 3 объектных файлов; объектный файл numerical.o зависит от исходного файла numerical.cpp и заголовочного файла numerical.h. Перед тем как вызовом компоновки (команда цели 10_Make_Qt) будет скомпилированы все файлы, которые изменились споследней компиляции.

 

 

Создание библиотек пользователя.

11. Оптимизация кода – алгоритмы, методы и приемы программирования.

Оптимизация — модификация системы для улучшения её эффективности. Система может быть одиночной компьютерной программой, набором компьютеров или даже целой сетью, такой как Интернет.

Хотя целью оптимизации является получение оптимальной системы, истинно оптимальная система в процессе оптимизации достигается далеко не всегда. Оптимизированная система обычно является оптимальной только для одной задачи или группы пользователей: где-то может быть важнее уменьшение времени, требуемого программе для выполнения работы, даже ценой потребления большего объёма памяти; в приложениях, где важнее память, могут выбираться более медленные алгоритмы с меньшими запросами к памяти.Более того, зачастую не существует универсального решения, которое работает хорошо во всех случаях, поэтому инженеры используют компромиссные (англ. tradeoff) решения для оптимизации только ключевых параметров. К тому же, усилия, требуемые для достижения полностью оптимальной программы, которую невозможно дальше улучшить, практически всегда превышают выгоду, которая может быть от этого получена, поэтому, как правило, процесс оптимизации завершается до того, как достигается полная оптимальность. К счастью, в большинстве случаев даже при этом достигаются заметные улучшения.

Уровни оптимизации:

Алгоритмический - выбор правильного алгоритма и структур данных.

Уровень исходного кода - избегание очевидно неудачных решений, расходующих ресурсы и замедляющих работу.

Оптимизация компилятора - модификация программ, выполняемая оптимизирующими компиляторами или интерпретаторами с целью повышения производительности или компактности программ без изменения их функциональности.

Низкоуровневая оптимизация:

● Оптимальный выбор (замена, объединение, разделение) инструкций

● Переупорядочивание инструкций

● Распределение регистров

● Удаление цепочек переходов

● Векторизация

● Понижение силы операций

Высокоуровневая оптимизация:

● Удаление недосягаемого («мёртвого») кода и неиспользуемых присвоений

● Подгонка, обращение циклов

● Оптимизация множественных ветвлений

● Развёртка, свёртка, объединение и разделение циклов

● Вычисление инвариантов циклов, вынесение общих подвыражений и кода в ветвлениях, вынесение ветвлений из циклов

● Переключение, объединение и разделение ветвлений

● Предвыборка данных

● Переупорядочивание функций

● Встраивание и извлечение функций

 

Оптимизации на уровне машинного кода - использование ассемблерных вставок, подпрограмм.

Оптимизация в основном фокусируется на одиночном или повторном времени выполнения, использовании памяти, дискового пространства, пропускной способности или некотором другом ресурсе. Это обычно требует компромиссов — один параметр оптимизируется за счёт других. Например, увеличение размера программного кеша чего-либо улучшает производительность времени выполнения, но также увеличивает потребление памяти. Другие распространённые компромиссы включают прозрачность кода и его выразительность, почти всегда ценой деоптимизации. Сложные специализированные алгоритмы требуют больше усилий по отладке и увеличивают вероятность ошибок.

 

Простейшие приёмы оптимизации программ по затратам процессорного времени:

Инициализация объектов данных - Во многих программах какую-то часть объектов данных необходимо инициализировать, то есть присвоить им начальные значения. Такое присваивание выполняется либо в самом начале программы, либо, например, в конце цикла. Правильная инициализация объектов позволяет сэкономить драгоценное процессорное время. Так, например, если речь идет об инициализации массивов, использование цикла, скорее всего, будет менее эффективным, чем объявление этого массива прямым присвоением.

 

Программирование арифметических операций - в том случае, когда значительная часть времени работы программы отводится арифметическим вычислениям, немалые резервы повышения скорости работы программы таятся в правильном программировании арифметических (и логических) выражений. Важно, что различные арифметические операции значительно различаются по быстродействию. В большинстве архитектур, самыми быстрыми являются операции сложения и вычитания. Более медленным является умножение, затем идёт деление. Например, вычисление значения выражения (x/a), где а - константа, происходит быстрее в виде x*b, где b = 1/a. Для целочисленного x выражение 2x быстрее вычисляется в виде x+x или с помощью сдвига влево.Подобные оптимизации называют понижением силы операций.

Фуннкции - Относительно много времени тратится на обращение к подпрограммам (передача параметров через стек, сохранение регистров и адреса возврата, вызов конструкторов копирования). Если подпрограмма содержит малое число действий, она может быть реализована подставляемой (англ. inline) — все её операторы копируются в каждое новое место вызова (существует ряд ограничений на inline-подстановки: например, подпрограмма не должна быть рекурсивной). Это ликвидирует накладные расходы на обращение к подпрограмме, однако ведет к увеличению размера исполняемого файла.

Циклы - Различается и время выполнения циклов разного типа. Время выполнения цикла со счетчиком и цикла с постусловием при всех прочих равных условиях совпадает, цикл с предусловием выполняется несколько дольше (примерно на 20-30 %). При использовании вложенных циклов следует иметь в виду, что затраты процессорного времени на обработку такой конструкции могут зависеть от порядка следования вложенных циклов. for(int i = 0; i<10000; ++i) for (int i = 0; i<1000; ++i)

for (int j = 0; j<1000; ++j) for(int j = 0; j<10000; ++j)

a = 1; a = 1;

Цикл в левой колонке выполняется примерно на 10 % дольше, чем в правой.

На первый взгляд, и в первом, и во втором случае 10 000 000 раз выполняется оператор присваивания и затраты времени на это должны быть одинаковы в обоих случаях. Но это не так. Объясняется это тем, что инициализации цикла (обработка процессором его заголовка с целью определения начального и конечного значений счётчика, а также шага приращения счётчика) требует времени. В первом случае 1 раз инициализируется внешний цикл и 100 000 раз — внутренний, то есть всего выполняется 100 001 инициализация. Во втором случае таких инициализаций оказывается всего лишь 1001.

Аналогично ведут себя вложенные циклы с предусловием и с постусловием. Можно сделать вывод, что при программировании вложенных циклов по возможности следует делать цикл с наибольшим числом повторений самым внутренним, а цикл с наименьшим числом повторений — самым внешним.Если в циклах содержатся обращения к памяти (обычно при обработке массивов), для максимально эффективного использования кэша и механизма аппаратной предвыборки данных из памяти порядок обхода адресов памяти должен быть по возможности последовательным. Классическим примером подобной оптимизации является смена порядка следования вложенных циклов при выполнении умножения матриц.

 

Внутри цикла могут встречаться выражения, фрагменты которых никак не зависят от управляющей переменной цикла. Их называют инвариантными фрагментами кода.

Например for (int i = 0; i<100; i++)

for (int j = 0; j<20; j++)

a[i, j] = sin (i*i)/abs(i)

sin (i*i)/abs(i) не зависит от переменной внутреннего цикла, поэтому рекомендуется выполнить вычисление в теле внешнего цикла.

12. Этапы сборки приложения с использованием компилятора GCC в среде разработки Linux / QT Creator.

Для того, чтобы создать приложение на языке C в интегрированной среде разработки Qt Creator (работающей, к примеру в ОС GNU/Linux) требуется запустить Qt Creator, выбрать (рассмотрена английская версия IDE) пункт File → New File of Project → Non-Qt Project → Plain C Project (Plain C++ Project для возможности использования возможностей языка C++, таких как try-catch, передача аргументов по ссылки и т.п.). После этого выбрать имя и папку расположения проекта.

 

В случае правильно установленного и настроенного Qt Creator-а и наличия компилятора gcc (g++ для C++) сборка осуществляется выбором пункта меню Build → Build all или нажатием горячей клавиши Ctrl+Shift+B.

 

Если среда не настроена должным образом, то перед сборкой требуется её настроить. Для этого надо зайти в свойства Qt Creator (Tools → Options), выбрать Build & Run, вкладка Qt Versions, где указать путь к qmake (часто: /usr/bin/qmake), вкладка Tool Chains, где указать путь к g++ (часто: /usr/bin/g++).


Дата добавления: 2015-10-13; просмотров: 90 | Нарушение авторских прав


Читайте в этой же книге: Указатели на функции. Особенности использования. | Классификация динамических структур данных | Строки. Операции над строками. Указатели на строки. | Структурные типы данных: структуры. Особенности использования. | Основы файловой системы: файл, каталог, дисковод, полное имя файла, внутреннее представление информации в файле. Типы файлов. | Память. Классы памяти. Модификаторы классов памяти. Область видимости, время жизни и место размещения объекта в памяти. | Достоинства, отличительные особенности и сравнительная характеристика языка программирования Си. | Модульное программирование. Структура модуля. Законы видимости | Структура модуля. | Назначение |
<== предыдущая страница | следующая страница ==>
Создание файла проекта. Объектные файлы. Раздельная компиляция. Make-файлы.| Особенности сборки программы в среде разработки QT-Creator.

mybiblioteka.su - 2015-2024 год. (0.009 сек.)