2012-03-17 3 views
0

Я использую C на linux, и моя программа имеет высокую плотность ЦП и плотность ввода-вывода. Использование команды показывает время, что моя программа, имеющая много накладных расходов:Как уменьшить накладные расходы в моей программе на C?

real 1m4.639s 
user 0m53.929s 
sys   0m9.747s 

Это можно обнаружить «SYS 0m9.747s», какие затраты и уменьшить его?

================================================================================================================================== ===

Извините, если этот вопрос непросто ответить без кода, но мой код слишком длинный, чтобы его можно было разместить здесь. Таким образом, любые советы или подсказки также будут делать. Спасибо

+0

отправьте код. > _ < – Oleksi

+0

Слишком долго для публикации. На самом деле я делаю простую инвертированную индексацию. –

+2

Если вы устраните * все * системное время, вы только ускорили свою программу на 16%. Вероятно, вы получите больше шансов на то, чтобы ваш доллар сосредоточился на 53 секундах времени пользователя; если вы сделаете 20-процентное сокращение за это время, вы превзошли то, чего достигнете, благодаря невозможному 100-процентному сокращению системного времени. –

ответ

7

Системное время процессора - это время, затраченное на ядро ​​для вашего процесса, выполнение системных вызовов. Вы можете использовать strace, чтобы узнать, какие системные вызовы ваш процесс делает.

Возможно, у вас есть много небольших системных вызовов read (или write). Вы можете снизить их количество, увеличив размер буферов (так что каждый read и write передаст больше байтов). См. this и that ответы на соответствующие вопросы.

Вы также можете использовать mmap для создания файлов проекта в (виртуальную) память; это может быть лучшим способом для какого-либо дискового ввода-вывода.

Но я не буду сосредотачиваться конкретно на системном времени. Кажется, что он потребляет только 15% процессорного времени, что является разумным соотношением.

Я бы предложил просмотреть вашу программу (используя gprof или oprofile) и найти, где узкие места.

+0

+1: Профиль! Пока вы этого не сделали, вы знаете, где ваша программа тратит свое время, вы, вероятно, попытаетесь оптимизировать неправильные вещи. –

+0

Да, есть много разговоров на чтение и запись, я собираюсь сделать тест –

3

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

С этой целью вы должны сосредоточиться на времени, затрачиваемом на земле пользователя. В течение 53 секунд против 9 секунд системного времени вы, вероятно, сможете оптимизировать еще многое. Оптимальное время использования было бы лучше использовано там.

Смежные вопросы