Подтвердить что ты не робот

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 восстанавливает нормальное поведение.

4b9b3361

Ответ 1

В Windows большинство (все?) антивирусных программ работает, подключаясь к операциям чтения и/или записи файлов, чтобы запустить считываемые или написанные повторно шаблоны вирусов и классифицировать их как безопасные или вирусы. Я подозреваю, что ваше антивирусное программное обеспечение, увидев заголовок XML, загружает шаблоны вирусов XML-malware и с этого момента начинает постоянно проверять, является ли XML, который вы пишете на диск, частью известного вируса.

Конечно, это поведение совершенно бессмысленно и является частью того, что дает программам AV такую ​​плохую репутацию у компетентных пользователей, которые видят, что их производительность резко падает, как только они включаются в AV. Та же цель может быть достигнута другими способами, которые не разрушают производительность. Вот некоторые идеи, которые они должны использовать:

  • Проверять файлы только один раз при переходе между записью и чтением, а не после каждой записи. Даже если вы пишете вирус на диск, он не становится угрозой, пока он впоследствии не будет прочитан каким-либо процессом.
  • После сканирования файла помните, что он безопасен и не сканирует его повторно до тех пор, пока он не будет изменен.
  • Проверять только файлы, которые являются исполняемыми программами или обнаружены как используемые как script/программные данные другой программой.

К сожалению, я не знаю об обходном пути до тех пор, пока производители программного обеспечения AV не умрут, кроме того, что вы отключите AV... что обычно плохое в Windows.