Приветствую.
Нужно было проставить временные метки для ~5 Мб вывода, на sh получалось медленное и где-то в процессе появилась такая байда:
#include <stdio.h>
#include <time.h>
#define size 511
void main()
{
clock_t b,e; e=b=0;
fdopen (0, "r");
fdopen (1, "w");
b=clock();
char line[size+1];
while (fgets (line, size, stdin))
{
e=clock();
printf ("%f %ld ", e, e);/*(e-b)/(double)CLOCKS_PER_SEC*/
printf("%s", line);
}
}
$gcc log_ts.db.c -ggdb -O0 -o log_ts
log_ts.db.c: In function ‘main’:
log_ts.db.c:14:1: warning: format ‘%f’ expects type ‘double’, but argument 2 has type ‘clock_t’
$echo "1
> 2"|./log_ts
0.000000 -1216321480 1
0.000000 -1216321480 2
$echo "1
2"|./log_ts
0.000000 -1216079816 1
0.000000 -1216079816 2
Думалось в том смысле, что clock() возвращает число общих тиков системы. По man 3 clock вроде бы только затраты на процесс.
clock_t в глубине хедеров как бы long int. Итак вопросы:
Что это такое клок возвращает? И он ли? Ко времени явно имеет некое отношение. Таки СPU тики?
Если он, то почему по следующим циклам значение не меняется? Думал gсс переоптимизировал, но -O0, да и на -O2 по степпингу gdb клок честно выполняетcя.
Почему сие только при убогом использовании printf заметно? Т.е. если первую переменную убрать, поменять местами, s/%f/%lu выводится очень даже 0. А, допустим, 2й принтф в первый добавить"%f %ld %s" - на выходе непечатные 014 001 и прочие обратные пробелы перед строкой. Перекрывает память чтоле? Это фича принтф? Баг?
Как правильно все же clock() юзать? По гуглу глянул - 1 баг с дебиан3.1, куча советов не юзать и референсы - отнять и поделить(с)
Основной вопрос, в принципе - это я кривым рукоглазом чего-то очевидного не замечаю, или бок в glibc/gcc (clock Є glibc же?)
11.04, libc6 2.13-0ubuntu13, gcc 4.5.2-8ubuntu4
gcc -lrt опция
#include <stdio.h>
#include <time.h>
#define Timer CLOCK_MONOTONIC
#define size 2048
void main()
{
struct timespec t, tb;
clock_gettime( Timer, &tb);
char line[size+1];
while (fgets (line, size, stdin))
{
clock_gettime( Timer, &t);
printf ("%lu.%0*lu:%s", (t.tv_nsec>tb.tv_nsec)?t.tv_sec-tb.tv_sec:t.tv_sec-tb.tv_sec-1,6,(t.tv_nsec>tb.tv_nsec)?(t.tv_nsec-tb.tv_nsec)/1000:(999999999+t.tv_nsec-tb.tv_nsec)/1000,line);
}
}