Fwrite chokes на "<? xml version"
Когда строка <?xml version
записывается в файл через fwrite, последующие операции записи становятся медленнее.
Этот код:
#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;
}
Дает мне этот результат:
Operation 1 took : 3.185 seconds.
Operation 2 took : 2.025 seconds.
Operation 3 took : 2.992 seconds.
То есть, когда мы заменяем строку "<?xml version"
(операция 1) на "<?xml versioX"
(операция 2), результат выполняется значительно быстрее. Третья операция выполняется так же быстро, как и первая, хотя она записывает еще два символа.
Может ли кто-нибудь воспроизвести это?
Windows 7, 32bit, MSVC 2010
РЕДАКТИРОВАТЬ 1
После запроса R.., отключение Microsoft Security Essentials восстанавливает нормальное поведение.
Ответы
Ответ 1
В Windows большинство (все?) антивирусных программ работает, подключаясь к операциям чтения и/или записи файлов, чтобы запустить считываемые или написанные повторно шаблоны вирусов и классифицировать их как безопасные или вирусы. Я подозреваю, что ваше антивирусное программное обеспечение, увидев заголовок XML, загружает шаблоны вирусов XML-malware и с этого момента начинает постоянно проверять, является ли XML, который вы пишете на диск, частью известного вируса.
Конечно, это поведение совершенно бессмысленно и является частью того, что дает программам AV такую плохую репутацию у компетентных пользователей, которые видят, что их производительность резко падает, как только они включаются в AV. Та же цель может быть достигнута другими способами, которые не разрушают производительность. Вот некоторые идеи, которые они должны использовать:
- Проверять файлы только один раз при переходе между записью и чтением, а не после каждой записи. Даже если вы пишете вирус на диск, он не становится угрозой, пока он впоследствии не будет прочитан каким-либо процессом.
- После сканирования файла помните, что он безопасен и не сканирует его повторно до тех пор, пока он не будет изменен.
- Проверять только файлы, которые являются исполняемыми программами или обнаружены как используемые как script/программные данные другой программой.
К сожалению, я не знаю об обходном пути до тех пор, пока производители программного обеспечения AV не умрут, кроме того, что вы отключите AV... что обычно плохое в Windows.