root/lang/objective-cplusplus/i3/trunk/src/mil/src/Test11.cpp @ 34812

Revision 34812, 3.1 kB (checked in by saturday06, 5 years ago)

asdf

  • Property svn:executable set to *
Line 
1#include <mil/PrecompiledHeaders.h>
2
3#include <mil/Mil.h>
4#include <mil/Atomic.h>
5#include <mil/Thread.h>
6#include <mil/Module.h>
7#include <quicktest/quicktest.h>
8
9#include "Test.h"
10
11using namespace mil;
12using namespace mil::Test;
13
14namespace Test11 {
15
16atomic<int> global;
17atomic<int> spin_status;
18
19struct TinyEvent {
20};
21
22struct SmallEvent {
23    short data;
24};
25
26struct MiddleEvent {
27    char pad[20];
28    int data;
29};
30
31struct BigEvent {
32    char pad[500];
33    int data;
34};
35
36struct AllPosted {};
37
38// bench class
39const unsigned int POST_MAX = 200000;
40const unsigned int NUM_THREADS = 18;
41
42struct Bencher : mil::Module<Bencher> {
43    static Bencher* benchers[NUM_THREADS];
44    int index;
45    int begin;
46    int posted;
47    void setIndex(int index_) {
48        posted = 0;
49        index = index_;
50    }
51    void a() {
52        posted++;
53        if (posted == POST_MAX) {
54            AllPosted e;
55            benchers[index]->post(e, *this);
56        }
57    }
58    void execute(TinyEvent& e) {
59        global.fetch_and_add(1);
60        benchers[index]->post(e, *this);
61        a();
62    }
63    void execute(SmallEvent& e) {
64        global.fetch_and_add(e.data * 2);
65        benchers[index]->post(e, *this);
66        a();
67    }
68    void execute(MiddleEvent& e) {
69        global.fetch_and_add(e.data * 2);
70        benchers[index]->post(e, *this);
71        a();
72    }
73    void execute(BigEvent& e) {
74        global.fetch_and_add(e.data * 2);
75        benchers[index]->post(e, *this);
76        a();
77    }
78    void execute(AllPosted& e) {
79        printf("AllPosted Received : %lf, global = %d, index = %d\n",
80               (double)(clock() - begin) / CLOCKS_PER_SEC, global.load(), index);
81        spin_status.fetch_and_add(1);
82    }
83    void run() {
84        while (spin_status.load()) {}
85        begin = clock();
86        for (int i = 0; i < 5; i++) {
87            TinyEvent t;
88            benchers[index]->post(t, *this);
89            SmallEvent s;
90            s.data = 8;
91            benchers[index]->post(s, *this);
92            //MiddleEvent m;
93            //m.data = 16;
94            //r.post(m, *this);
95            //BigEvent b;
96            //b.data = 32;
97            //r.post(b, *this);
98        }
99        this->loop();
100    }
101};
102
103Bencher* Bencher::benchers[NUM_THREADS];
104
105}
106
107using namespace Test11;
108
109void n_times() {
110    spin_status.store(1);
111
112    for (size_t i = 0; i < _countof(Bencher::benchers); i++) {
113        Bencher::benchers[i] = new Bencher();
114        Bencher::benchers[i]->setIndex((i + 1) % _countof(Bencher::benchers));
115        Bencher::benchers[i]->start();
116    }
117
118    spin_status.store(0);
119
120    while (spin_status.load() != _countof(Bencher::benchers)) {
121        Sleep(10);
122    }
123
124    for (size_t i = 0; i < _countof(Bencher::benchers); i++) {
125        delete Bencher::benchers[i];
126    }
127}
128
129QT_TEST(test_iaodfioasdfadfaadfasdfadfiiiii) {
130    n_times();
131    puts("---");
132    n_times();
133    puts("---");
134    n_times();
135    puts("---");
136    n_times();
137    puts("---");
138    n_times();
139    puts("---");
140}
141
Note: See TracBrowser for help on using the browser.