| [550a3385] | 1 |  | 
|---|
|  | 2 |  | 
|---|
|  | 3 | #include <fstream> | 
|---|
|  | 4 | #include <threads> | 
|---|
|  | 5 |  | 
|---|
|  | 6 | #include <unistd.h>                                     // sysconf | 
|---|
|  | 7 | #include <sys/times.h>                                  // times | 
|---|
|  | 8 | #include <time.h> | 
|---|
|  | 9 |  | 
|---|
|  | 10 | inline unsigned long long int Time() { | 
|---|
|  | 11 | timespec ts; | 
|---|
|  | 12 | clock_gettime( | 
|---|
|  | 13 | #if defined( __linux__ ) | 
|---|
|  | 14 | CLOCK_THREAD_CPUTIME_ID, | 
|---|
|  | 15 | #elif defined( __freebsd__ ) | 
|---|
|  | 16 | CLOCK_PROF, | 
|---|
|  | 17 | #elif defined( __solaris__ ) | 
|---|
|  | 18 | CLOCK_HIGHRES, | 
|---|
|  | 19 | #else | 
|---|
|  | 20 | #error uC++ : internal error, unsupported architecture | 
|---|
|  | 21 | #endif | 
|---|
|  | 22 | &ts ); | 
|---|
|  | 23 | return 1000000000LL * ts.tv_sec + ts.tv_nsec; | 
|---|
|  | 24 | } // Time | 
|---|
|  | 25 |  | 
|---|
|  | 26 | //======================================= | 
|---|
|  | 27 | // time coroutine | 
|---|
|  | 28 | //======================================= | 
|---|
|  | 29 |  | 
|---|
|  | 30 | struct CoroutineResume { | 
|---|
|  | 31 | int N; | 
|---|
|  | 32 | coroutine c; | 
|---|
|  | 33 | }; | 
|---|
|  | 34 |  | 
|---|
|  | 35 | coroutine* get_coroutine(CoroutineResume* this); | 
|---|
|  | 36 | void co_main(CoroutineResume* this); | 
|---|
|  | 37 |  | 
|---|
|  | 38 | void ?{}(CoroutineResume* this, int N) { | 
|---|
|  | 39 | this->N = N; | 
|---|
|  | 40 | prime(this); | 
|---|
|  | 41 | } | 
|---|
|  | 42 |  | 
|---|
|  | 43 | coroutine* get_coroutine(CoroutineResume* this) { | 
|---|
|  | 44 | return &this->c; | 
|---|
|  | 45 | } | 
|---|
|  | 46 |  | 
|---|
|  | 47 | void co_main(CoroutineResume* this) { | 
|---|
|  | 48 | for ( int i = 1; i <= this->N; i += 1 ) { | 
|---|
|  | 49 | suspend(); | 
|---|
|  | 50 | } // for | 
|---|
|  | 51 | } // CoroutineResume::main | 
|---|
|  | 52 |  | 
|---|
|  | 53 | void resumer(CoroutineResume* this) { | 
|---|
|  | 54 | long long int StartTime, EndTime; | 
|---|
|  | 55 |  | 
|---|
|  | 56 | StartTime = Time(); | 
|---|
|  | 57 | for ( int i = 1; i <= this->N; i += 1 ) { | 
|---|
|  | 58 | resume(this); | 
|---|
|  | 59 | } // for | 
|---|
|  | 60 | EndTime = Time(); | 
|---|
|  | 61 | sout | "\t " | ( EndTime - StartTime ) / this->N; | 
|---|
|  | 62 | } // CoroutineResume::resumer | 
|---|
|  | 63 |  | 
|---|
|  | 64 |  | 
|---|
|  | 65 | int main() { | 
|---|
|  | 66 | const int NoOfTimes = | 
|---|
|  | 67 | #if defined( __U_DEBUG__ )                              // takes longer so run fewer iterations | 
|---|
|  | 68 | 100000; | 
|---|
|  | 69 | #else | 
|---|
|  | 70 | 1000000; | 
|---|
|  | 71 | #endif // __U_DEBUG__ | 
|---|
|  | 72 |  | 
|---|
|  | 73 | sout | "\t\tcreate\tcreate\t16i/4o\t16i/4o\tresume/\tsignal/" | endl; | 
|---|
|  | 74 | sout | "(nsecs)"; | 
|---|
|  | 75 | sout | "\t\tdelete/\tdelete/\tbytes\tbytes\tsuspend\twait" | endl; | 
|---|
|  | 76 | sout | "\t\tblock\tdynamic\tdirect\taccept\tcycle\tcycle" | endl; | 
|---|
|  | 77 |  | 
|---|
|  | 78 | sout | "class\t"; | 
|---|
|  | 79 | sout | "\t N/A\t N/A\t N/A"; | 
|---|
|  | 80 | sout | "\t N/A\t N/A\t N/A"; | 
|---|
|  | 81 | sout | "\t" | endl; | 
|---|
|  | 82 |  | 
|---|
|  | 83 | sout | "coroutine"; | 
|---|
|  | 84 | sout | "\t N/A\t N/A\t N/A"; | 
|---|
|  | 85 | sout | "\t N/A"; | 
|---|
|  | 86 | { | 
|---|
|  | 87 | CoroutineResume resumer = { NoOfTimes }; | 
|---|
|  | 88 | resumer(&resumer); | 
|---|
|  | 89 | } | 
|---|
|  | 90 | sout | "\t N/A"; | 
|---|
|  | 91 |  | 
|---|
|  | 92 | sout | "\t" | endl; | 
|---|
|  | 93 | } | 
|---|