我写了一个小案例来测试多线程生产者/消费者模型。我的测试平台是一款低性能PC(8G内存,J1900四核CPU)。我隔离了Linux内核的核心0,核心1-3没有使用。生产者线程在核心1上运行,分配5000000个小对象,将它们放到全局队列中。消费者线程在核心2上运行,并从队列中释放对象。但是我发现如果我没有设置它们的CPU亲和性(即它们运行在相同的核心0上),那么时间性能会比设置CPU亲和性(8.76s VS 14.66s)好。测试结果保持相似。有人能解释我的原因吗?如果我的前提不正确(“设置CPU关联性可以提高多线程进程的性能”),则至少不应该变得更糟。我的代码片段如下:
void producer() {
Timestamp begin;
for (int i = 0; i<data_nb; ++i) {
Test* test = new Test(i, i+1);
queue.enqueue(test);
}
Timestamp end;
TimeDuration td = end-begin;
printf("producer: %ldms(%.6fs)\n", td.asMicroSecond(), td.asSecond());
}
void consumer() {
Timestamp begin;
do {
Test* test = queue.dequeue();
if (test) {
nb.add(1); // nb is an atomic counter
delete test;
test = nullptr;
}
} while (nb.get() < data_nb);
Timestamp end;
TimeDuration td = end-begin;
//printf("%d data consumed\n", nb.get());
printf("consumer: %ldms(%.6fs)\n", td.asMicroSecond(), td.asSecond());
}
未能设置线程关联并不能保证线程必须使用核心0. –
请参阅http://stackoverflow.com/questions/39141897/setting-the-affinity-causes-increase-in-execution-time – UmNyobe
人们在理论上通常会认为设置线程关联会有所帮助。他们很少检查。很少有人做检查会感到惊讶。 – Slava