Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

259
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda