Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Speed Test] Why is MPMCQueue significantly faster than ProducerConsumerQueue? #2024

Closed
Zheng-Bicheng opened this issue Jun 22, 2023 · 1 comment

Comments

@Zheng-Bicheng
Copy link

I do a speed test for MPMCQueue and ProducerConsumerQueue. I try to write and read 100,000,000 data in one producer thread and one consumer thread. But the speed of MPMCQueue is significantly faster than the speed of ProducerConsumerQueue. The documentation states that 'ProducerConsumerQueue' is used for single-producer and single-consumer threads, while 'MPMCQueue' is used for multi-producer and multi-consumer threads. Why is MPMCQueue faster even in the case of a single-producer and single-consumer scenario?

@Zheng-Bicheng
Copy link
Author

Zheng-Bicheng commented Jun 22, 2023

My coding is as follow:

folly::ProducerConsumerQueue<int> BufferProducerConsumerQueue(1000);
void ProducerConsumerQueueProducer() {
    for (int i = 0; i < DATA_NUM; ++i) {
        while (!BufferProducerConsumerQueue.write(i));
    }
}
void ProducerConsumerQueueConsumer() {
    int value;
    for (int i = 0; i < DATA_NUM; ++i) {
        while (!BufferProducerConsumerQueue.read(value));
    }
}
static void TestProducerConsumerQueue(benchmark::State &state){
    for (auto _ : state) {
        std::thread producerThread(ProducerConsumerQueueProducer);  // 创建生产者线程
        std::thread consumerThread(ProducerConsumerQueueConsumer);  // 创建消费者线程
        producerThread.join();  // 等待生产者线程结束
        consumerThread.join();  // 等待消费者线程结束
    }
}
BENCHMARK(TestProducerConsumerQueue)->UseRealTime()->Unit(benchmark::kSecond);

folly::MPMCQueue<int> BufferMPMCQueue(1000);
void MPMCQueueProducer() {
    for (int i = 0; i < DATA_NUM; ++i) {
        while (!BufferMPMCQueue.write(i));
    }
}
void MPMCQueueConsumer() {
    int value;
    for (int i = 0; i < DATA_NUM; ++i) {
        while (!BufferMPMCQueue.read(value));
    }
}
static void TestMPMCQueue(benchmark::State &state){
    for (auto _ : state) {
        std::thread producerThread(MPMCQueueProducer);  // 创建生产者线程
        std::thread consumerThread(MPMCQueueConsumer);  // 创建消费者线程
        producerThread.join();  // 等待生产者线程结束
        consumerThread.join();  // 等待消费者线程结束
    }
}
BENCHMARK(TestMPMCQueue)->UseRealTime()->Unit(benchmark::kSecond);

And the speed results is:

------------------------------------------------------------------------------
Benchmark                                    Time             CPU   Iterations
------------------------------------------------------------------------------
TestProducerConsumerQueue/real_time       8.46 s         0.000 s             1
TestMPMCQueue/real_time                   5.47 s         0.000 s             1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant