어푸푸

[C++] 내 반응 속도를 측정해보자 본문

잡동사니/글쎄 무슨 분류가 좋을까?

[C++] 내 반응 속도를 측정해보자

예수님부처 2022. 4. 28. 20:49

나의 반응 속도는 얼마나 빠를까? 꽤 흥미가 가는 질문이다. 일반적으로 사람들이 본인의 반응 속도가 궁금할 때 human benchmark 사이트를 이용한다. 해당 사이트에서는 화면의 색이 변했을 때 마우스로 클릭을 하면 반응 속도가 측정이 되게 되어있다. 다만 뭔가 체감상 늦게 누른 것 같은데 반응 속도가 빠르게 측정될 때가 있고, 반대로 빨리 누른 것 같은데 반응 속도가 느리게 측정될 때가 있는 것 같은 뭔가 이상한 느낌이 때로 들기도 한다.

https://humanbenchmark.com/tests/reactiontime

Human Benchmark에서는 마우스를 클릭하여 반응 속도를 측정한다


물론 모니터의 주사율이 60[Hz]이므로 최대 약 17[ms]의 오차가 발생할 수 있다. 하지만 기분 탓이라고 하기엔 저것보다 오차가 크게 나타나는 것 같은 희한한 느낌이 들기도 한다. 또한 마우스로 반응 속도를 측정하는 것이 물론 더 빠르겠지만, 롤에서는 절체 절명의 순간에 마우스로 반응해서 살아남기가 쉽지 않다. 대부분의 경우에는 점멸이나 궁극기로 중요한 스킬을 회피하게 되는데, 그렇다면 과연 마우스가 아닌 키보드로 입력을 받아서 반응 속도를 측정한다면 어떤 결과가 나올까?

키보드를 눌러서 반응 속도를 측정하는 프로그램을 C++로 짜봤다. 위 사이트와 마찬가지로 콘솔창(cmd창)의 색깔이 변화하면 키보드를 누르면 되겠다. (단 방향키와 같은 4바이트 입력은 안됨) 이해가 안된다면 화면의 지시에 충실하면 되니 한 번 써보자. 나의 경우 Human benchmark 사이트에서는 평균 180[ms], 빠르면 159[ms]정도가 나왔으나, 직접 짠 프로그램에서는 평균 235[ms], 빠르면 196[ms] 정도가 나왔다. 아마 마우스 클릭보다 키보드를 누르는데 이동 거리가 더 길어서 그런 것 아닐까 싶다.

C++로 직접 짠 프로그램에서는 키보드를 눌러서 반응 속도를 측정한다

프로그램과 소스 코드를 여기에 남긴다.
Entonces, hasta la vista.

Reaction Benchmark.exe
0.94MB

#include <iostream>
#include <random>
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <time.h>

using namespace std;


//  Cursor on/off
void CursorView(char show) {
    HANDLE hConsole;
    CONSOLE_CURSOR_INFO ConsoleCursor;

    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    ConsoleCursor.bVisible = show;
    ConsoleCursor.dwSize = 1;

    SetConsoleCursorInfo(hConsole, &ConsoleCursor);
}


//  Main program
int main()
{
    int i = 0;
    char c = 'Y';
    clock_t t_s, t_e, t_r[5];

    //  Initialize random seed and define distribution
    random_device rd;
    mt19937 gen(rd());
    uniform_int_distribution<int> dis(1000, 5000);     //  1000 ~ 5000 ms

    //  Main program
    while ((c != 'n') && (c != 'N'))
    {
        //  Measure reaction time
        for (i = 0; i < 5; i++)
        {
            //  Ready
            system("cls");
            CursorView(false);
            cout << "Get ready for the reaction test - (" << i + 1 << " / " << 5 << ")" << endl;

            //  Sleep for a random time
            Sleep(dis(gen));

            //  Change cmd color and record time
            printf("Press any key to react\n");
            system("color FC");
            t_s = clock();
            c = getch();
            t_e = clock();
            system("color 07");
            t_r[i] = t_e - t_s;

            //  Print measured data
            if (i != 4)
            {
                cout << "Reacted time: " << t_r[i] << " [ms]" << endl;
                cout << "Press any key to preceed" << endl;
                c = getch();
            }
        }

        //  Print measured data
        system("cls");
        cout << "Reaction time record" << endl;
        for (i = 0; i < 5; i++)
            cout << "\t" << i + 1 << ": " << t_r[i] << " [ms]" << endl;
        cout << endl;
        cout << "Press N/n to exit, otherwise, you'll do it again" << endl;
        Sleep(500);
        c = getch();

    }
    return 0;
}