Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

319
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda