Upload
ciklum
View
224
Download
1
Tags:
Embed Size (px)
DESCRIPTION
Citation preview
Message processing.
Цель.
Сравнить реализации.
Измерения.
T/(iterCount х producersCount)ProcessingTime.
Измерения.
1. Start producers thread.2. Save start time.3. Signal producers.4. Wait for completing.5. Save finish time.
Измерения.
Producer.
while (!start) SwitchToThread();for(i = 0;i < iterCount;++i) if(processor.Queue(msg));
Измерения.
ProcessMessage.
cnt=Increment(&processedCnt);if(cnt == iterCnt*producersCnt) SetEvent(completeEvent);
Измерения.
ProcessTest.
startTime = rdtsc();start = true;WaitFor(completeEvent);finishTime = rdtsc();
Код.
MessageProcessor.(MessageQueue + ThreadPool).
Код.
FakeProcessor.
void Queue(Task*msg){ msg->Process();}
Код.
TrivialProcessor.
CircularBuffer+
Mutex+
ThreadPool
0
buffer
1
2 - used
3 - used
4 - used
5
...
2^n
inserter
deleter
Код.
TrivialProcessor.
CircularBuffer+
Mutex+
ThreadPool
Код.
CircularBuffer+
Magic+
ThreadPool
LockFreeProcessor.
Код.
LockFreeProcessor.old = Increment(&inserter) - 1;old &= mask;if(0 != CompareExchange( &_array[old], newVal, 0)){ /* !!! */}
Код.
MpscProcessor.
n x MpscQueue+
ThreadPool+
rand() % n
Код.
MpscProcessor.
i = rand() % n;queues[i].Push(msg);
Результат.
?
Результат.
Результат.
Результат.
За децентрализацию!!!
Всем спасибо!!!