c++ - read - fwrite se ahoga en “<? xml version”
fwrite text (1)
En Windows, la mayoría del software antivirus (¿todos?) Funciona conectándose a las operaciones de lectura y / o escritura del archivo para ejecutar los datos de los patrones de virus que se leen o escriben y clasificarlos como seguros o como virus. Sospecho que su software antivirus, una vez que ve un encabezado XML, carga los patrones de virus de malware de XML y desde ese momento comienza constantemente a verificar 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 otorga a los programas AV una mala reputación con los usuarios competentes, que ven que su rendimiento cae en picado tan pronto como se activan en AV. El mismo objetivo podría lograrse de otras maneras que no arruinen el rendimiento. Aquí hay algunas ideas que deberían estar usando:
- Solo escanee archivos una vez en las transiciones entre escritura y lectura, no después de cada escritura. Incluso si escribiste un virus en el disco, no se convierte en una amenaza hasta que posteriormente se lee mediante algún proceso.
- Una vez que se escanea un archivo, recuerde que es seguro y no lo vuelva a escanear hasta que se modifique.
- Solo escanee los archivos que son programas ejecutables o que se detectan como utilizados por otro programa como datos de tipo script / programa.
Desafortunadamente, no conozco ninguna solución alternativa hasta que los fabricantes de software AV están preparados, aparte de apagar su AV ... lo que generalmente es una mala idea en Windows.
Cuando la cadena <?xml version
se escribe en un archivo a través de fwrite, las operaciones de escritura posteriores se vuelven más lentas.
Este codigo
#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.
Es decir, cuando reemplazamos 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 escribe dos veces más caracteres.
¿Alguien puede reproducir esto?
Windows 7, 32 bits, MSVC 2010
EDITAR 1
Después de la sugerencia de R .., la desactivación de Microsoft Security Essentials restaura el comportamiento normal.