Я пытаюсь использовать Boost :: lockfree :: spsc_queue для приложения, которое будет поддерживаться на нескольких платформах. Я попробовал пример spsc_queue.cpp из boost_1_55_0 / libs / examples / lockfree на Windows 7, используя различные версии Visual Studio, и все они работают нормально. Он также отлично работает на CentOS 6.3 (работает под управлением VMWare Player 6.0). Но в Centos 5.3 при использовании gcc 4.1.2 (также работающей под VMWare) производительность неприемлема — она примерно в 200 раз медленнее, чем в CentOS 6.3. Мне нужно поддерживать все эти версии ОС и версии компилятора, несмотря на то, что они настолько стары, что больше не поддерживаются.
У кого-нибудь есть идеи, почему он так медленно работает на CentOS 5.3?
Спасибо за полезные комментарии после моего вопроса. Теперь я выяснил, что низкая производительность вызвана тем, что потоки планируются на RHEL 5 на виртуальной машине, которая использует только одно из моих процессорных ядер. Эта проблема устраняется при использовании нескольких ядер, а также для одного ядра следующая модификация примера Boost (т. Е. Короткое время ожидания производителя при заполнении очереди) значительно повышает общую скорость:
void producer(void)
{
for (int i = 0; i != iterations; ++i) {
int value = ++producer_count;
while (!spsc_queue.push(value))
usleep(1000); // WAS: ; (empty statement)
}
}
Других решений пока нет …