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
является константой, и может соответствующим образом оптимизировать логику сопоставления. Я не уверен, что он может сделать то же самое в рамках совместного испытания.
Вы могли использовать gettimeofday в запуске и конце Вашего метода и затем различия две структуры возврата. Вы получите структуру как следующее:
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
}
Я предпочитаю библиотека Boost Timer для ее простоты, но если Вы не хотите пользоваться третьими-parrty библиотеками, использование часов () кажется разумным.
В стандарте POSIX clock
определили его возвращаемое значение с точки зрения символа CLOCKS_PER_SEC, и реализация является бесплатной определить это любым удобным способом. В соответствии с Linux, мне везло с эти times()
функция.
часы () не возвращают миллисекунды или секунды на Linux. Обычно часы () возвращают микросекунды в системе Linux. Надлежащий способ интерпретировать значение, возвращенное часами (), состоит в том, чтобы разделить его на CLOCKS_PER_SEC для выяснения, сколько передало время.
Это должно работать... протестированное над 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);
}
, Да... выполняет его дважды и вычитают...
часы () имеют часто довольно паршивое разрешение. Если Вы хотите измерить время на уровне миллисекунды, одна альтернатива должна использовать clock_gettime (), как объясненный в этом вопросе.
(Помнят, что необходимо связаться с-lrt на Linux).
Если Вам не нужен код, чтобы быть портативными к старым нельдам, можно использовать clock_gettime (), который даст Вам время в наносекунды (если Ваш процессор будет поддерживать то разрешение). Это - POSIX, но с 2001.
Я также рекомендую инструменты, предлагаемые Повышением. Или упомянутый Таймер Повышения или взлом что-то из Повышения. DateTime или существует новая предложенная библиотека в песочнице - Повышение. Chrono: Этот последний будет заменой для Таймера и покажет:
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 | результаты. Вот источник из списка функций
Обратите внимание на то, что 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
функция.
#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;
}
В качестве обновления, похоже, что в 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.