diff --git a/benchmarks/InVector/InVector.cpp b/benchmarks/InVector/InVector.cpp new file mode 100644 index 000000000..27c167560 --- /dev/null +++ b/benchmarks/InVector/InVector.cpp @@ -0,0 +1,334 @@ +#include + +#include + +using namespace Upp; + +#define SN 10000000 +#define IN 100 + +int sSum = 0; + +template +void ScanBenchmark() +{ + T x; + for(int i = 0; i < SN; i++) + x.Insert(x.GetCount()) = i; + + { + TimeStop tm; + for(int j = 0; j < IN; j++) + for(int i = 0; i < SN; i++) + sSum += x[i]; + RLOG(typeid(T).name() << " index scan " << tm); + } + { + TimeStop tm; + typename T::Iterator end = x.End(); + for(int j = 0; j < IN; j++) + for(typename T::Iterator it = x.Begin(); it != end; ++it) + sSum += *it; + RLOG(typeid(T).name() << " iterator scan " << tm); + } +} + +void InVectorScanBenchmark() +{ + ScanBenchmark< Vector >(); + ScanBenchmark< Array >(); + ScanBenchmark< InVector >(); +} + +#define N 10000000 + + +void InVectorBenchmark() +{ + + std::multiset s; + SeedRandom(); + { + RTIMING("std::set INSERT"); + for(int i = 0; i < N; i++) { + int x = Random(); + s.insert(x); + } + } + + SeedRandom(); + { + InVector a; + RTIMING("InVector INSERT UB"); + for(int i = 0; i < N; i++) { + int x = Random(); + a.Insert(FindLowerBound(a, x)) = x; + } + } + InVector a; + { + RTIMING("InVector INSERT"); + a.Insert(0) = 0; + for(int i = 0; i < N; i++) { + a.Insert(Random(a.GetCount())) = i; + } + } + { + InVector a; + RTIMING("InVector INSERT 0"); + a.Insert(0) = 0; + for(int i = 0; i < N; i++) { + a.Insert(0) = Random(100); + } + } + { + InVector a; + RTIMING("InVector INSERT N/2"); + a.Insert(0) = 0; + for(int i = 0; i < N; i++) { + a.Insert(i / 2) = Random(100); + } + } + return; + { + RTIMING("InVector SCAN"); + int sum = 0; + for(int i = 0; i < a.GetCount(); i++) + sum += a[i]; + RDUMP(sum); + } + { + RTIMING("InVector iterator SCAN"); + int sum = 0; + for(InVector::Iterator i = a.Begin(); i != a.End(); i++) + sum += *i; + RDUMP(sum); + } + { + RTIMING("InVector Sort"); + Sort(a); + } + RDUMP(a.GetCount()); + + SeedRandom(); + Vector b; + { + RTIMING("Vector INSERT"); + b.Insert(0) = 0; + for(int i = 0; i < N; i++) { + b.Add(Random()); +// b.Insert(Random(b.GetCount())) = Random(100); + } + } + { + RTIMING("Vector SCAN"); + int sum = 0; + for(int i = 0; i < b.GetCount(); i++) + sum += b[i]; + RDUMP(sum); + } + { + RTIMING("Vector iterator SCAN"); + int sum = 0; + for(Vector::Iterator i = b.Begin(); i != b.End(); i++) + sum += *i; + RDUMP(sum); + } + { + RTIMING("Vector Sort"); + Sort(b); + } + return; + SeedRandom(); + Array c; + { + RTIMING("Array INSERT"); + c.Insert(0) = 0; + for(int i = 0; i < N; i++) { + c.Add(Random(100)); +// c.Insert(Random(c.GetCount())) = Random(100); + } + } + { + RTIMING("Array SCAN"); + int sum = 0; + for(int i = 0; i < c.GetCount(); i++) + sum += c[i]; + RDUMP(sum); + } + { + RTIMING("Array Sort"); + Sort(c); + } + + SeedRandom(); + BiVector d; + { + RTIMING("BiVector INSERT"); + d.AddTail() = 0; + for(int i = 0; i < N; i++) { + d.AddTail(Random(100)); +// d.Insert(Random(d.GetCount())) = Random(100); + } + } + { + RTIMING("BiVector SCAN"); + int sum = 0; + for(int i = 0; i < d.GetCount(); i++) + sum += d[i]; + RDUMP(sum); + } + { + RTIMING("BiVector Sort"); + Sort(d); + } +} + +void InVectorInsertBenchmark() +{ + RTIMING("InVectorInsertBenchmark"); + InVector iv; + for(int i = 0; i < 10000000; i++) + iv.Insert(iv.GetCount() / 2); +} + +void SetBenchmark() +{ + const int rep = 100; + const int count = 1000; + SeedRandom(); + Buffer rnd(count); + for(int i = 0; i < count; i++) + rnd[i] = Random(); + + { + std::multiset s; + { + RTIMING("std::set INSERT"); + for(int j = 0; j < rep; j++) { + s.clear(); + for(int i = 0; i < count; i++) { + s.insert(rnd[i]); + } + } + } + typedef std::multiset::iterator It; + { + RTIMING("std::set SCAN"); + It e = s.end(); + for(int j = 0; j < rep; j++) + for(It i = s.begin(); i != e; i++) { + sSum += *i; + } + } + } + { + InVector s; + { + RTIMING("InVector INSERT"); + for(int j = 0; j < rep; j++) { + s.Clear(); + for(int i = 0; i < count; i++) + s.InsertUpperBound(rnd[i]); + } + RDUMP(s.GetCount()); + // s.Insert(s.FindUpperBound(rnd[i])) = rnd[i]; + } + { + RTIMING("InVector SCAN"); + for(int j = 0; j < rep; j++) + for(int i = 0; i < count; i++) + sSum += s[i]; + } + } +} + +void MemoryInfo() +{ + RLOG(MemoryUsedKb() << " KB"); + MemoryProfile mem; + RLOG(mem); +} + +void SetBenchmark2() +{ + const int rep = 1; + const int count = 10000 * 1000; + SeedRandom(); + Buffer rnd(count); + for(int i = 0; i < count; i++) + rnd[i] = AsString(Random()); + + if(1) { + std::multiset s; + { + RTIMING("std::set INSERT"); + for(int j = 0; j < rep ; j++) { + s.clear(); + for(int i = 0; i < count; i++) { + s.insert(rnd[i]); + } + } + } + typedef std::multiset::iterator It; + { + RTIMING("std::set SCAN"); + It e = s.end(); + for(int j = 0; j < rep ; j++) + for(It i = s.begin(); i != e; i++) { + sSum += i->GetCount(); + } + } + { + RTIMING("std::set FIND"); + int n = 0; + for(int j = 0; j < rep ; j++) + for(int i = 0; i < count; i++) + if(s.find(rnd[i]) != s.end()) + n++; + RDUMP(n); + } + MemoryInfo(); + } + if(1) { + InVector s; + { + RTIMING("InVector INSERT"); + for(int j = 0; j < rep ; j++) { + s.Clear(); + for(int i = 0; i < count; i++) + s.InsertUpperBound(rnd[i]); + } +// s.Insert(s.FindUpperBound(rnd[i])) = rnd[i]; + } + { + RTIMING("InVector SCAN"); + for(int j = 0; j < rep ; j++) + for(int i = 0; i < count; i++) + sSum += s[i].GetCount(); + } + { + RTIMING("InVector FIND"); + int n = 0; + for(int j = 0; j < rep ; j++) { + for(int i = 0; i < count; i++) + if(s.Find(rnd[i]) >= 0) + n++; + } + RDUMP(n); + } + MemoryInfo(); + } +} + +CONSOLE_APP_MAIN +{ + StdLogSetup(LOG_FILE|LOG_COUT); + SeedRandom(); + + SetBenchmark(); + InVectorInsertBenchmark(); + SetBenchmark2(); + InVectorScanBenchmark(); + InVectorBenchmark(); +} diff --git a/benchmarks/InVector/InVector.upp b/benchmarks/InVector/InVector.upp new file mode 100644 index 000000000..3680420f4 --- /dev/null +++ b/benchmarks/InVector/InVector.upp @@ -0,0 +1,9 @@ +uses + Core; + +file + InVector.cpp; + +mainconfig + "" = "SSE2 MT"; + diff --git a/benchmarks/InVector/init b/benchmarks/InVector/init new file mode 100644 index 000000000..642a795a7 --- /dev/null +++ b/benchmarks/InVector/init @@ -0,0 +1,4 @@ +#ifndef _InVector_icpp_init_stub +#define _InVector_icpp_init_stub +#include "Core/init" +#endif