无锁队列SPSCQueue及有锁队列的性能比较

说明

所用无锁队列为SPSCQueueboost的spsc_queue
有锁队列为PolyM,以及自己实现的有所队列,代码如下:
safequeue.cpp

#include <mutex>
#include <queue>

// Thread safe implementation of a Queue using an std::queue
template <typename T>
class SafeQueue {
private:
	std::queue<T> m_queue;
	std::mutex m_mutex;
public:
	SafeQueue() {

	}

	bool empty() {
		std::unique_lock<std::mutex> lock(m_mutex);
		return m_queue.empty();
	}

	int size() {
		std::unique_lock<std::mutex> lock(m_mutex);
		return m_queue.size();
	}

	void enqueue(T& t) {
		std::unique_lock<std::mutex> lock(m_mutex);
		m_queue.push(t);
	}

	bool dequeue(T& t) {
		std::unique_lock<std::mutex> lock(m_mutex);

		if (m_queue.empty()) {
			return false;
		}
		t = std::move(m_queue.front());

		m_queue.pop();
		return true;
	}
};

测试方法

使用SPSCQueue中的Benchmark方法,加入自己的lock queue。 有锁队列的实现如下:

  std::cout << "lock Queue:" << std::endl;
  {
    SafeQueue<int> q;
    auto t = std::thread([&] {
      pinThread(cpu1);
      int result;
      for (int i = 0; i < iters; ++i) {
        while (!q.dequeue(result))
          ;

        if (result != i) {
          throw std::runtime_error("");
        }
        //q.pop();
      }
    });

    pinThread(cpu2);

    auto start = std::chrono::steady_clock::now();
    for (int i = 0; i < iters; ++i) {
      q.enqueue(i);
    }
    t.join();
    auto stop = std::chrono::steady_clock::now();
    std::cout << iters * 1000000 /
                     std::chrono::duration_cast<std::chrono::nanoseconds>(stop -                                                       start).count()
              << " ops/ms" << std::endl;
  }

结果

cpuSPSCQueueLockQueueBoostPolyM
11th Gen Intel® Core™ i7-1165G7 @ 2.80GHz22607 ops/ms4027 ops/ms11650 ops/ms1579 ops/mn
11th Gen Intel® Core™ i9-11980HK @ 2.60GHz20644 ops/ms3904 ops/ms--
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值