Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::Lockit性能_C++_Performance_Visual Studio 2010_Stl - Fatal编程技术网

C++ std::Lockit性能

C++ std::Lockit性能,c++,performance,visual-studio-2010,stl,C++,Performance,Visual Studio 2010,Stl,我有一个小解析器,我正在尝试优化它 它在一个向量中读取一千个文件 code_文件是一个结构,其中包含文件的内容 第二步,较长的一步,也是我试图优化的一步,通过向量,对每个文件进行解析,这将填充代码文件结构。不涉及对载体的修改 for( auto it = code_files.begin(); it != code_files.end(); ++it ) { parseCodeFile( *it ); } 这似乎是合理的可并行性,但如果我在我的四核机器上使用并行_for而不是for,它

我有一个小解析器,我正在尝试优化它

它在一个向量中读取一千个文件 code_文件是一个结构,其中包含文件的内容

第二步,较长的一步,也是我试图优化的一步,通过向量,对每个文件进行解析,这将填充代码文件结构。不涉及对载体的修改

for( auto it = code_files.begin(); it != code_files.end(); ++it )
{
    parseCodeFile( *it );
}
这似乎是合理的可并行性,但如果我在我的四核机器上使用并行_for而不是for,它的性能实际上会更差。。。parseCodeFile函数没有任何锁定

我试着用一个剖析器,我注意到它花了将近50%的时间在std::\u Lockit::\u Lockit 25%和std:\u Lockit::~\u Lockit 25%

有没有办法避免这种情况

我看到这个帖子: 但我在发行版中运行了它,定义似乎还可以:

_SECURE_SCL=0
_HAS_ITERATOR_DEBUGGING=0
_ITERATOR_DEBUG_LEVEL=0

一些附加信息:解析函数显然做了很多字符串操作,它使用了一些boost实用程序,如boost::trim和boost::starts\u,它是用Visual Studio 2010编译的。

我只是猜测一下,因为我看不到您的所有代码,但请注意,在parseCodeFile中,代码文件的长度可能会发生变化。如果它重新分配,那就是UB,但收缩可能是安全的。MSVC++只是不知道,必须重新检查。结束


当然,这对于并行计算来说有点无关紧要。您没有显示该代码,但它被记录为只处理整数类型。微软可能会将其描述为类似STL,但显然不是这样——类似STL的软件支持迭代器

hm nope code_文件的长度不能更改。。。不要担心正确性,它确实起作用并产生相同的结果。我只是想知道为什么它在几个线程中的性能没有更好。至于并行_,这不是微软的实现,而是我自己的。由于某些原因,微软的实现性能要差得多。与我的并行应用程序相比,额外增加10%的时间,与Microsoft的并行应用程序相比,额外增加55%的时间s@foke:你如何告诉编译器不要担心?会的。当然,没有代码,我们无法判断并行_的性能。你在使用分而治之吗?当范围足够大时,将该范围一分为二,并创建一个线程来处理下半部分或直接分区,在范围内分成N个部分,创建N个线程?前者的动机是您可以让N/2个线程并行创建N/2个线程。我猜在iostream中,它添加了锁以确保线程安全。它只是在设计时从来没有考虑过线程。使用线程来读取文件本身是一个非常糟糕的主意,您可以来回发送磁盘读取器磁头。非常昂贵。