Вызов tzset()
после разветвления кажется очень медленным. Я вижу медлительность только в том случае, если сначала вызываю tzset()
в родительском процессе перед разветвлением. Моя переменная среды TZ
не установлена. Я dtruss
запустил свою тестовую программу, и она показала, что дочерний процесс читает /etc/localtime
при каждом tzset()
вызове, в то время как родительский процесс читает его только один раз. Этот доступ к файлу кажется источником медлительности, но я не мог определить, почему он обращается к нему каждый раз в дочернем процессе.
Вот моя тестовая программа foo.c:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <unistd.h>
void check(char *msg);
int main(int argc, char **argv) {
check("before");
pid_t c = fork();
if (c == 0) {
check("fork");
exit(0);
}
wait(NULL);
check("after");
}
void check(char *msg) {
struct timeval tv;
gettimeofday(&tv, NULL);
time_t start = tv.tv_sec;
suseconds_t mstart = tv.tv_usec;
for (int i = 0; i < 10000; i++) {
tzset();
}
gettimeofday(&tv, NULL);
double delta = (double)(tv.tv_sec - start);
delta += (double)(tv.tv_usec - mstart)/1000000.0;
printf("%s took: %fs\n", msg, delta);
}
Я скомпилировал и выполнил foo.c вот так:
[muir@muir-work-mb scratch]$ clang -o foo foo.c
[muir@muir-work-mb scratch]$ env -i ./foo
before took: 0.002135s
fork took: 1.122254s
after took: 0.001120s
Я использую Mac OS X 10.10.1 (также воспроизводится на 10.9.5).
Первоначально я заметил медлительность через рубин (Time # localtime slow в дочернем процессе).
difftime(tv.tv_sec, start)
, а не(double)(tv.tv_sec - start)
.(double)
вdelta += (double)...
не нужен. - person chux - Reinstate Monica   schedule 14.01.2015fork()
- это всего лишь предположение, основанное на прогоне кода через инструменты и некотором поиске в Google. - person Petesh   schedule 14.01.2015