Go to the documentation of this file.00001
00008
00009
00010
00011
00012 #include <iostream>
00013 #include <cmath>
00014 #include <ecl/threads/priority.hpp>
00015 #include <ecl/time_lite/functions.hpp>
00016 #include <ecl/time/snooze.hpp>
00017 #include <ecl/time/timestamp.hpp>
00018
00019
00020
00021
00022
00023 namespace ecl {
00024 namespace benchmarks {
00025
00026
00027
00028
00029
00030 using ecl::Duration;
00031 using ecl::Snooze;
00032 using ecl::StandardException;
00033
00034
00035
00036
00037
00038 class LogSnooze : public Snooze {
00039
00040 public:
00041 LogSnooze(const long &ms) : Snooze(Duration(0,ms*1000000L)), count(0), avg(0.0), avg_noise(0.0), max(0), period_ms(ms) {};
00042
00043
00044
00045 void log() {
00046 ecl::epoch_time(time_actual);
00047 latency = (time_actual.tv_nsec - time_value.tv_nsec)/1000000.0;
00048 if ( count == 0 ) {
00049 avg = latency;
00050 } else {
00051 avg = 0.9*avg + 0.1*latency;
00052 avg_noise = 0.9*avg_noise + 0.1*fabs(latency-avg);
00053 }
00054 if ( latency > max ) { max = latency; }
00055 ++count;
00056 }
00057
00058 void printLog() {
00059 std::cout << "Loop period [ms]: " << period_ms << std::endl;
00060 std::cout << "Average latency [ms]: " << avg << std::endl;
00061 std::cout << "Maximum latency [ms]: " << max << std::endl;
00062 }
00063
00064 private:
00065
00066
00067
00068 timespec time_actual;
00069 double latency;
00070 int count;
00071 double avg,avg_noise;
00072 double max;
00073 long period_ms;
00074 };
00075
00076
00077 }
00078 }
00079
00080
00081
00082
00083
00084 using namespace ecl::benchmarks;
00085
00086
00087
00088
00089
00090 int main() {
00091
00092 try {
00093 ecl::set_priority(ecl::RealTimePriority4);
00094 } catch ( StandardException &e ) {
00095
00096 }
00097
00098 std::cout << std::endl;
00099 std::cout << "***********************************************************" << std::endl;
00100 std::cout << " Snooze Latency" << std::endl;
00101 std::cout << "***********************************************************" << std::endl;
00102 std::cout << "* " << std::endl;
00103 std::cout << "* Latency is the absolute time behind where it should be." << std::endl;
00104 std::cout << "* This is only a factor for the first snooze loop." << std::endl;
00105 std::cout << "*" << std::endl;
00106 std::cout << "* Latency noise is more important. After the first loop," << std::endl;
00107 std::cout << "* with an ideal noise value of zero, the loop will time" << std::endl;
00108 std::cout << "* exactly as you specify. Practically, this is not the case," << std::endl;
00109 std::cout << "* but you should get good results from this without having" << std::endl;
00110 std::cout << "* to use system timers. Use with loops which need to be" << std::endl;
00111 std::cout << "* 5ms or over. Faster loops really require a RTOS." << std::endl;
00112 std::cout << "* " << std::endl;
00113 std::cout << "*****************************************************************" << std::endl;
00114 std::cout << std::endl;
00115 std::cout << "Looping commencing..." << std::endl;
00116
00117 LogSnooze snooze(30);
00118 snooze.initialise();
00119 for(int i = 0; i < 100; ++i ) {
00120 snooze();
00121 snooze.log();
00122 }
00123 snooze.printLog();
00124
00125 std::cout << std::endl;
00126 std::cout << "***********************************************************" << std::endl;
00127 std::cout << " Passed" << std::endl;
00128 std::cout << "***********************************************************" << std::endl;
00129 std::cout << std::endl;
00130
00131 return 0;
00132 }
00133
00134