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

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

Жанры

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

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

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

Император Пограничья 6

Астахов Евгений Евгеньевич
6. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 6

Этот мир не выдержит меня. Том 3

Майнер Максим
3. Первый простолюдин в Академии
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Этот мир не выдержит меня. Том 3

Петля, Кадетский Корпус. Книга пятая

Алексеев Евгений Артемович
5. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский Корпус. Книга пятая

An ordinary sex life

Астердис
Любовные романы:
современные любовные романы
love action
5.00
рейтинг книги
An ordinary sex life

Второгодка. Книга 5. Презренный металл

Ромов Дмитрий
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл

Паладин из прошлого тысячелетия

Еслер Андрей
1. Соприкосновение миров
Фантастика:
боевая фантастика
попаданцы
6.25
рейтинг книги
Паладин из прошлого тысячелетия

Ермак. Противостояние. Книга одиннадцатая

Валериев Игорь
11. Ермак
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Ермак. Противостояние. Книга одиннадцатая

Император Пограничья 4

Астахов Евгений Евгеньевич
4. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 4

Инквизитор Тьмы

Шмаков Алексей Семенович
1. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы

Локки 5. Потомок бога

Решетов Евгений Валерьевич
5. Локки
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Локки 5. Потомок бога

Вперед в прошлое 8

Ратманов Денис
8. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 8

Ботаник 2

Щепетнов Евгений Владимирович
2. Ботаник
Фантастика:
фэнтези
боевая фантастика
6.00
рейтинг книги
Ботаник 2

Изгой Проклятого Клана. Том 6

Пламенев Владимир
6. Изгой
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Изгой Проклятого Клана. Том 6

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2