C++ получая время миллисекунд на Linux — часы (), кажется, не работает правильно

CLIPS принимает польскую / префиксную нотацию. Поэтому ваше правило должно быть написано следующим образом.

(defrule check-for-hot-oil-too-long-warning
  (oil-is-too-hot-too-long (Variable ?variable) (Duration ?duration))
  (test (and (eq ?variable "Oil Temp") 
             (>= ?duration 600)))
  =>
  (printout t "Warning! Check engine light on!" tab ?*oil-too-hot-times* crlf)) 

Также обратите внимание, что тип STRING требует двойных кавычек ".

Тем не менее, я бы посоветовал вам использовать альфа-сетевое согласование движка, которое является более кратким и эффективным.

(defrule check-for-hot-oil-too-long-warning
  (oil-is-too-hot-too-long (Variable "Oil Temp") (Duration ?duration))
  (test (>= ?duration 600))
  =>
  (printout t "Warning! Check engine light on!" tab ?*oil-too-hot-times* crlf)) 

Движок сразу видит, что ваш слот Variable является константой, и может соответствующим образом оптимизировать логику сопоставления. Я не уверен, что он может сделать то же самое в рамках совместного испытания.

100
задан Jonathan Leffler 5 May 2012 в 01:22
поделиться

11 ответов

Вы могли использовать gettimeofday в запуске и конце Вашего метода и затем различия две структуры возврата. Вы получите структуру как следующее:

struct timeval {
  time_t tv_sec;
  suseconds_t tv_usec;
}
37
ответ дан Adam Hawes 24 November 2019 в 04:48
поделиться

Я предпочитаю библиотека Boost Timer для ее простоты, но если Вы не хотите пользоваться третьими-parrty библиотеками, использование часов () кажется разумным.

0
ответ дан Nick Presta 24 November 2019 в 04:48
поделиться

В стандарте POSIX clock определили его возвращаемое значение с точки зрения символа CLOCKS_PER_SEC, и реализация является бесплатной определить это любым удобным способом. В соответствии с Linux, мне везло с эти times() функция.

1
ответ дан Peter Mortensen 24 November 2019 в 04:48
поделиться

часы () не возвращают миллисекунды или секунды на Linux. Обычно часы () возвращают микросекунды в системе Linux. Надлежащий способ интерпретировать значение, возвращенное часами (), состоит в том, чтобы разделить его на CLOCKS_PER_SEC для выяснения, сколько передало время.

2
ответ дан SoapBox 24 November 2019 в 04:48
поделиться

Это должно работать... протестированное над Mac

#include <stdio.h>
#include <sys/time.h>

int main() {
        struct timeval tv;
        struct timezone tz;
        struct tm *tm;
        gettimeofday(&tv,&tz);
        tm=localtime(&tv.tv_sec);
        printf("StartTime: %d:%02d:%02d %d \n", tm->tm_hour, tm->tm_min, tm->tm_sec, tv.tv_usec);
}

, Да... выполняет его дважды и вычитают...

1
ответ дан Jason Punyon 24 November 2019 в 04:48
поделиться

часы () имеют часто довольно паршивое разрешение. Если Вы хотите измерить время на уровне миллисекунды, одна альтернатива должна использовать clock_gettime (), как объясненный в этом вопросе.

(Помнят, что необходимо связаться с-lrt на Linux).

4
ответ дан Community 24 November 2019 в 04:48
поделиться

Если Вам не нужен код, чтобы быть портативными к старым нельдам, можно использовать clock_gettime (), который даст Вам время в наносекунды (если Ваш процессор будет поддерживать то разрешение). Это - POSIX, но с 2001.

9
ответ дан Zachary Hamm 24 November 2019 в 04:48
поделиться

Я также рекомендую инструменты, предлагаемые Повышением. Или упомянутый Таймер Повышения или взлом что-то из Повышения. DateTime или существует новая предложенная библиотека в песочнице - Повышение. Chrono: Этот последний будет заменой для Таймера и покажет:

  • C++ 0x утилиты времени Стандартной Библиотеки, включая:
    • Часы Шаблона класса time_point
    • Шаблона класса duration
    • : <ул.> <литий> system_clock <литий> monotonic_clock <литий> high_resolution_clock
  • Шаблон класса timer, с определениями типов:
    • system_timer
    • monotonic_timer
    • high_resolution_timer
  • часы Процесса и таймеры:
    • process_clock, получая реальный, пользовательский ЦП, и СИСТЕМНОЕ ПРОЦЕССОРНОЕ ВРЕМЯ.
    • process_timer, получение, истекшее реальный, пользовательский ЦП, и СИСТЕМНОЕ ПРОЦЕССОРНОЕ ВРЕМЯ.
    • run_timer, удобное создание отчетов |process_timer | результаты.
  • C++ 0x время компиляции Стандартной Библиотеки рациональная арифметика.

Вот источник из списка функций

18
ответ дан Anonymous 24 November 2019 в 04:48
поделиться

Обратите внимание на то, что clock делает не , стена меры показывает время. Это означает, занимает ли Ваша программа 5 секунд, clock не измерит 5 секунд обязательно, но могли больше (Ваша программа могла выполнить несколько потоков и так могла использовать больше ЦП, чем реальное время), или меньше. Это измеряет приближение процессорное время используемый. Чтобы видеть, что различие рассматривает этот код

#include <iostream>
#include <ctime>
#include <unistd.h>

int main() {
    std::clock_t a = std::clock();
    sleep(5); // sleep 5s
    std::clock_t b = std::clock();

    std::cout << "difference: " << (b - a) << std::endl;
    return 0;
}

, Это производит в моей системе

$ difference: 0

, поскольку все, что мы сделали, спало и не использовало любое процессорное время! Однако использование gettimeofday мы получаем то, что мы хотим (?)

#include <iostream>
#include <ctime>
#include <unistd.h>
#include <sys/time.h>

int main() {
    timeval a;
    timeval b;

    gettimeofday(&a, 0);
    sleep(5); // sleep 5s
    gettimeofday(&b, 0);

    std::cout << "difference: " << (b.tv_sec - a.tv_sec) << std::endl;
    return 0;
}

Выводы в моей системе

$ difference: 5

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

57
ответ дан Johannes Schaub - litb 24 November 2019 в 04:48
поделиться
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
    struct timeval start, end;

    long mtime, seconds, useconds;    

    gettimeofday(&start, NULL);
    usleep(2000);
    gettimeofday(&end, NULL);

    seconds  = end.tv_sec  - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;

    mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;

    printf("Elapsed time: %ld milliseconds\n", mtime);

    return 0;
}
137
ответ дан CTT 24 November 2019 в 04:48
поделиться

В качестве обновления, похоже, что в windows clock () измеряется время настенных часов (с точностью CLOCKS_PER_SEC)

 http://msdn.microsoft.com/en-us/library/4e2ess30(VS.71).aspx

, а в Linux он измеряет время ЦП по ядрам, используемым текущим процессом

http://www.manpagez.com/man/3/clock

и (похоже, и как уже отмечалось на исходном плакате) на самом деле с меньшей точностью, чем CLOCKS_PER_SEC, хотя, возможно, это зависит от конкретной версии Linux.

0
ответ дан 24 November 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: