Changes in src/benchmark/csv-data.c [43426d4:17af7d1]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/benchmark/csv-data.c
r43426d4 r17af7d1 1 1 #include <fstream> 2 #include <monitor>3 2 #include <stdlib> 4 3 #include <thread> 5 4 6 #include "bench.h" 5 extern "C" { 6 #include <unistd.h> // sysconf 7 #include <sys/times.h> // times 8 #include <time.h> 9 } 7 10 8 coroutine GreatSuspender {}; 11 inline unsigned long long int Time() { 12 timespec ts; 13 clock_gettime( 14 #if defined( __linux__ ) 15 CLOCK_THREAD_CPUTIME_ID, 16 #elif defined( __freebsd__ ) 17 CLOCK_PROF, 18 #elif defined( __solaris__ ) 19 CLOCK_HIGHRES, 20 #else 21 #error uC++ : internal error, unsupported architecture 22 #endif 23 &ts ); 24 return 1000000000LL * ts.tv_sec + ts.tv_nsec; 25 } // Time 26 27 struct GreatSuspender { 28 coroutine_desc __cor; 29 }; 30 31 DECL_COROUTINE(GreatSuspender); 9 32 10 33 void ?{}( GreatSuspender * this ) { … … 29 52 #endif 30 53 31 //----------------------------------------------------------------------------- 32 // coroutine context switch 54 55 33 56 long long int measure_coroutine() { 34 57 const unsigned int NoOfTimes = N; … … 48 71 } 49 72 50 //-----------------------------------------------------------------------------51 // thread context switch52 73 long long int measure_thread() { 53 74 const unsigned int NoOfTimes = N; … … 63 84 } 64 85 65 //-----------------------------------------------------------------------------66 // single monitor entry67 monitor mon_t {};68 void dummy( mon_t * mutex m ) {}69 70 long long int measure_1_monitor_entry() {71 const unsigned int NoOfTimes = N;72 long long int StartTime, EndTime;73 mon_t mon;74 75 StartTime = Time();76 for ( volatile unsigned int i = 0; i < NoOfTimes; i += 1 ) {77 dummy( &mon );78 }79 EndTime = Time();80 81 return ( EndTime - StartTime ) / NoOfTimes;82 }83 84 //-----------------------------------------------------------------------------85 // multi monitor entry86 void dummy( mon_t * mutex m1, mon_t * mutex m2 ) {}87 88 long long int measure_2_monitor_entry() {89 const unsigned int NoOfTimes = N;90 long long int StartTime, EndTime;91 mon_t mon1, mon2;92 93 StartTime = Time();94 for ( volatile unsigned int i = 0; i < NoOfTimes; i += 1 ) {95 dummy( &mon1, &mon2 );96 }97 EndTime = Time();98 99 return ( EndTime - StartTime ) / NoOfTimes;100 }101 102 //-----------------------------------------------------------------------------103 // single internal sched entry104 mon_t mon1;105 106 condition cond1a;107 condition cond1b;108 109 thread thrd1a { long long int * out; };110 thread thrd1b {};111 112 void ?{}( thrd1a * this, long long int * out ) {113 this->out = out;114 }115 116 void side1A( mon_t * mutex a, long long int * out ) {117 long long int StartTime, EndTime;118 119 StartTime = Time();120 for( int i = 0;; i++ ) {121 signal(&cond1a);122 if( i > N ) break;123 wait(&cond1b);124 }125 EndTime = Time();126 127 *out = ( EndTime - StartTime ) / N;128 }129 130 void side1B( mon_t * mutex a ) {131 for( int i = 0;; i++ ) {132 signal(&cond1b);133 if( i > N ) break;134 wait(&cond1a);135 }136 }137 138 void main( thrd1a * this ) { side1A( &mon1, this->out ); }139 void main( thrd1b * this ) { side1B( &mon1 ); }140 141 long long int measure_1_sched_int() {142 long long int t;143 {144 thrd1a a = { &t };145 thrd1b b;146 }147 return t;148 }149 150 //-----------------------------------------------------------------------------151 // multi internal sched entry152 mon_t mon2;153 154 condition cond2a;155 condition cond2b;156 157 thread thrd2a { long long int * out; };158 thread thrd2b {};159 160 void ?{}( thrd2a * this, long long int * out ) {161 this->out = out;162 }163 164 void side2A( mon_t * mutex a, mon_t * mutex b, long long int * out ) {165 long long int StartTime, EndTime;166 167 StartTime = Time();168 for( int i = 0;; i++ ) {169 signal(&cond2a);170 if( i > N ) break;171 wait(&cond2b);172 }173 EndTime = Time();174 175 *out = ( EndTime - StartTime ) / N;176 }177 178 void side2B( mon_t * mutex a, mon_t * mutex b ) {179 for( int i = 0;; i++ ) {180 signal(&cond2b);181 if( i > N ) break;182 wait(&cond2a);183 }184 }185 186 void main( thrd2a * this ) { side2A( &mon1, &mon2, this->out ); }187 void main( thrd2b * this ) { side2B( &mon1, &mon2 ); }188 189 long long int measure_2_sched_int() {190 long long int t;191 {192 thrd2a a = { &t };193 thrd2b b;194 }195 return t;196 }197 198 //-----------------------------------------------------------------------------199 // main loop200 86 int main() 201 87 { 202 sout | time(NULL) | ','; 203 sout | measure_coroutine() | ','; 204 sout | measure_thread() | ','; 205 sout | measure_1_monitor_entry() | ','; 206 sout | measure_2_monitor_entry() | ','; 207 sout | measure_1_sched_int() | ','; 208 sout | measure_2_sched_int() | endl; 88 sout | time(NULL) | ',' | measure_coroutine() | ',' | measure_thread() | endl; 209 89 }
Note: See TracChangeset
for help on using the changeset viewer.