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

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

Жанры

Программирование для 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. Простейший калькулятор

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

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

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Цвет сверхдержавы - красный. Трилогия

Симонов Сергей
Цвет сверхдержавы - красный
Фантастика:
попаданцы
альтернативная история
8.06
рейтинг книги
Цвет сверхдержавы - красный. Трилогия

Болтливый мертвец

Фрай Макс
7. Лабиринты Ехо
Фантастика:
фэнтези
9.41
рейтинг книги
Болтливый мертвец

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь