2009-11-04 22 views
9

Necesito escribir datos en la unidad. Tengo dos opciones:¿Qué es más rápido, escribir datos sin procesar en una unidad o escribir en un archivo?

  1. escribir sectores primas (_ escritura (mango, pBuffer, tamaño);)
  2. escribir en un archivo (fwrite (pBuffer, tamaño, cuenta, pFile);)
.

¿Cuál es la manera más rápida?

Esperaba que la función de escritura del sector sin procesar, _write, fuera más eficiente. Sin embargo, ¡el resultado de mi prueba falló! fwrite es más rápido. escribir cuesta más tiempo.

He pegado mi fragmento; tal vez mi código es incorrecto ¿Me puede ayudar? De cualquier manera está bien por mí, pero creo que es mejor escribir en bruto, porque parece que los datos de la unidad se cifran al menos ....

#define SSD_SECTOR_SIZE 512 
int g_pSddDevHandle = _open("\\\\.\\G:",_O_RDWR | _O_BINARY, _S_IREAD | _S_IWRITE); 
TIMER_START(); 
while (ulMovePointer < 1024 * 1024 * 1024) 
{ 
    _write(g_pSddDevHandle,szMemZero,SSD_SECTOR_SIZE); 
    ulMovePointer += SSD_SECTOR_SIZE; 
} 
TIMER_END(); 
TIMER_PRINT(); 
FILE * file = fopen("f:\\test.tmp","a+"); 
TIMER_START(); 
while (ulMovePointer < 1024 * 1024 * 1024) 
{ 
    fwrite(szMemZero,SSD_SECTOR_SIZE,1,file); 
    ulMovePointer += SSD_SECTOR_SIZE; 
} 
TIMER_END(); 
TIMER_PRINT(); 
+4

Escribir datos sin procesar no está encriptado en absoluto; simplemente confunde al usuario ... – bdonlan

+3

+1 para crear perfiles. (Aunque esta pregunta está por encima de mi cabeza) – GManNickG

+0

Para bdonlan: Solo quiero que se vea como encriptado ... invisible para los usuarios –

Respuesta

6

En el caso _write(), importa el valor de SSD_SECTOR_SIZE. En el caso fwrite, el tamaño de cada escritura en realidad será BUFSIZ. Para obtener una mejor comparación, asegúrese de que los tamaños de búfer subyacentes sean los mismos.

Sin embargo, esto es probablemente solo una parte de la diferencia.

En el caso fwrite, está midiendo qué tan rápido puede obtener datos en la memoria. No ha enjuagado el búfer stdio al sistema operativo y no le ha pedido al sistema operativo que vacíe sus búferes para el almacenamiento físico. Para comparar con mayor precisión, debe llamar a fflush() antes de detener los temporizadores.

Si realmente le interesa obtener datos en el disco en lugar de solo obtener los datos en los búferes de los sistemas operativos, debe asegurarse de llamar a fsync()/FlushFileBuffers() antes de detener el temporizador.

Otras diferencias obvias:

  • Las unidades son diferentes. No sé que diferente.

  • La semántica de una escritura en un dispositivo es diferente a la semántica de las escrituras en un sistema de archivos; el sistema de archivos puede retrasar las escrituras para mejorar el rendimiento hasta que explícitamente se le indique que no lo haga (por ejemplo, con un identificador estándar, una llamada a FlushFileBuffers()); las escrituras directamente en un dispositivo no están necesariamente optimizadas de esa manera. Por otro lado, el sistema de archivos debe hacer yo adicional de E/S para gestionar los metadatos (asignación de bloques, las entradas de directorio, etc.)

Sospecho que estás viendo una diferente en la política sobre las cosas realmente qué tan rápido ir al disco.El rendimiento del disco sin formato puede ser muy rápido, pero necesita grandes escrituras y preferiblemente múltiples operaciones pendientes simultáneas. También puede evitar la copia de búfer utilizando las opciones correctas al abrir el controlador.

+0

El resultado es que fwrite es 10 veces más rápido que _write ... SSD_SECTOR_SIZE es 512 –

+0

Si llama a fflush() después de cada llamada a fwrite, debería aparecer el rendimiento casi igual. Sin embargo, como mencionó janm, también hay otras variables involucradas aquí, como la memoria caché del sistema operativo. –

+1

Si realmente te importa el rendimiento, probaría las escrituras más grandes, digamos 1MB a la vez. O incluso una sola llamada a la función de escritura y luego una llamada a la función de descarga. Las unidades modernas no escriben sectores, escriben pistas. Para obtener una comparación precisa, debe enjuagar los buffers. – janm

18

Probablemente debido a una escritura directa no se amortigua. Cuando llama al fwrite, está realizando grabaciones en búfer que tienden a ser más rápidas en la mayoría de las situaciones. Básicamente, cada controlador FILE* tiene un búfer interno que se vacía periódicamente en el disco cuando se llena, lo que significa que termina haciendo menos llamadas al sistema, ya que solo escribe en el disco en trozos más grandes.

Para decirlo de otra manera, en su primer ciclo, en realidad está escribiendo bytes SSD_SECTOR_SIZE en el disco durante cada iteración. En tu segundo ciclo, no lo eres. Solo está escribiendo SSD_SECTOR_SIZE bytes en un búfer de memoria, que, dependiendo del tamaño del búfer, solo se va a enjuagar cada enésima iteración.

Cuestiones relacionadas