Программирование для 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. Простейший калькулятор
Для иллюстрации методики профилирования мы напишем простейшую программу- калькулятор. Чтобы программа выполнялась нетривиальным образом, заставим ее работать с унарными числами, чего не встречается в реальных калькуляторах. Код программы приведен в конце приложения.
Поделиться:
Популярные книги
Кодекс Охотника. Книга XXXIX
39. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
боевая фантастика
5.00
рейтинг книги
Я до сих пор царь. Книга XXXII
32. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Барон ненавидит правила
8. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Представь себе… Беседы о деньгах, политике и жизни вообще
Религия и эзотерика:
самосовершенствование
5.00
рейтинг книги
Точка Бифуркации VI
6. ТБ
Фантастика:
фэнтези
попаданцы
аниме
5.40
рейтинг книги
Свадьба на выбор, или Женихи в ассортименте
Любовные романы:
современные любовные романы
7.71
рейтинг книги
Неучтенный элемент. Том 10
10. Антимаг. Вне системы
Фантастика:
фэнтези
5.25
рейтинг книги
Литрпг
5.00
рейтинг книги
Тринадцатый
1. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
7.33
рейтинг книги
Записки уцелевшего
Документальная литература:
биографии и мемуары
7.00
рейтинг книги
Мифы и правда о плане Барбаросса
Анатомия армии
Научно-образовательная:
история
5.00
рейтинг книги
Цикл "Идеальный мир для Лекаря". Компиляция. Книги 1-30
Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Игра киллера
Детективы:
боевики
6.25
рейтинг книги
Законы рода
1. Граф Берестьев
Фантастика:
фэнтези
боевая фантастика
аниме
4.75