#include #ifdef LINUX #include #elif defined WIN32 #include #endif #include "GLTB/timer.h" #include "GLTB/workqueue.h" void mysleep(int seconds) { #ifdef LINUX sleep(seconds); #elif defined WIN32 Sleep(seconds*1000); #endif } void simpleScenarios() { gltb::RefPtr queue=new gltb::WorkQueue(); gltb::RefPtr workerPool=new gltb::WorkerPool(queue); for(int i=0;i<2;i++) { queue->pushCallable([i] () { std::cout << "work item " << i << std::endl; }); } // this sleep should let work queue run dry - tests idle wakeup mysleep(1); gltb::Timer timer; timer.start(); for(int i=0;i<20;i++) { queue->pushCallable([i] () { std::cout << "work item " << i << std::endl; mysleep(3); }); } std::cout << "main thread waiting for queue to empty" << std::endl; workerPool->quit(); std::cout << "queue empty" << std::endl; long long duration = timer.stop(); std::cout << "parallel processing took " << duration << "ms" << std::endl; } void manyJobs() { gltb::RefPtr queue=new gltb::WorkQueue(); gltb::RefPtr workerPool=new gltb::WorkerPool(queue); gltb::Timer timer; int counter = 0; timer.start(); for(int i = 0; i < 100000; i++) { queue->pushCallable([&counter, i] { for(int j = j; j < 1000; j++) { counter += 1 + i * j; } }); } auto queuingDuration = timer.stop(); queue->waitForCompletedWork(); auto totalDuration = timer.stop(); std::cout << "queuing took " << queuingDuration << "ms" << std::endl; std::cout << "trivial jobs took " << totalDuration << "ms" << std::endl; } int main(int argc, char *argv[]) { simpleScenarios(); manyJobs(); return 0; }