Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

317
Views
Cómo cronometrar correctamente la velocidad de escritura en un disco (es decir, un archivo) en C

Tengo un Zynq SoC que ejecuta un sistema Linux y me gustaría cronometrar la velocidad a la que puedo escribir en su tarjeta SD en C.

Probé clock() y clock_gettime() donde para este último, hice lo siguiente:

 #define BILLION 1000000000.0 #define BUFFER_SIZE 2097152 ... for (int i=0; i<100; i++) { memcpy(buf, channel->dma + offset, BUFFER_SIZE); /* Open file for output */ FILE *f = fopen(path, "w"); /* Start timer */ clock_gettime(CLOCK_MONOTONIC, &start); /* Write data from cpu ram to sd card*/ fwrite(buf, 1, BUFFER_SIZE, f); fclose(f); /* Stop timer and report result */ clock_gettime(CLOCK_MONOTONIC, &end); elapsed_time = (end.tv_sec - start.tv_sec) + (end.tv_nsec - start.tv_nsec) / BILLION; printf("%lf seconds\n", elapsed_time); }

Los tiempos que obtengo son alrededor de 0,019 segundos para 2097152 bytes, lo que creo que es incorrecto porque la velocidad de escritura en la tarjeta SD es de 10 MB/s y no es posible que sea de 110 MB/s. estar recibiendo Cuando, en cambio, pongo el código de tiempo fuera del bucle y, básicamente, mido el tiempo que lleva escribir los 100*BUFFER_SIZE completos, obtengo 18 MB/s más razonables.

Mi pregunta es, ¿es incorrecto intentar cronometrar una sola operación fwrite? ¿ clock_gettime() no me da la exactitud/precisión adecuada para eso? Me gustaría tener el valor más preciso posible de la rapidez con la que puedo escribir en el disco porque es un parámetro muy importante en el diseño del sistema, por lo que esta discrepancia que obtengo es bastante desconcertante.

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

El kernel de Linux a menudo almacena en caché el acceso de lectura y escritura al almacenamiento en disco. Es decir, regresa de la llamada de escritura y realiza la escritura en segundo plano. Lo hace de manera transparente, de modo que si leyera el mismo archivo, justo después de escribir, obtendría los resultados que escribió, incluso si aún no se transfirieron y escribieron por completo en el disco.

Para forzar una escritura completa, puede llamar a la función fsync . Se bloquea hasta que se haya completado todo el archivo IO para un archivo específico. En su caso una llamada a

 #include <unistd.h> ... fwrite(...); fsync(fileno(f));

debería ser suficiente.

Editar
como @pmg mencionó en los comentarios, también hay almacenamiento en búfer a nivel de transmisión. Aunque probablemente no sea un búfer tan grande, puede forzar que el búfer de transmisión se escriba con una llamada a fflush() antes de fsync .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!