Насколько дорогое время вызова (NULL) в цикле сервера?

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

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

4 ответа

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

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

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


Получение текущего времени связано с системным вызовом в Linux. Как было сказано Vilx, довольно легко оценить:

#include <time.h>
int main(void)
{
 int i;
 for (i = 0; i < 10000000; i++)
 time(NULL);
 return 0;
}
</time.h>

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

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


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


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

licensed under cc by-sa 3.0 with attribution.