Сколько стоит время вызова (NULL) в цикле сервера? - PullRequest
9 голосов
/ 12 января 2011

Я проверяю реализацию сервера, которая вызывает время (NULL) для каждого обрабатываемого запроса.Интересно, как влияет время вызова (NULL) на типичную систему Linux и существуют ли более дешевые команды для определения дня - или вообще как часто вы вызываете time ()?

Спасибо за ваше мнениепо теме.

Ответы [ 4 ]

8 голосов
/ 12 января 2011

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

В отличие от других ответов, я бы не стал считать это настолько дешевым, чтобы о нем автоматически не стоило беспокоиться.Если это во внутреннем цикле, это зависит от того, что еще вы делаете во внутреннем цикле.Если это сервер, обрабатывающий запросы, он, вероятно, делает много системных вызовов на запрос, и еще один действительно не сильно изменит стоимость каждого запроса.Тем не менее, я видел код, в котором издержки syscall от вызова time () (или gettimeofday (), к чему он в действительности сводится) оказывают пагубное влияние.

Если вы беспокоитесь о стоимостиСледующее, что вы должны спросить себя, это то, что есть более дешевые способы найти время.В общем, дешевле не будет хорошего способа.Если вы используете x86, вы можете запросить процессор с помощью инструкции rdtsc (и, скорее всего, есть аналог на других архитектурах процессора) - это единственная инструкция по сборке, которая не является привилегированной, поэтому вы можете поместить ее в свой код где угодно.Но есть много подводных камней - rdtsc не всегда увеличивается с предсказуемой скоростью, особенно если скорость процессора меняется для управления питанием, в зависимости от того, какую именно модель процессора вы используете;значения могут не синхронизироваться между несколькими процессорами и т. д. ОС отслеживает все это и предоставит вам удобную и простую в использовании версию информации при вызове gettimeofday ().

3 голосов
/ 12 января 2011

Получение текущего времени включает системный вызов Linux.Согласно предложению Vilx, сравнительный тест довольно прост:

#include <time.h>

int main(void)
{
    int i;
    for (i = 0; i < 10000000; i++)
        time(NULL);
    return 0;
}

Запуск этой программы занимает 6,26 с на моем слабом 1,6-ГГц Atom 330 с 64-битным ядром, что эквивалентно примерно 1002 циклам ЦП на вызов6,26 с * 1,6 Г циклов в секунду / 10 м итераций ≈ 1002 цикла).

Это, безусловно, не заслуживает особого беспокойства, как отмечали другие.

1 голос
/ 12 января 2011

Это ДЕЙСТВИТЕЛЬНО ваше узкое место? Я бы предложил вместо этого профилирование. Получение текущего времени - это очень обычная операция, и я очень сомневаюсь, что это дорого (хотя вы могли бы легко написать программу для ее измерения). Например, все веб-серверы делают это при каждом запросе своих лог-файлов.

0 голосов
/ 12 января 2011

Это всего лишь один системный вызов без особой обработки в ядре. time () не имеет значения, если ваш сервер отправляет файл пользователю, что занимает 100 операций read () / write () или выполняет что-то подобное.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...