-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.cpp
152 lines (139 loc) · 5.63 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include "cclockfreequeue.h"
#include "cclockfreefixqueue.h"
#include "lockfreemessagequeue.h"
#include "debug.h"
#include "cccontaintemplate.h"
#include <atomic>
struct ctx_message {
uint32_t m_nCtxID;
uint32_t m_nIndex;
uint32_t m_nReceived;
uint32_t m_nSend;
ctx_message() {
memset(this, 0, sizeof(ctx_message));
}
ctx_message(uint32_t ctxid) {
memset(this, 0, sizeof(ctx_message));
m_nCtxID = ctxid;
}
void InitUint(uint32_t nIndex, uint32_t nValue) {
m_nCtxID = nValue;
m_nIndex = nIndex;
}
uint32_t GetCheckIndex() {
return m_nIndex;
}
uint32_t GetCheckReceiveNumber() {
return m_nCtxID;
}
void Send() {
m_nSend++;
}
void Received() {
m_nReceived++;
}
bool IsSendReceiveSame() {
return m_nReceived == m_nSend && m_nSend != 0;
}
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
class CLockFreeMessageQueuePushPop : public CLockFreeMessageQueue<ctx_message> {
public:
bool Push(ctx_message& msg) {
return enqueue(msg);
}
bool Pop(ctx_message& msg) {
return try_dequeue(msg);
}
};
CLockFreeMessageQueuePushPop conMsgQueue;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
template<class msg, class Queue>
bool BenchmarkQueue(Queue& q, int nRepeatTimes, int nMinThread, int nMaxThread) {
bool bRet = true;
auto pCBasicQueueArrayMode = new CContainUnitThreadRunMode<msg, Queue>(&q, TIMES_FAST, nRepeatTimes);
bRet &= pCBasicQueueArrayMode->PowerOfTwoThreadCountTest(PushContentFunc<msg, Queue>, PopContentFunc<ctx_message, Queue>, nMaxThread, nMinThread);
delete pCBasicQueueArrayMode;
if (bRet == false)
return bRet;
return bRet;
}
template<class msg, class Queue>
bool BenchmarkQueueTime(Queue& q, int nTotalTimes, int nPushThread, int nPopThread) {
bool bRet = true;
auto pCBasicQueueArrayMode = new CContainUnitThreadRunModeTime<msg, Queue>(&q, TIMES_FAST, nTotalTimes);
bRet &= pCBasicQueueArrayMode->PowerOfTwoThreadCountTest(nPushThread, nPopThread);
delete pCBasicQueueArrayMode;
if (bRet == false)
return bRet;
return bRet;
}
int main(int argc, char* argv[]){
int nTimes = 3;
int nRepeatTimes = 5;
int nMinThread = 4;
int nMaxThread = 8;
//ĬÈÏ1·ÖÖÓ
int nHeavyTestTime = 10 * 1000;
if (argc >= 2) {
argv[1];
}
if (nTimes <= 0 || nTimes > 100)
nTimes = 3;
if (nRepeatTimes <= 0 || nRepeatTimes >= 100)
nRepeatTimes = 5;
if (nMinThread <= 0 || nMinThread >= 32)
nMinThread = 1;
if (nMaxThread <= 0 || nMaxThread >= 256)
nMaxThread = 8;
if (nHeavyTestTime < 1000)
nHeavyTestTime = 60 * 1000;
for(int i = 0;i < 100;i++){
{
cclockfree::CCLockfreeQueue<ctx_message> basicQueue;
printf("/*************************************************************************/\n");
printf("Start CCLockfreeQueue\n");
for (int i = 0; i < nTimes; i++) {
if (!BenchmarkQueue<ctx_message, cclockfree::CCLockfreeQueue<ctx_message>>(basicQueue, nRepeatTimes, nMinThread, nMaxThread)) {
printf("check fail!\n");
break;
}
}
printf("/*************************************************************************/\n");
printf("Start CCLockfreeQueue heavy\n");
if (!BenchmarkQueueTime<ctx_message, cclockfree::CCLockfreeQueue<ctx_message>>(basicQueue, nHeavyTestTime, nMinThread - 1 == 0 ? 1 : nMinThread - 1, nMinThread)) {
printf("check fail!\n");
}
printf("/*************************************************************************/\n");
}
{
cclockfree::CCLockfreeFixQueue<ctx_message, POW2SIZE>* pBasicQueue = new cclockfree::CCLockfreeFixQueue<ctx_message, POW2SIZE>();
printf("/*************************************************************************/\n");
printf("Start CCLockfreeFixQueue\n");
for (int i = 0; i < nTimes; i++) {
if (!BenchmarkQueue<ctx_message, cclockfree::CCLockfreeFixQueue<ctx_message, POW2SIZE>>(*pBasicQueue, nRepeatTimes, nMinThread, nMaxThread)) {
printf("check fail!\n");
break;
}
}
// printf("/*************************************************************************/\n");
// printf("Start CLockFreeMessageQueuePushPop\n");
// for (int i = 0; i < nTimes; i++) {
// if (!BenchmarkQueue<ctx_message, CLockFreeMessageQueuePushPop>(conMsgQueue, nRepeatTimes, nMinThread, nMaxThread)) {
// printf("check fail!\n");
// break;
// }
// }
//printf("/*************************************************************************/\n");
//printf("Start CCLockfreeQueue heavy\n");
//if (!BenchmarkQueueTime<ctx_message, cclockfree::CCLockfreeQueue<ctx_message>>(basicQueue, nHeavyTestTime, nMinThread, nMinThread)) {
// printf("check fail!\n");
//}
//printf("/*************************************************************************/\n");
delete pBasicQueue;
}
}
getchar();
return 0;
}