Changes in src/benchmark/csv-data.c [17af7d1:43426d4]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/benchmark/csv-data.c
r17af7d1 r43426d4 1 1 #include <fstream> 2 #include <monitor> 2 3 #include <stdlib> 3 4 #include <thread> 4 5 5 extern "C" { 6 #include <unistd.h> // sysconf 7 #include <sys/times.h> // times 8 #include <time.h> 9 } 10 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); 6 #include "bench.h" 7 8 coroutine GreatSuspender {}; 32 9 33 10 void ?{}( GreatSuspender * this ) { … … 52 29 #endif 53 30 54 55 31 //----------------------------------------------------------------------------- 32 // coroutine context switch 56 33 long long int measure_coroutine() { 57 34 const unsigned int NoOfTimes = N; … … 71 48 } 72 49 50 //----------------------------------------------------------------------------- 51 // thread context switch 73 52 long long int measure_thread() { 74 53 const unsigned int NoOfTimes = N; … … 84 63 } 85 64 65 //----------------------------------------------------------------------------- 66 // single monitor entry 67 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 entry 86 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 entry 104 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 entry 152 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 loop 86 200 int main() 87 201 { 88 sout | time(NULL) | ',' | measure_coroutine() | ',' | measure_thread() | endl; 89 } 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; 209 }
Note: See TracChangeset
for help on using the changeset viewer.