並列プログラミングに目覚めた!スレッド起動レイテンシ14.5msec のカスペル先生から受けたひどい仕打ち

#include <thread>
#include <windows.h>
#include <vector>


struct Obj {
    HANDLE ev;
    std::thread t;
    Obj(HANDLE ev, std::thread &&t)
        :ev(ev), t(std::move(t))
    {
    }
};

std::vector<Obj> threads;

static double sec()
{
    LARGE_INTEGER v,f;
    QueryPerformanceFrequency(&f);
    QueryPerformanceCounter(&v);

    return v.QuadPart / (double)f.QuadPart;
}

int main(int argc, char**argv)
{
    int n = 10;
    if (argc >= 2) {
        n = atoi(argv[1]);
    }
    bool ev = false;
    double t0;

    if (!ev) {
        Sleep(1000);
        t0 = sec();
    }

    for (int i=0; i<n; i++) {
        HANDLE h;
        h = CreateEvent(nullptr, FALSE, FALSE, nullptr);
        threads.push_back(Obj(h,std::thread(
                                  [](HANDLE h, bool ev) {
                                      if (ev) {
                                          WaitForSingleObject(h, INFINITE);
                                      }
                                  }, h, ev
                                  ))
            );
    }

    if (ev) {
        Sleep(1000);

        t0 = sec();
        for (int i=0; i<n; i++) {
            SetEvent(threads[i].ev);
        }

    }

    for (int i=0; i<n; i++) {
        threads[i].t.join();
    }

    double t1 = sec();

    printf("%f\n", (t1-t0)/n);
}
  • カスペルあり : 15msec
  • カスペルなし : 200usec

スレッド起動が遅くない最近のOSに慣れてスレッドプールのつくりかたを忘れた我々に警鐘を鳴らしてくれるカスペル先生大好き!愛してる!消滅して!!


レイテンシ15msecとかふざけてんの?60fpsほぼ終わってるんですけど。