diff options
| -rw-r--r-- | benchmarks/cdeq_benchmark.cpp | 51 | ||||
| -rw-r--r-- | stc/cdeq.h | 11 |
2 files changed, 40 insertions, 22 deletions
diff --git a/benchmarks/cdeq_benchmark.cpp b/benchmarks/cdeq_benchmark.cpp index 6680ec2c..f44a40a6 100644 --- a/benchmarks/cdeq_benchmark.cpp +++ b/benchmarks/cdeq_benchmark.cpp @@ -1,6 +1,7 @@ #include <stdio.h>
#include <time.h>
#include <deque>
+#include <vector>
#include <stc/cdeq.h>
#include <stc/crand.h>
@@ -27,16 +28,25 @@ void test1() { sum += deq[i];
t3 = clock();
printf("std access : %5.2f sec, sum=%zu\n", (float)(t3 - t2) / CLOCKS_PER_SEC, sum);
- }
- std::deque<int> deq;
- for (size_t i = 1; i < N/10; i++) {
- if (i & 1) deq.push_front(stc64_rand(&rng));
- else deq.push_back(stc64_rand(&rng));
- }
- t2 = clock();
- printf("std pushf/pushb : %5.2f sec\n", (float)(t2 - t3) / CLOCKS_PER_SEC);
+ }{
+ std::deque<int> deq;
+ for (size_t i = 1; i < N/10; i++) {
+ if (i & 1) deq.push_front(stc64_rand(&rng));
+ else deq.push_back(stc64_rand(&rng));
+ }
+ t2 = clock();
+ printf("std pushf/pushb : %5.2f sec\n", (float)(t2 - t3) / CLOCKS_PER_SEC);
+ }{
+ std::deque<int> deq;
+ for (size_t i = 1; i < N/2; i++) {
+ deq.push_back(stc64_rand(&rng));
+ }
+ t3 = clock();
+ printf("std pushb : %5.2f sec\n", (float)(t3 - t2) / CLOCKS_PER_SEC);
+ }
}
+
void test2() {
clock_t t1 = clock(), t2, t3;
stc64_t rng = stc64_init(0);
@@ -57,15 +67,24 @@ void test2() { t3 = clock();
printf("stc access : %5.2f sec, sum=%zu\n", (float)(t3 - t2) / CLOCKS_PER_SEC, sum);
cdeq_i_del(&deq);
+ }{
+ cdeq_i deq = cdeq_inits;
+ for (size_t i = 1; i < N/10; i++) {
+ if (i & 1) cdeq_i_push_front(&deq, stc64_rand(&rng));
+ else cdeq_i_push_back(&deq, stc64_rand(&rng));
+ }
+ t2 = clock();
+ printf("stc pushf/pushb : %5.2f sec\n", (float)(t2 - t3) / CLOCKS_PER_SEC);
+ cdeq_i_del(&deq);
+ }{
+ cdeq_i deq = cdeq_inits;
+ for (size_t i = 1; i < N/2; i++) {
+ cdeq_i_push_back(&deq, stc64_rand(&rng));
+ }
+ t3 = clock();
+ printf("stc pushb : %5.2f sec\n", (float)(t3 - t2) / CLOCKS_PER_SEC);
+ cdeq_i_del(&deq);
}
- cdeq_i deq = cdeq_inits;
- for (size_t i = 1; i < N/10; i++) {
- if (i & 1) cdeq_i_push_front(&deq, stc64_rand(&rng));
- else cdeq_i_push_back(&deq, stc64_rand(&rng));
- }
- t2 = clock();
- printf("stc pushf/pushb : %5.2f sec\n", (float)(t2 - t3) / CLOCKS_PER_SEC);
- cdeq_i_del(&deq);
}
int main()
@@ -236,8 +236,8 @@ size_t nfront = self->data - self->base, nback = cap - (nfront + len); \
if (at_front && nfront >= n || !at_front && nback >= n) \
return; \
- if ((len + n)*1.1 > cap) { \
- cap = (len + n + 6)*2; \
+ if ((len + n)*1.3 > cap) { \
+ cap = (len + n + 6)*1.8; \
size_t* rep = (size_t *) c_realloc(_cdeq_alloced(self->base), 2*sizeof(size_t) + cap*sizeof(Value)); \
rep[0] = len, rep[1] = cap; \
self->base = (cdeq_##X##_value_t *) (rep + 2); \
@@ -245,10 +245,9 @@ return _cdeq_##X##_expand(self, n, at_front); \
} \
size_t unused = cap - (len + n); \
- size_t pos = at_front ? c_maxf(unused*0.6, (float) unused - nback) + n \
- : c_minf(unused*0.4, nfront); \
- memmove(self->base + pos, self->data, len*sizeof(Value)); \
- self->data = self->base + pos; \
+ size_t pos = at_front ? c_maxf(unused*0.5, (float) unused - nback) + n \
+ : c_minf(unused*0.5, nfront); \
+ self->data = (cdeq_##X##_value_t *) memmove(self->base + pos, self->data, len*sizeof(Value)); \
} \
\
STC_DEF void \
|
