[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Руководство по настройке производительности


Приемы оптимизации кода

Снижение производительности вследствие неэффективного использования памяти намного более ощутимо, чем вследствие неэффективного использования кэша, поскольку разница в быстродействии памяти и диска намного больше, чем разница в быстродействии кэша и памяти. Ниже перечислены приемы оптимизации кода:

Отображенные файлы

Другим приемом оптимизации является применение отображенных файлов. С помощью системных вызовов shmat() и mmap() приложения могут обращаться к файлам по их адресам, вместо того чтобы выполнять множество операций чтения и записи. Поскольку такие операции всегда отнимают много ресурсов, их должно быть минимальное число. Применение shmat() и mmap() вместо обычных read() и write() повышает производительность во много раз (до 50). При вызове функции shmat() происходит открытие файла и возврат дескриптора файла (fd), так же, как и при операции чтения или записи. Затем shmat() возвращает адрес отображенного файла. Выбор элементов файла по последующим адресам, а не с помощью операций чтения, позволяет работать с файлом как с матрицей.

Вызов mmap() позволяет отобразить память в набор пересекающихся сегментов. Пользователь может работать более чем с 10 областями памяти. Функции mmap() обеспечивают защиту областей памяти на уровне страниц. Для каждой страницы может быть установлено разрешение на чтение, разрешение на запись или запрет на доступ. Вызов mmap() позволяет отобразить только одну страницу файла.

Кроме того, вызов shmat() позволяет отобразить несколько сегментов, если отображаемый файл занимает больше одного сегмента.

В следующем примере программа выполняет чтение из файла с помощью операторов чтения:

fd = open("myfile", O_RDONLY);
for (i=0;i<cols;i++) {
        for (j=0;j<rows;j++) {
                read(fd,&n,sizeof(char));
                *p++ = n;
        }
}

Применение функции shmat() позволяет достичь того же результата без операторов чтения:

fd = open("myfile", O_RDONLY);
nptr = (signed char *) shmat(fd,0,SHM_MAP | SHM_RDONLY);
for (i=0;i<cols;i++) {
        for (j=0;j<rows;j++) {
                *p++ = *nptr++;
        }
}

Применение явно отображенных файлов обладает одним недостатком, проявляющимся при выполнении операций записи. Системная функция записи с запаздыванием, периодически записывающая обновленные страницы в файл обычным образом - последовательно по блокам, не применима, когда в приложении используется функция shmat() или mmap(). В этом случае обновленные страницы накапливаются в памяти и могут быть сохранены лишь случайно, когда Администратору виртуальной памяти (VMM) понадобится свободное пространство. Эта ситуация часто приводит к множеству коротких операций записи на диск, что снижает производительность CPU и дисковой памяти.


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]