fwrite"<?xml version"上的chokes

ann*_*nno 19 c c++ xml fwrite visual-c++

当字符串<?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;
}
Run Code Online (Sandbox Code Playgroud)

给我这个结果:

Operation 1 took : 3.185 seconds.
Operation 2 took : 2.025 seconds.
Operation 3 took : 2.992 seconds.
Run Code Online (Sandbox Code Playgroud)

也就是说,当我们"<?xml version""<?xml versioX"(操作2)替换字符串(操作1)时,结果明显更快.第三个操作和第一个操作一样快,但它再写两次字符.

任何人都可以重现这个吗?

Windows 7,32位,MSVC 2010

编辑1

在R ..建议之后,禁用Microsoft Security Essentials会恢复正常行为.

R..*_*R.. 26

在Windows上,大多数(所有?)防病毒软件通过挂钩文件读取和/或写入操作来运行正在读取或写入的数据病毒模式并将其归类为安全或病毒.我怀疑你的防病毒软件,一旦看到XML标头,就会加载XML恶意软件病毒模式,并从此开始不断检查你正在写入磁盘的XML是否是已知病毒的一部分.

当然,这种行为完全是荒谬的,并且是AV程序与有能力的用户之间的良好声誉的一部分,他们看到他们的性能一旦打开AV就会直线下降.同样的目标可以通过不破坏性能的其他方式实现.以下是他们应该使用的一些想法:

  • 仅在写入和读取之间的转换时扫描文件,而不是在每次写入之后.即使您确实将病毒写入磁盘,它也不会成为威胁,直到它后来被某个进程读取.
  • 扫描文件后,请记住它是安全的,在修改之前不要再扫描.
  • 仅扫描作为可执行程序的文件或被另一个程序检测为用作脚本/类程序数据的文件.

不幸的是,除了关闭你的AV之外,我不知道任何解决方法,直到AV软件制造商明智...这在Windows上通常是一个坏主意.