Чтение онлайн

на главную - закладки

Жанры

Программирование для Linux. Профессиональный подход

Самьюэл Алекс

Шрифт:

#include <stdlib.h>

#include <assert.h>

/* Выделение памяти указанного размера. */

void allocate(char** array, size_t size) {

 *array = malloc(size);

}

/* Освобождение памяти. */

void deallocate(char** array) {

 free((void*)*array);

}

/*
Чтение указанной ячейки памяти. */

void read_from_memory(char* array, int position) {

 volatile char character = array[position];

}

/* Запись в указанную ячейку памяти. */

void write_to_memory(char* array, int position) {

 array[position] = 'a';

}

int main{int argc, char* argv[]) {

 char** array;

 unsigned array_size;

 char command[32];

 unsigned array_index;

 char command_letter;

 int size_or_position;

 int error = 0;

#ifdef MTRACE

 mtrace;

#endif /* MTRACE */

 if (argc != 2) {

fprintf(stderr, "%s: array-size\n", argv[0]);

return 1;

 }

 array_size = strtoul(argv[1], 0, 0);

 array = (char**)calloc(array_size, sizeof(char*));

 assert(array != 0);

 /* Выполнение вводимых пользователем команд. */

 while (!error) {

printf("Please enter a command: ");

command_letter = getchar;

assert(command_letter != EOF);

switch (command_letter) {

case 'a':

fgets(command, sizeof(command), stdin);

if (sscanf(command, "%u %i", &array_index,

&size_or_position) == 2 &&

array_index < array_size)

allocate(&(array[array_index]), size_or_position);

else

error = 1;

break;

case 'd':

fgets(command, sizeof(command), stdin);

if (sscanf(command, "%u", &array_index) == 1 &&

array_index < array_size)

deallocate(&(array[array_index]));

else

error = 1;

break;

case 'r':

fgets(command, sizeof(command), stdin);

if (sscanf(command, "%u %i", &array_index,

&size_or_position) == 2 &&

array_index < array_size)

read_from_memory(array[array_index], size_or_position);

else

error = 1;

break;

case 'w':

fgets(command, sizeof(command), stdin);

if (sscanf(command, "%u %i", &array_index,

&size_or_position) == 2 &&

array_index < array_size)

write_to_memory(array[array_index], size_or_position);

else

error = 1;

break;

case 'q':

free((void*)array);

return 0;

default:

error = 1;

}

 }

 free((void*)array);

 return 1;

}

A.3.

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

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

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

Для получения профильной информации необходимо следовать такому алгоритму.

1. Скомпилируйте и скомпонуйте программу с опциями профилирования.

2. Запустите программу, чтобы сгенерировать профильные данные.

3. Вызовите утилиту

gprof
для отображения и анализа профильных данных.

А.3.1. Простейший калькулятор

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

Поделиться:
Популярные книги

Черный маг императора 3

Герда Александр
3. Черный маг императора
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора 3

Повелитель механического легиона. Том VIII

Лисицин Евгений
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII

Пипец Котенку! 3

Майерс Александр
3. РОС: Пипец Котенку!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Пипец Котенку! 3

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Боги, пиво и дурак. Том 6

Горина Юлия Николаевна
6. Боги, пиво и дурак
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Боги, пиво и дурак. Том 6

Болотник 2

Панченко Андрей Алексеевич
2. Болотник
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Болотник 2

Ты всё ещё моя

Тодорова Елена
4. Под запретом
Любовные романы:
современные любовные романы
7.00
рейтинг книги
Ты всё ещё моя

S-T-I-K-S. Пройти через туман

Елисеев Алексей Станиславович
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
7.00
рейтинг книги
S-T-I-K-S. Пройти через туман

Имя нам Легион. Том 4

Дорничев Дмитрий
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 4

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Я князь. Книга XVIII

Дрейк Сириус
18. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я князь. Книга XVIII

Королевская Академия Магии. Неестественный Отбор

Самсонова Наталья
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Королевская Академия Магии. Неестественный Отбор

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

Жребий некроманта. Надежда рода

Решетов Евгений Валерьевич
1. Жребий некроманта
Фантастика:
фэнтези
попаданцы
6.50
рейтинг книги
Жребий некроманта. Надежда рода