我有一个数据结构(向量),其中的元素需要通过函数进行解析,元素可以由不同的线程解析。
以下是解析方法:
void ConsumerPool::parse(size_t n_threads, size_t id)
{
for (size_t idx = id; idx < nodes.size(); idx += n_threads)
{
// parse node
//parse(nodes[idx]);
parse(idx);
}
}
场景:
n_threads
是线程的总数id
是当前线程的(唯一)索引
线程的创建方式如下:
std::vector<std::thread> threads;
for (size_t i = 0; i < n_threads; i++)
threads.emplace_back(&ConsumerPool::parse, this, n_threads, i);
很不幸,即使这种方法能够工作,如果线程数太多,我的应用程序的性能也会降低。我想知道为什么即使这些线程之间没有同步,性能也会降低。
根据使用的线程数,以下是经过的时间(在线程启动和最后一个join()返回之间): 2个线程:500毫秒 3个线程:385毫秒 4个线程:360毫秒 5个线程:475毫秒 6个线程:580毫秒 7个线程:635毫秒 8个线程:660毫秒
线程创建所需的时间始终在1/2毫秒之间。该软件已通过其发布版本进行了测试。以下是我的配置:
2x Intel(R) Xeon(R) CPU E5507 @ 2.27GHz
Maximum speed: 2.26 GHz
Sockets: 2
Cores: 8
Logical processors: 8
Virtualization: Enabled
L1 cache: 512 KB
L2 cache: 2.0 MB
L3 cache: 8.0 MB
编辑:
parse()
函数的作用如下:
// data shared between threads (around 300k elements)
std::vector<std::unique_ptr<Foo>> vfoo;
std::vector<rapidxml::xml_node<>*> nodes;
std::vector<std::string> layers;
void parse(int idx)
{
auto p = vfoo[idx];
// p->parse() allocate memory according to the content of the XML node
if (!p->parse(nodes[idx], layers))
vfoo[idx].reset();
}
parse
会修改nodes
吗,还是只是读取它? - Adrian Jałoszewski