Подтвердить что ты не робот

Время в миллисекундах в C

Используя следующий код:

#include<stdio.h>
#include<time.h>
int main()
{
    clock_t start, stop;
    int i;
    start = clock();
    for(i=0; i<2000;i++)
    {
        printf("%d", (i*1)+(1^4));
    }
    printf("\n\n");
    stop = clock();

    //(double)(stop - start) / CLOCKS_PER_SEC

    printf("%6.3f", start);
    printf("\n\n%6.3f", stop);
    return 0;
}

Я получаю следующий вывод:

56789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004

  2.169

  2.169
  • Время начала и остановки одинаково. Означает ли это, что программа вряд ли требует времени для выполнения?

  • Если 1. ложно, то по крайней мере число цифр за пределами (.) должно отличаться, чего здесь не происходит. Правильно ли моя логика?

Примечание: Мне нужно рассчитать время, затраченное на выполнение, и, следовательно, приведенный выше код.

4b9b3361

Ответ 1

Да, эта программа, вероятно, использовала менее миллисекунды. Попробуйте использовать микросекундное разрешение с timeval.

например:

#include <sys/time.h>

struct timeval stop, start;
gettimeofday(&start, NULL);
//do stuff
gettimeofday(&stop, NULL);
printf("took %lu\n", stop.tv_usec - start.tv_usec);
printf("Duration MS %'.3f\n", (double) (stop.tv_sec - start.tv_sec) * 1000 + (double) (stop.tv_usec - start.tv_usec) / 1000);

Затем вы можете запросить разницу (в микросекундах) между stop.tv_usec - start.tv_usec. Обратите внимание, что это будет работать только в течение секунды (поскольку tv_usec будет зацикливаться). Для общего случая используйте комбинацию tv_sec и tv_usec.

Изменить 2016-08-19

Более подходящим подходом для системы с поддержкой clock_gettime будет:

struct timespec start, end;
clock_gettime(CLOCK_MONOTONIC_RAW, &start);
//do stuff
clock_gettime(CLOCK_MONOTONIC_RAW, &end);

uint64_t delta_us = (end.tv_sec - start.tv_sec) * 1000000 + (end.tv_nsec - start.tv_nsec) / 1000;

Ответ 2

Несколько вещей могут повлиять на результаты, которые вы видите:

  1. Вы рассматриваете clock_t как тип с плавающей точкой, я не думаю, что это так.
  2. Возможно, вы ожидаете (1^4) сделать что-то еще, кроме вычисления поразрядного XOR из 1 и 4., то есть это 5.
  3. Поскольку XOR является константой, он, вероятно, свернут компилятором, что означает, что он не добавляет много работы во время выполнения.
  4. Поскольку вывод буферизуется (он просто форматирует строку и записывает ее в память), он действительно завершается очень быстро.

Вы не указываете, насколько быстро работает ваша машина, но вполне разумно, чтобы она работала очень быстро на современном оборудовании, нет.

Если у вас есть, попробуйте добавить вызов к sleep() между моментальными снимками запуска/остановки. Обратите внимание, что sleep() - это POSIX, а не стандартная C.

Ответ 3

Этот фрагмент кода можно использовать для отображения времени в секундах, миллисекундах и микросекундах:

#include <sys/time.h>

struct timeval start, stop;
double secs = 0;

gettimeofday(&start, NULL);

// Do stuff  here

gettimeofday(&stop, NULL);
secs = (double)(stop.tv_usec - start.tv_usec) / 1000000 + (double)(stop.tv_sec - start.tv_sec);
printf("time taken %f\n",secs);

Ответ 4

Вы можете использовать gettimeofday() вместе с функцией timedifference_msec() ниже, чтобы рассчитать количество миллисекунд, прошедших между двумя выборками:

#include <sys/time.h>
#include <stdio.h>

float timedifference_msec(struct timeval t0, struct timeval t1)
{
    return (t1.tv_sec - t0.tv_sec) * 1000.0f + (t1.tv_usec - t0.tv_usec) / 1000.0f;
}

int main(void)
{
   struct timeval t0;
   struct timeval t1;
   float elapsed;

   gettimeofday(&t0, 0);
   /* ... YOUR CODE HERE ... */
   gettimeofday(&t1, 0);

   elapsed = timedifference_msec(t0, t1);

   printf("Code executed in %f milliseconds.\n", elapsed);

   return 0;
}

Обратите внимание, что при использовании gettimeofday() вам нужно учитывать секунды, даже если вы заботитесь только о микросекундных различиях, потому что tv_usec будет возвращаться к нулю каждую секунду, и вы не можете заранее знать, в какой момент второй образец получается.

Ответ 5

Вот что я пишу, чтобы получить метку времени в миллисекундах.

#include<sys/time.h>

long long timeInMilliseconds(void) {
    struct timeval tv;

    gettimeofday(&tv,NULL);
    return (((long long)tv.tv_sec)*1000)+(tv.tv_usec/1000);
}

Ответ 6

Из man clock:

Функция clock() возвращает приблизительное время процессора, используемое программой.

Таким образом, нет указания, что вы должны рассматривать его как миллисекунды. Для некоторых стандартов требуется точное значение CLOCKS_PER_SEC, поэтому вы можете положиться на него, но я не думаю, что это целесообразно. Во-вторых, что, как заявил @unwind, это не float/double. Man times предполагает, что это будет int. Также обратите внимание, что:

эта функция вернет то же значение примерно каждые 72 минуты

И если вам не повезло, вы можете поразить момент, когда он вот-вот начнет отсчет с нуля, тем самым получив отрицательное или огромное значение (в зависимости от того, сохраняете ли вы результат как подписанное или неподписанное значение).

Это:

printf("\n\n%6.3f", stop);

Скорее всего, будет печатать мусор, рассматривая любой int как float, на самом деле не определяется поведение (и я думаю, что именно в этом и состоит основная часть вашей проблемы). Если вы хотите, чтобы вы всегда могли:

printf("\n\n%6.3f", (double) stop);

Хотя я предпочитаю сначала печатать его как long long int:

printf("\n\n%lldf", (long long int) stop);

Ответ 7

Современные процессоры слишком быстры, чтобы регистрировать время работы. Следовательно, он может возвращать ноль. В этом случае время, которое вы начали и закончили, слишком мало, и поэтому оба раза совпадают после раунда.