#include "SkBenchmark.h"
#include "SkRandom.h"
#include "SkChunkAlloc.h"
#include "SkDeque.h"
#include "SkTArray.h"
#include "SkTDArray.h"
template <typename Impl>
struct StackBench : public SkBenchmark {
virtual bool isSuitableFor(Backend b) SK_OVERRIDE { return b == kNonRendering_Backend; }
virtual const char* onGetName() SK_OVERRIDE { return Impl::kName; }
virtual void onDraw(const int loops, SkCanvas*) SK_OVERRIDE { Impl::bench(loops); }
};
#define BENCH(name) \
struct name { static const char* const kName; static void bench(int); }; \
const char* const name::kName = #name; \
DEF_BENCH(return new StackBench<name>();) \
void name::bench(int loops)
static const int K = 2049;
BENCH(Deque_Serial) {
SkDeque s(sizeof(int), 1024);
for (int i = 0; i < K; i++) *(int*)s.push_back() = i;
volatile int junk = 0;
for (int j = 0; j < loops; j++) {
SkDeque::Iter it(s, SkDeque::Iter::kFront_IterStart);
while(void* p = it.next()) {
junk += *(int*)p;
}
}
}
BENCH(TArray_Serial) {
SkTArray<int, true> s;
for (int i = 0; i < K; i++) s.push_back(i);
volatile int junk = 0;
for (int j = 0; j < loops; j++) {
for (int i = 0; i < s.count(); i++) junk += s[i];
}
}
BENCH(TDArray_Serial) {
SkTDArray<int> s;
for (int i = 0; i < K; i++) s.push(i);
volatile int junk = 0;
for (int j = 0; j < loops; j++) {
for (int i = 0; i < s.count(); i++) junk += s[i];
}
}
BENCH(TArray_RandomAccess) {
SkTArray<int, true> s;
for (int i = 0; i < K; i++) s.push_back(i);
SkRandom rand;
volatile int junk = 0;
for (int i = 0; i < K*loops; i++) {
junk += s[rand.nextULessThan(K)];
}
}
BENCH(TDArray_RandomAccess) {
SkTDArray<int> s;
for (int i = 0; i < K; i++) s.push(i);
SkRandom rand;
volatile int junk = 0;
for (int i = 0; i < K*loops; i++) {
junk += s[rand.nextULessThan(K)];
}
}
BENCH(ChunkAlloc_Push) {
SkChunkAlloc s(4096);
for (int i = 0; i < K*loops; i++) s.allocThrow(sizeof(int));
}
BENCH(Deque_Push) {
SkDeque s(sizeof(int), 1024);
for (int i = 0; i < K*loops; i++) *(int*)s.push_back() = i;
}
BENCH(TArray_Push) {
SkTArray<int, true> s;
for (int i = 0; i < K*loops; i++) s.push_back(i);
}
BENCH(TDArray_Push) {
SkTDArray<int> s;
for (int i = 0; i < K*loops; i++) s.push(i);
}
BENCH(ChunkAlloc_PushPop) {
SkChunkAlloc s(4096);
for (int i = 0; i < K*loops; i++) {
void* p = s.allocThrow(sizeof(int));
s.unalloc(p);
}
}
BENCH(Deque_PushPop) {
SkDeque s(sizeof(int), 1024);
for (int i = 0; i < K*loops; i++) {
*(int*)s.push_back() = i;
s.pop_back();
}
}
BENCH(TArray_PushPop) {
SkTArray<int, true> s;
for (int i = 0; i < K*loops; i++) {
s.push_back(i);
s.pop_back();
}
}
BENCH(TDArray_PushPop) {
SkTDArray<int> s;
for (int i = 0; i < K*loops; i++) {
s.push(i);
s.pop();
}
}
BENCH(Deque_PushAllPopAll) {
SkDeque s(sizeof(int), 1024);
for (int i = 0; i < K*loops; i++) *(int*)s.push_back() = i;
for (int i = 0; i < K*loops; i++) s.pop_back();
}
BENCH(TArray_PushAllPopAll) {
SkTArray<int, true> s;
for (int i = 0; i < K*loops; i++) s.push_back(i);
for (int i = 0; i < K*loops; i++) s.pop_back();
}
BENCH(TDArray_PushAllPopAll) {
SkTDArray<int> s;
for (int i = 0; i < K*loops; i++) s.push(i);
for (int i = 0; i < K*loops; i++) s.pop();
}