mesytec-mnode/external/taskflow-3.8.0/benchmarks/thread_pool/thread_pool.cpp
2025-01-04 01:25:05 +01:00

82 lines
1.8 KiB
C++

#include <taskflow/taskflow.hpp>
#include "ThreadPool.hpp"
ThreadPool* ThreadPool::singleton = nullptr;
std::mutex ThreadPool::singleton_mutex;
tf::Executor executor;
class ChronoTimer {
public:
ChronoTimer(void) {
}
void start(void){
startTime = std::chrono::high_resolution_clock::now();
}
void finish(std::string msg){
auto finish = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = finish - startTime;
printf("%s : %f ms\n",msg.c_str(), elapsed.count() * 1000);
}
private:
std::chrono::high_resolution_clock::time_point startTime;
};
float benchFunc(uint64_t loopLen){
float acc = 0;
for (uint64_t k = 0; k < loopLen; ++k)
acc += k;
return acc;
}
void bench(uint32_t iter){
printf("Benchmark with %d iterations\n",iter);
const uint64_t num_blocks = 1000;
const uint64_t loopLen = 100;
ChronoTimer timer;
ThreadPool *pool = ThreadPool::get();
timer.start();
for (uint64_t it = 0; it < iter; ++it) {
tf::Taskflow taskflow;
tf::Task node[num_blocks];
for (uint64_t i = 0; i < num_blocks; i++)
node[i] = taskflow.placeholder();
for (uint64_t i = 0; i < num_blocks; i++) {
node[i].work([=]() {
benchFunc(loopLen);
});
}
executor.run(taskflow).wait();
}
timer.finish("taskflow: time in ms: ");
timer.start();
for (uint64_t it = 0; it < iter; ++it) {
std::vector<std::future<int>> results;
for (uint64_t i = 0; i < num_blocks; i++) {
results.emplace_back(pool->enqueue([=]() {
benchFunc(loopLen);
return 0;
}));
}
for(auto& result : results)
{
result.get();
}
}
timer.finish("threadpool: time in ms: ");
}
int main() {
for (uint32_t i = 0; i < 5; ++i)
bench(100);
for (uint32_t i = 0; i < 5; ++i)
bench(50);
for (uint32_t i = 0; i < 5; ++i)
bench(20);
for (uint32_t i = 0; i < 5; ++i)
bench(10);
for (uint32_t i = 0; i < 5; ++i)
bench(5);
}