час вымярэння праграмы Шматструменная

Я вымераў час з функцыяй гадзін (), але ён даў дрэнныя вынікі. Я маю на ўвазе, што дае тыя ж вынікі для праграмы з адной ніткай і па той жа праграме, якая працуе з OpenMP з многімі ніткамі. Але на самой справе, я заўважыў, з маімі гадзінамі, што з многімі ніткамі разлічвае праграма хутчэй. Таму мне патрэбна сцяна-гадзіны таймер ...

Маё пытанне: Што лепш функцыя для гэтай праблемы? clock_gettime() або м.б. gettimeofday ()? або мб нешта яшчэ?

калі clock_gettime (), а затым, з якім гадзіны? CLOCK_REALTIME або CLOCK_MONOTONIC?

выкарыстоўваючы Mac OS X (Snow Leopard)

1

2 адказы

Калі вы хочаце час ад сцяны гадзіны і clock_gettime() даступны, гэта добры выбар. Выкарыстоўвайце яго з CLOCK_MONOTONIC калі вы памерыце інтэрвалы часу, і CLOCK_REALTIME , каб атрымаць фактычны час сутак.

CLOCK_REALTIME gives you the actual time of day, but is affected by adjustments to the system time -- so if the system time is adjusted while your program runs that will mess up measurements of intervals using it.

CLOCK_MONOTONIC doesn't give you the correct time of day, but it does count at the same rate and is immune to changes to the system time -- so it's ideal for measuring intervals, but useless when correct time of day is needed for display or for timestamps.

3
дададзена

Я думаю, што гадзіннік() падлічвае агульнае выкарыстанне працэсара сярод усіх патокаў, я таксама была гэтая праблема ...

Выбар метаду насценнага гадзін сінхранізацыі асабістых пераваг. Я выкарыстоўваю функцыю инлайн абгорткі прымаць часовыя адзнакі (узяць рознасць 2 часовых штампаў для разліку часу апрацоўкі). Я выкарыстаў плавае кропку для зручнасці (адзінкі ў секундах, не прыйдзецца турбавацца аб цэлалікавых перапаўненні). З шматструменнасці, існуе так шмат асінхронных падзей, на мой погляд, не мае сэнсу часу менш за 1 мікрасекунды. Гэта працуе вельмі добра для мяне да гэтага часу :)

Што б вы ні абралі, абгортка гэта самы просты спосаб паэксперыментаваць

inline double my_clock(void) {
  struct timeval t;
  gettimeofday(&t, NULL);
  return (1.0e-6*t.tv_usec + t.tv_sec);
}

выкарыстанне:

double start_time, end_time;
start_time = my_clock();
//some multi-threaded processing
end_time = my_clock();
printf("time is %lf\n", end_time-start_time);
1
дададзена