19

文字列<?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)に置き換えると、結果が大幅に高速になります。3番目の操作は、最初の操作と同じくらい高速ですが、さらに2倍の文字を書き込みます。

誰でもこれを再現できますか?

Windows 7、32ビット、MSVC 2010

編集1

R ..の提案の後、Microsoft Security Essentialsを無効にすると、通常の動作が復元されます。


Windowsでは、ほとんどの(すべて?)ウイルス対策ソフトウェアは、ファイルの読み取りおよび/または書き込み操作にフックして、読み取りまたは書き込み中のデータをウイルスパターンで実行し、安全またはウイルスとして分類することで機能します。ウイルス対策ソフトウェアは、XMLヘッダーを検出すると、XMLマルウェアのウイルスパターンをロードし、それ以降、ディスクに書き込んでいるXMLが既知のウイルスの一部であるかどうかを常にチェックし始めます。

もちろん、この動作はまったく無意味であり、AVをオンにするとすぐにパフォーマンスが低下する有能なユーザーに対して、AVプログラムの評判が悪くなる原因の1つです。同じ目標は、パフォーマンスを損なうことのない他の方法で達成できます。彼らが使用すべきいくつかのアイデアは次のとおりです。

  • すべての書き込みの後ではなく、書き込みと読み取りの間の移行時に1回だけファイルをスキャンします。ウイルスをディスクに書き込んだとしても、その後何らかのプロセスで読み取られるまで脅威にはなりません。
  • ファイルをスキャンしたら、安全であり、変更されるまで再度スキャンしないことを忘れないでください。
  • 実行可能プログラムであるファイル、または別のプログラムによってスクリプト/プログラムのようなデータとして使用されていることが検出されたファイルのみをスキャンします。

残念ながら、AVソフトウェアメーカーが賢明になるまで、AVをオフにする以外の回避策はわかりません...これは、Windowsでは一般的に悪い考えです。

4

1 に答える 1

27

Windowsでは、ほとんどの(すべて?)ウイルス対策ソフトウェアは、ファイルの読み取りおよび/または書き込み操作にフックして、読み取りまたは書き込み中のデータをウイルスパターンで実行し、安全またはウイルスとして分類することで機能します。ウイルス対策ソフトウェアは、XMLヘッダーを検出すると、XMLマルウェアのウイルスパターンをロードし、それ以降、ディスクに書き込んでいるXMLが既知のウイルスの一部であるかどうかを常にチェックし始めます。

もちろん、この動作はまったく無意味であり、AVをオンにするとすぐにパフォーマンスが低下する有能なユーザーに対して、AVプログラムの評判が悪くなる原因の1つです。同じ目標は、パフォーマンスを損なうことのない他の方法で達成できます。彼らが使用すべきいくつかのアイデアは次のとおりです。

  • すべての書き込みの後ではなく、書き込みと読み取りの間の移行時に1回だけファイルをスキャンします。ウイルスをディスクに書き込んだとしても、その後何らかのプロセスで読み取られるまで脅威にはなりません。
  • ファイルをスキャンしたら、安全であり、変更されるまで再度スキャンしないことを忘れないでください。
  • 実行可能プログラムであるファイル、または別のプログラムによってスクリプト/プログラムのようなデータとして使用されていることが検出されたファイルのみをスキャンします。

残念ながら、AVソフトウェアメーカーが賢明になるまで、AVをオフにする以外の回避策はわかりません...これは、Windowsでは一般的に悪い考えです。

于 2011-05-07T23:55:01.933 に答える