fwrite 在"<?xml version"上窒息
fwrite chokes on "<?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)时,结果明显更快。第三个操作与第一个操作一样快,尽管它多写了两倍的字符。
任何人都可以重现这一点吗?
视窗 7, 32 位, MSVC 2010
编辑 1
R.. 建议后,禁用 Microsoft 安全要点将恢复正常行为。
在Windows上,大多数(所有?)防病毒软件的工作原理是挂钩到文件的读取和/或写入操作中,以运行再次读取或写入的数据病毒模式,并将其分类为安全或病毒。我怀疑您的防病毒软件一旦看到XML标头,就会加载XML恶意软件病毒模式,然后开始不断检查您写入磁盘的XML是否是已知病毒的一部分。
当然,这种行为完全是荒谬的,也是AV程序在有能力的用户中声誉不佳的部分原因,他们一打开AV就会看到他们的性能直线下降。同样的目标可以通过其他不破坏性能的方式实现。以下是他们应该使用的一些想法:
- 仅在写入和读取之间的转换时扫描文件一次,而不是在每次写入后扫描文件。即使您确实将病毒写入磁盘,它也不会成为威胁,直到随后被某个进程读取。 扫描
- 文件后,请记住它是安全的,并且在修改之前不要再次扫描它。
- 仅扫描可执行程序或被其他程序检测为用作脚本/程序类数据的文件。
AV软件制造商明智之前,我不知道任何解决方法,除了关闭AV......这在Windows上通常是一个坏主意。
相关文章:
- Cppcheck生成xml转储文件
- 如何在pugixml中获取节点的内部XML
- 如何使用tinyxml2从XML加载父实体和子实体
- boost xml parsingl将xml的路径作为变量发送
- 应用程序崩溃并显示"symbol _ZdlPvm, version Qt_5 not defined in file libQt5Core.so.5 with link time reference"
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 使用 Tinyxml 在 xml 中添加一个子子项
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 增强基于 XML class_id的反序列化
- C++ Version Of Double.longBitsToDouble
- 在 c++ 中使用 vtd-xml 时,如何摆脱 EOFException?
- 防止在C++中选择错误文件时提升 xml 解析器崩溃
- c++ 读取 xml 文件的内容
- 删除 XML 文件中的子节点C++
- 使用 RapidXML 更新C++中的 XML 节点和属性值
- 在Cmake构建CmakeList.txt中读取/解析XML文件
- 从 XML 中读取未指定结构的每个数据成员
- XML to XML XSLT transformation. MSXML in VBScript
- 将 QGraphicsView 或 Scene 转换为 XML/JSON
- fwrite 在"<?xml version"上窒息