Как измерить время в секундах между двумя символами, когда пользователь вставляет их в качестве ввода

Как измерить время вставки в секундах?

Я пытался использовать:

struct timeval t1,t2;

Я проверил время перед вставкой ввода:

gettimeofday(&t1,NULL);

и то же самое после получения ввода:

gettimeofday(&t2,NULL);
double elapsedTime=(t2.tv_sec - t1.tv_sec)*10000.0;

но это совсем не точно!!

Мне нужен лучший способ измерения секунд в Время вставки и узнать разницу в секундах при вставке каждого символа.

// trying to insert 5 chars
for(i=0; i<=4 ; i++)
{        
    gettimeofday(&t1,NULL);    //get time before getting char
    c=getchar();
    gettimeofday(&t2,NULL);    //get time after geting char             
    elapsedTime=(t1.tv_sec - t2.tv_sec)*10000.0;
    printf("\n char number %d his elapsed time =%d\n",i,elapsedTime);
}

Мне нужно знать скорость в секундах при вставке символов «щелчок» в качестве ввода и вычислять elapsedTime в секундах:

вывод должен быть таким:

time between inserting first character and the second is : 0.002 seconds
time between..........second character and the third is:  1.008 seconds

person reham.abass    schedule 21.06.2019    source источник
comment
Ваше вычитание во фрагменте кода цикла выполняется наоборот, потому что t2 позже t1 и, следовательно, больше.   -  person Weather Vane    schedule 21.06.2019
comment
Как измерить время вставки в секундах? Не умножайте на 10000 и учитывайте также другого struct члена suseconds_t tv_usec; /* microseconds */.   -  person Weather Vane    schedule 21.06.2019
comment
Ввод с клавиатуры буферизуется. Вы получаете символы только после нажатия клавиши Enter. (Примечание: буферизация ввода позволяет пользователю редактировать ввод перед нажатием Enter.)   -  person user3386109    schedule 21.06.2019
comment
@WeatherVane хорошая идея, спасибо, я попробовал, я начал получать разные результаты, но я получил также отрицательные числа, как это может быть отрицательным useconds?, (все еще t2 после t1, и я думаю, что он также учитывает команды в петля )   -  person reham.abass    schedule 21.06.2019
comment
Вам нужно перевести терминал в неканонический режим. Вот код, который работает на MacOS. Это должно работать и в Linux.   -  person user3386109    schedule 21.06.2019
comment
@user3386109 user3386109 Я думаю так же, ожидание нажатия Enter для меня проблема. как я могу преодолеть Enter и действительно подсчитать useconds, которые действительно требуются пользователю, нажимая каждый символ (думая и нажимая символ)   -  person reham.abass    schedule 21.06.2019


Ответы (2)


elapsedTime=(t1.tv_sec - t2.tv_sec)*10000.0;

Вы принимаете во внимание только tv_sec. фактическая структура timeval имеет часть tv_sec, а также часть tv_usec, обе из которых являются целыми числами, не содержащими дробей (хотя точный тип не гарантируется)

tv_sec содержит секунды, а tv_usec — микросекунды.

также гарантируется, что tv_usec всегда меньше 1000000, что означает, что вам нужно только рассчитать разницу между ними по отдельности.

и вы также делаете t1-t2, что вы должны изменить его на t2-t1, так как t2 является последним временным значением. вот почему вы получаете негативные времена.

elapsedTime=((double) (t2.tv_sec - t1.tv_sec))+((double) (t2.tv_usec - t1.tv_usec) / 1000000.0);

который возвращает время в формате: "sec.usec", который должен быть достаточно точным :)

обратите внимание, что вам нужно объявить elapsedTime как double вместо int, а также заменить второй «$d» в printf на «%f».

вам также необходимо учитывать, что ввод с клавиатуры буферизируется, что означает, что вы заблокированы в getchar() до тех пор, пока не будет нажата клавиша Enter, затем буфер передается в getchar, по одному символу за вызов. вы можете использовать только Enter в качестве входного символа, чтобы проверить точность кода, но чтобы использовать его с реальными символами, вам нужно использовать небуферизованный ввод.

Документы GNU: 21.2 Истекшее время

person Solid State    schedule 21.06.2019
comment
Примечание: приведение типов (double) здесь не требуется. - person chux - Reinstate Monica; 22.06.2019

В моей системе использование clock() считает в миллисекундах, возможно, это достаточно точно для ваших целей:

#include "time.h"

clock_t c1=clock();
... doing stuff ...
clock_t c2=clock();
printf("diff %i clocks with CLOCKS_PER_SEC = %i\n",c2-c1,CLOCKS_PER_SEC);
person Community    schedule 21.06.2019
comment
Я думаю, что это так же точно, как и в стандартной библиотеке C. - person Neil; 21.06.2019
comment
"%i" не обязательно соответствует clock_t. CLOCKS_PER_SEC не может быть целочисленным типом. Предложить printf("%lld %g\n",(long long) (c2-c1),(double)CLOCKS_PER_SEC); - person chux - Reinstate Monica; 22.06.2019