Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/benchmark/csv-data.c

    r43426d4 r17af7d1  
    11#include <fstream>
    2 #include <monitor>
    32#include <stdlib>
    43#include <thread>
    54
    6 #include "bench.h"
     5extern "C" {
     6#include <unistd.h>                                     // sysconf
     7#include <sys/times.h>                                  // times
     8#include <time.h>
     9}
    710
    8 coroutine GreatSuspender {};
     11inline 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
     27struct GreatSuspender {
     28        coroutine_desc __cor;
     29};
     30
     31DECL_COROUTINE(GreatSuspender);
    932
    1033void ?{}( GreatSuspender * this ) {
     
    2952#endif
    3053
    31 //-----------------------------------------------------------------------------
    32 // coroutine context switch
     54
     55
    3356long long int measure_coroutine() {
    3457        const unsigned int NoOfTimes = N;
     
    4871}
    4972
    50 //-----------------------------------------------------------------------------
    51 // thread context switch
    5273long long int measure_thread() {
    5374        const unsigned int NoOfTimes = N;
     
    6384}
    6485
    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
    20086int main()
    20187{
    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;
    20989}
Note: See TracChangeset for help on using the changeset viewer.