2011-05-07 15 views
19

Cuando la cadena <?xml version se escribe en un archivo mediante fwrite, las siguientes operaciones de escritura se vuelven más lentas.fwrite ahoga en "<? Xml version"

este código:

#include <cstdio> 
#include <ctime> 
#include <iostream> 

int main() 
{ 
    const long index(15000000); 

    clock_t start_time(clock()); 
    FILE* file_stream1 = fopen("test1.txt","wb"); 
    fwrite("<?xml version",1,13,file_stream1); 
    for(auto i = 1;i < index ;++i) 
     fwrite("only 6",1,6,file_stream1); 
    fclose(file_stream1); 

    std::cout << "\nOperation 1 took : " 
     << static_cast<double>(clock() - start_time)/CLOCKS_PER_SEC 
     << " seconds."; 


    start_time = clock(); 
    FILE* file_stream2 = fopen("test2.txt","wb"); 
    fwrite("<?xml versioX",1,13,file_stream2); 
    for(auto i = 1;i < index ;++i) 
     fwrite("only 6",1,6,file_stream2); 
    fclose(file_stream2); 

    std::cout << "\nOperation 2 took : " 
     << static_cast<double>(clock() - start_time)/CLOCKS_PER_SEC 
     << " seconds."; 


    start_time = clock(); 
    FILE* file_stream3 = fopen("test3.txt","w"); 
    const char test_str3[] = "<?xml versioX"; 
    for(auto i = 1;i < index ;++i) 
     fwrite(test_str3,1,13,file_stream3); 
    fclose(file_stream3); 

    std::cout << "\nOperation 3 took : " 
     << static_cast<double>(clock() - start_time)/CLOCKS_PER_SEC 
     << " seconds.\n"; 

    return 0; 
} 

me da este resultado:

Operation 1 took : 3.185 seconds. 
Operation 2 took : 2.025 seconds. 
Operation 3 took : 2.992 seconds. 

Eso es cuando se reemplaza la cadena "<?xml version" (operación 1) con "<?xml versioX" (operación 2) el resultado es significativamente más rápido. La tercera operación es tan rápida como la primera aunque está escribiendo dos veces más caracteres.

¿Alguien puede reproducir esto?

Windows 7, 32 bits, MSVC 2010

EDIT 1

Después R .. sugerencia, la desactivación de Microsoft Security Essentials restaura el comportamiento normal.

+9

Quizás tenga un software antivirus que haya conectado todas las operaciones de archivos y que se active en este punto ... –

+0

¿Ha intentado cambiar el orden de las escrituras? No me sorprendería si fuera solo que la primera escritura lleva más tiempo. –

+1

R .., deshabilitar Microsoft Security Essentials restaura el comportamiento normal. ¿Te gustaría elaborar y publicar una respuesta? – anno

Respuesta

25

En Windows, la mayoría (¿todo?) Del software antivirus conecta las operaciones de lectura y escritura de archivos para ejecutar los datos que se leen o escribir de nuevo patrones de virus y clasificarlos como seguros o virus. Sospecho que su software antivirus, una vez que ve un encabezado XML, carga los patrones de virus XML-malware y a partir de ese momento comienza a verificar constantemente si el XML que está escribiendo en el disco es parte de un virus conocido.

Por supuesto, este comportamiento es completamente absurdo y es parte de lo que le da a los programas AV una mala reputación con usuarios competentes, que ven cómo su rendimiento cae en picado tan pronto como encienden AV. El mismo objetivo podría lograrse de otras formas que no arruinen el rendimiento. Aquí hay algunas ideas que deberían estar usando:

  • Solo escanee los archivos una vez en las transiciones entre escritura y lectura, no después de cada escritura. Incluso si escribió un virus en el disco, no se convierte en una amenaza hasta que posteriormente obtenga lea por algún proceso.
  • Una vez escaneado un archivo, recuerde que es seguro y no lo vuelva a escanear hasta que se haya modificado.
  • Solo escanee archivos que son programas ejecutables o que otro programa los detecta como datos script o de tipo programa.

Lamentablemente, no conozco ninguna solución alternativa hasta que los fabricantes de software de AV saben lo que hacen, aparte de apagar el AV ... lo que generalmente es una mala idea para Windows.

+0

Guau, buen truco. Nunca hubiera pensado en un comportamiento antivirus para esto. Por otra parte, no uso un antivirus, así que ... – Mehrdad

+0

Más (si no todos) el software antivirus solo escanea los archivos al abrir o cerrar; me sorprendería que alguien realmente lo hiciera en lecturas o escrituras individuales. El problema con no escanear archivos nuevamente es que no puede haber archivos. t ser una definición para eso todavía; hoy puede ser desconocido, pero mañana puede ser malo. En cuanto a la exploración de archivos ejecutables, aún debe examinar el archivo para determinar si es ejecutable o no. Ninguno de estos problemas es insuperable, pero como con todo el software, hay una compensación; en este caso, es entre rendimiento y seguridad. – Luke

+0

El indicador en caché de que un archivo ya se ha escaneado solo debe incluir el número de versión de los patrones de virus contra los que se analizó. Y la * transición entre escribir y leer * es el punto clave de mi publicación. Solo escanear en la primera lectura después de una escritura, en lugar de en todas las lecturas o todas las escrituras, es la clave para corregir el rendimiento y al mismo tiempo conservar todos los beneficios de seguridad del escaneo. –