c - transformar - Tiempo en milisegundos
script fecha y hora linux (7)
Usando el siguiente código:
#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;
}
Obtengo el siguiente resultado:
56789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004 2.169 2.169
Las horas de inicio y finalización son las mismas. ¿Significa que el programa apenas toma tiempo para completar la ejecución?
Si 1. es falso, entonces al menos el número de dígitos más allá del (.) Debería diferir, lo que no ocurre aquí. ¿Mi lógica es correcta?
Nota: Necesito calcular el tiempo de ejecución y, por lo tanto, el código anterior.
Desde el reloj del hombre :
La función clock () devuelve una aproximación del tiempo de procesador utilizado por el programa.
Entonces, no hay indicación de que deba tratarlo como milisegundos. Algunos estándares requieren un valor preciso de CLOCKS_PER_SEC
, por lo que puede confiar en él, pero no creo que sea aconsejable. Lo segundo es que, como dijo @unwind, no es float / double. El tiempo del hombre sugiere que será un int. También tenga en cuenta que:
esta función devolverá el mismo valor aproximadamente cada 72 minutos
Y si no tiene suerte, puede pulsar en el momento en que está a punto de comenzar a contar desde cero, obteniendo así un valor negativo o enorme (dependiendo de si almacena el resultado como un valor firmado o sin signo).
Esta:
printf("/n/n%6.3f", stop);
Lo más probable es que imprima basura como tratar cualquier int como flotación no es realmente un comportamiento definido (y creo que aquí es donde viene la mayor parte de su problema). Si quiere asegurarse de que siempre puede hacer:
printf("/n/n%6.3f", (double) stop);
Aunque preferiría imprimirlo por long long int
al principio:
printf("/n/n%lldf", (long long int) stop);
Este fragmento de código se puede usar para mostrar el tiempo en segundos, milisegundos y microsegundos:
#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);
Esto es lo que escribo para obtener la marca de tiempo en millones de segundos.
#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);
}
Los procesadores modernos son demasiado rápidos para registrar el tiempo de ejecución. Por lo tanto, puede devolver cero. En este caso, el tiempo que comenzó y terminó es demasiado pequeño y, por lo tanto, ambos tiempos son los mismos después de la ronda de.
Puede usar gettimeofday()
junto con la función timedifference_msec()
continuación para calcular el número de milisegundos transcurridos entre dos muestras:
#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;
}
Tenga en cuenta que, al usar gettimeofday()
, necesita tener en cuenta los segundos aunque solo le tv_usec
diferencias de microsegundos porque tv_usec
volverá a cero cada segundo y no tendrá forma de saber de antemano en qué punto dentro de un segundo cada muestra es adquirido.
Sí, es probable que este programa haya utilizado menos de un milisegundo. Intenta usar una resolución de microsegundos con timeval
.
p.ej:
#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);
A continuación, puede consultar la diferencia (en microsegundos) entre stop.tv_usec - start.tv_usec
. Tenga en cuenta que esto solo funcionará por segundos (como tv_usec
se tv_usec
). Para el caso general, use una combinación de tv_sec
y tv_usec
.
Editar 2016-08-19
Un enfoque más apropiado en el sistema con el soporte de clock_gettime
sería:
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;
Un par de cosas pueden afectar los resultados que está viendo:
- Estás tratando a
clock_t
como un tipo de coma flotante, no creo que lo sea. - Es posible que espere (
1^4
) para hacer algo más que calcular el XOR bit a bit de 1 y 4., es decir, es 5. - Dado que el XOR es de constantes, es probable que sea doblado por el compilador , lo que significa que no agrega mucho trabajo en el tiempo de ejecución.
- Como la salida está almacenada en el búfer (es solo formatear la cadena y escribirla en la memoria), se completa muy rápidamente.
No está especificando qué tan rápido es su máquina, pero no es irrazonable que esto funcione muy rápido en hardware moderno, no.
Si lo tiene, intente agregar una llamada a sleep()
entre las instantáneas de inicio / detención. Tenga en cuenta que sleep()
es POSIX aunque no es estándar C.