.developing svo_value (benchmark)

git-svn-id: svn://ultimatepp.org/upp/trunk@4420 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
cxl 2012-01-14 17:18:07 +00:00
parent fe8c470f24
commit ba19a53823
2 changed files with 375 additions and 366 deletions

View file

@ -1,91 +1,96 @@
#include <Core/Core.h>
using namespace Upp;
#ifdef _DEBUG
#define N 1
#else
#define N 100000
#endif
Value h;
CONSOLE_APP_MAIN
{
StdLogSetup(LOG_COUT|LOG_FILE);
Vector<int> x;
Vector<String> xs;
for(int i = 0; i < 100; i++) {
x.Add(Random(1000));
xs.Add(AsString(1000));
}
Value xxx = Null;
h = xxx;
RTIMING("Total");
int sum;
for(int i = 0; i < N; i++) {
ValueArray va;
{
va.Clear();
RTIMING("Add int");
for(int i = 0; i < 100; i++)
va.Add(x[i]);
}
{
RTIMING("Read int");
for(int i = 0; i < va.GetCount(); i++)
sum += (int)va[i];
}
{
RTIMING("Read int with To");
for(int i = 0; i < va.GetCount(); i++)
sum += va[i].To<int>();
}
{
va.Clear();
RTIMING("Add String");
for(int i = 0; i < 100; i++)
va.Add(xs[i]);
}
{
RTIMING("Read String");
for(int i = 0; i < va.GetCount(); i++)
sum += String(va[i]).GetLength();
}
{
RTIMING("Read String with To");
for(int i = 0; i < va.GetCount(); i++)
sum += va[i].To<String>().GetLength();
}
Vector<String> vs;
{
vs.Clear();
RTIMING("Add Vector<String>");
for(int i = 0; i < 100; i++)
vs.Add(xs[i]);
}
{
RTIMING("Read Vector<String>");
for(int i = 0; i < vs.GetCount(); i++)
sum += vs[i].GetLength();
}
Vector<Value> vv;
{
vv.Clear();
RTIMING("Add Vector<Value> String");
for(int i = 0; i < 100; i++)
vv.Add(xs[i]);
}
{
RTIMING("Read Vector<Value> String");
for(int i = 0; i < vv.GetCount(); i++)
sum += String(vv[i]).GetLength();
}
{
RTIMING("Read Vector<Value> String with To");
for(int i = 0; i < vv.GetCount(); i++)
sum += vv[i].To<String>().GetLength();
}
}
Cout() << sum << "\n";
}
#include <Core/Core.h>
using namespace Upp;
#ifdef _DEBUG
#define N 1
#else
#define N 300000
#endif
Value h;
CONSOLE_APP_MAIN
{
StdLogSetup(LOG_COUT|LOG_FILE);
Vector<int> x;
Vector<String> xs;
for(int i = 0; i < 100; i++) {
x.Add(Random(1000));
xs.Add(AsString(1000));
}
Value xxx = Null;
h = xxx;
RTIMING("Total");
int sum;
for(int i = 0; i < N; i++) {
ValueArray va;
{
va.Clear();
RTIMING("Add int");
for(int i = 0; i < 100; i++)
va.Add(x[i]);
}
{
RTIMING("Read int");
for(int i = 0; i < va.GetCount(); i++)
sum += (int)va[i];
}
{
RTIMING("Read int with To");
for(int i = 0; i < va.GetCount(); i++)
sum += va[i].To<int>();
}
{
va.Clear();
RTIMING("Add String");
for(int i = 0; i < 100; i++)
va.Add(xs[i]);
}
{
RTIMING("Read String");
for(int i = 0; i < va.GetCount(); i++)
sum += String(va[i]).GetLength();
}
{
RTIMING("Read String with To");
for(int i = 0; i < va.GetCount(); i++)
sum += va[i].To<String>().GetLength();
}
{
RTIMING("Read String with Get");
for(int i = 0; i < va.GetCount(); i++)
sum += va[i].Get<String>().GetLength();
}
Vector<String> vs;
{
vs.Clear();
RTIMING("Add Vector<String>");
for(int i = 0; i < 100; i++)
vs.Add(xs[i]);
}
{
RTIMING("Read Vector<String>");
for(int i = 0; i < vs.GetCount(); i++)
sum += vs[i].GetLength();
}
Vector<Value> vv;
{
vv.Clear();
RTIMING("Add Vector<Value> String");
for(int i = 0; i < 100; i++)
vv.Add(xs[i]);
}
{
RTIMING("Read Vector<Value> String");
for(int i = 0; i < vv.GetCount(); i++)
sum += String(vv[i]).GetLength();
}
{
RTIMING("Read Vector<Value> String with To");
for(int i = 0; i < vv.GetCount(); i++)
sum += vv[i].To<String>().GetLength();
}
}
Cout() << sum << "\n";
}

View file

@ -1,275 +1,279 @@
#define NDEBUG
#define _SECURE_SCL 0
#include <Core/Core.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <time.h>
#include <vector>
#include <algorithm>
#include <map>
#include <deque>
#include <string>
#define TEST_HASHMAP
#ifdef TEST_HASHMAP
#ifdef COMPILER_GCC
#include <tr1/unordered_map>
#else
#include <hash_map>
#endif
#endif
using namespace std;
using namespace Upp;
#ifndef _DEBUG
#define NO_OUTPUT // for benchmark purposes, output is omitted
#endif
void BenchNTL(const char *file) {
FileIn in(file);
if (!in) {
std::cout << "Cannot open input file.\n";
return;
}
VectorMap<String, Vector<int> > map;
int line = 1;
for(;;) {
int c = in.Get();
if(c < 0) break;
if(IsAlpha(c) || c == '_') {
String id;
id.Cat(c);
c = in.Get();
while(c >= 0 && (IsAlNum(c) || c == '_')) {
id.Cat(c);
c = in.Get();
}
map.GetAdd(id).Add(line);
}
else
if(IsDigit(c))
do c = in.Get();
while(c >= 0 && (IsAlNum(c) || c == '.'));
if(c == '\n')
++line;
}
Vector<int> order = GetSortOrder(map.GetKeys());
#ifndef NO_OUTPUT
for(int i = 0; i < order.GetCount(); i++) {
std::cout << ~map.GetKey(order[i]) << ": ";
const Vector<int>& l = map[order[i]];
for(int i = 0; i < l.GetCount(); i++) {
if(i) std::cout << ", ";
std::cout << l[i];
}
std::cout << '\n';
}
#endif
}
bool SimpleValueOrder(const Value& a, const Value& b)
{
return AsString(a) < AsString(b);
}
void BenchValueMap(const char *file) {
FileIn in(file);
if (!in) {
std::cout << "Cannot open input file.\n";
return;
}
ValueMap map;
int line = 1;
for(;;) {
int c = in.Get();
if(c < 0) break;
if(IsAlpha(c) || c == '_') {
String id;
id.Cat(c);
c = in.Get();
while(c >= 0 && (IsAlNum(c) || c == '_')) {
id.Cat(c);
c = in.Get();
}
ValueArray va = map.GetAndClear(id);
va.Add(line);
map.Set(id, va);
}
else
if(IsDigit(c))
do c = in.Get();
while(c >= 0 && (IsAlNum(c) || c == '.'));
if(c == '\n')
++line;
}
Vector<int> order = GetSortOrder(map.GetKeys(), SimpleValueOrder);
#ifndef NO_OUTPUT
for(int i = 0; i < order.GetCount(); i++) {
std::cout << ~(String)(map.GetKeys()[order[i]]) << ": ";
ValueArray l = map.GetValues()[order[i]];
for(int i = 0; i < l.GetCount(); i++) {
if(i) std::cout << ", ";
std::cout << (int)l[i];
}
std::cout << '\n';
}
#endif
}
template <class Container>
void BenchSTL(Container& imap, const char *file) {
std::ifstream in(file);
if (!in) {
std::cout << "Cannot open input file.\n";
return;
}
int line = 1;
for(;;) {
int c = in.get();
if(c == EOF) break;
if(isalpha(c) || c == '_') {
string id;
id += c;
c = in.get();
while(c != EOF && (isalnum(c) || c == '_')) {
id += c;
c = in.get();
}
imap[id].push_back(line);
}
else
if(isdigit(c))
do c = in.get();
while(c != EOF && (isalnum(c) || c == '.'));
if(c == '\n')
++line;
}
}
void BenchMap(const char *file)
{
map< string, vector<int> > imap;
BenchSTL(imap, file);
#ifndef NO_OUTPUT
map< std::string, vector<int> >::const_iterator e = imap.end();
for(map< std::string, vector<int> >::const_iterator i = imap.begin(); i != e; i++) {
std::cout << i->first << ": ";
vector<int>::const_iterator e = i->second.end();
vector<int>::const_iterator b = i->second.begin();
for(vector<int>::const_iterator j = b; j != e; j++) {
if(j != b) std::cout << ", ";
std::cout << *j;
}
std::cout << '\n';
}
#endif
}
#ifdef TEST_HASHMAP
#ifdef COMPILER_GCC
typedef std::tr1::unordered_map< string, vector<int> > HashMap;
#else
typedef stdext::hash_map< string, vector<int> > HashMap;
#endif
inline bool h_less(const HashMap::value_type *a, const HashMap::value_type *b)
{
return a->first < b->first;
}
void BenchHashMap(const char *file)
{
HashMap imap;
BenchSTL(imap, file);
vector< const HashMap::value_type * > order;
for(HashMap::const_iterator i = imap.begin(); i != imap.end(); i++)
order.push_back(&*i);
sort(order.begin(), order.end(), h_less);
#ifndef NO_OUTPUT
vector< const HashMap::value_type * >::const_iterator e = order.end();
for(vector< const HashMap::value_type * >::const_iterator i = order.begin(); i != e; i++) {
std::cout << (*i)->first << ": ";
vector<int>::const_iterator e = (*i)->second.end();
vector<int>::const_iterator b = (*i)->second.begin();
for(vector<int>::const_iterator j = b; j != e; j++) {
if(j != b) std::cout << ", ";
std::cout << *j;
}
std::cout << '\n';
}
#endif
}
#endif
#ifdef _DEBUG
#define N 1
#else
#define N 10000
#endif
CONSOLE_APP_MAIN
{
String fn;
int argc = CommandLine().GetCount();
const Vector<String>& argv = CommandLine();
if(argc < 1)
fn = GetDataFile("main.cpp");
else
fn = argv[0];
BenchValueMap(fn);
cout << "===========================\n";
BenchNTL(fn); // first run to cache the file
#ifdef TEST_HASHMAP
{
BenchHashMap(fn);
TimeStop tm;
for(int n = 0; n < N; n++)
BenchHashMap(fn);
cout << "STL hash_map time: " << tm.Elapsed() << " ms \n";
}
#endif
{
BenchMap(fn);
TimeStop tm;
for(int n = 0; n < N; n++)
BenchMap(fn);
cout << "STL map time: " << tm.Elapsed() << " ms \n";
}
{
BenchNTL(fn);
TimeStop tm;
for(int n = 0; n < N; n++)
BenchNTL(fn);
cout << "NTL time: " << tm.Elapsed() << " ms\n";
}
{
BenchValueMap(fn);
TimeStop tm;
for(int n = 0; n < N; n++)
BenchValueMap(fn);
cout << "ValueMap time: " << tm.Elapsed() << " ms\n";
}
}
#define NDEBUG
#define _SECURE_SCL 0
#include <Core/Core.h>
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <time.h>
#include <vector>
#include <algorithm>
#include <map>
#include <deque>
#include <string>
#define TEST_HASHMAP
#ifdef TEST_HASHMAP
#ifdef COMPILER_GCC
#include <tr1/unordered_map>
#else
#include <hash_map>
#endif
#endif
using namespace std;
using namespace Upp;
#ifndef _DEBUG
#define NO_OUTPUT // for benchmark purposes, output is omitted
#endif
void BenchNTL(const char *file) {
FileIn in(file);
if (!in) {
std::cout << "Cannot open input file.\n";
return;
}
VectorMap<String, Vector<int> > map;
int line = 1;
for(;;) {
int c = in.Get();
if(c < 0) break;
if(IsAlpha(c) || c == '_') {
String id;
id.Cat(c);
c = in.Get();
while(c >= 0 && (IsAlNum(c) || c == '_')) {
id.Cat(c);
c = in.Get();
}
map.GetAdd(id).Add(line);
}
else
if(IsDigit(c))
do c = in.Get();
while(c >= 0 && (IsAlNum(c) || c == '.'));
if(c == '\n')
++line;
}
Vector<int> order = GetSortOrder(map.GetKeys());
#ifndef NO_OUTPUT
for(int i = 0; i < order.GetCount(); i++) {
std::cout << ~map.GetKey(order[i]) << ": ";
const Vector<int>& l = map[order[i]];
for(int i = 0; i < l.GetCount(); i++) {
if(i) std::cout << ", ";
std::cout << l[i];
}
std::cout << '\n';
}
#endif
}
bool SimpleValueOrder(const Value& a, const Value& b)
{
return AsString(a) < AsString(b);
}
void BenchValueMap(const char *file) {
FileIn in(file);
if (!in) {
std::cout << "Cannot open input file.\n";
return;
}
ValueMap map;
int line = 1;
for(;;) {
int c = in.Get();
if(c < 0) break;
if(IsAlpha(c) || c == '_') {
String id;
id.Cat(c);
c = in.Get();
while(c >= 0 && (IsAlNum(c) || c == '_')) {
id.Cat(c);
c = in.Get();
}
#ifdef SVO_VALUE
ValueArray va = map.GetAndClear(id);
#else
ValueArray va = map[id];
#endif
va.Add(line);
map.Set(id, va);
}
else
if(IsDigit(c))
do c = in.Get();
while(c >= 0 && (IsAlNum(c) || c == '.'));
if(c == '\n')
++line;
}
Vector<int> order = GetSortOrder(map.GetKeys(), SimpleValueOrder);
#ifndef NO_OUTPUT
for(int i = 0; i < order.GetCount(); i++) {
std::cout << ~(String)(map.GetKeys()[order[i]]) << ": ";
ValueArray l = map.GetValues()[order[i]];
for(int i = 0; i < l.GetCount(); i++) {
if(i) std::cout << ", ";
std::cout << (int)l[i];
}
std::cout << '\n';
}
#endif
}
template <class Container>
void BenchSTL(Container& imap, const char *file) {
std::ifstream in(file);
if (!in) {
std::cout << "Cannot open input file.\n";
return;
}
int line = 1;
for(;;) {
int c = in.get();
if(c == EOF) break;
if(isalpha(c) || c == '_') {
string id;
id += c;
c = in.get();
while(c != EOF && (isalnum(c) || c == '_')) {
id += c;
c = in.get();
}
imap[id].push_back(line);
}
else
if(isdigit(c))
do c = in.get();
while(c != EOF && (isalnum(c) || c == '.'));
if(c == '\n')
++line;
}
}
void BenchMap(const char *file)
{
map< string, vector<int> > imap;
BenchSTL(imap, file);
#ifndef NO_OUTPUT
map< std::string, vector<int> >::const_iterator e = imap.end();
for(map< std::string, vector<int> >::const_iterator i = imap.begin(); i != e; i++) {
std::cout << i->first << ": ";
vector<int>::const_iterator e = i->second.end();
vector<int>::const_iterator b = i->second.begin();
for(vector<int>::const_iterator j = b; j != e; j++) {
if(j != b) std::cout << ", ";
std::cout << *j;
}
std::cout << '\n';
}
#endif
}
#ifdef TEST_HASHMAP
#ifdef COMPILER_GCC
typedef std::tr1::unordered_map< string, vector<int> > HashMap;
#else
typedef stdext::hash_map< string, vector<int> > HashMap;
#endif
inline bool h_less(const HashMap::value_type *a, const HashMap::value_type *b)
{
return a->first < b->first;
}
void BenchHashMap(const char *file)
{
HashMap imap;
BenchSTL(imap, file);
vector< const HashMap::value_type * > order;
for(HashMap::const_iterator i = imap.begin(); i != imap.end(); i++)
order.push_back(&*i);
sort(order.begin(), order.end(), h_less);
#ifndef NO_OUTPUT
vector< const HashMap::value_type * >::const_iterator e = order.end();
for(vector< const HashMap::value_type * >::const_iterator i = order.begin(); i != e; i++) {
std::cout << (*i)->first << ": ";
vector<int>::const_iterator e = (*i)->second.end();
vector<int>::const_iterator b = (*i)->second.begin();
for(vector<int>::const_iterator j = b; j != e; j++) {
if(j != b) std::cout << ", ";
std::cout << *j;
}
std::cout << '\n';
}
#endif
}
#endif
#ifdef _DEBUG
#define N 1
#else
#define N 10000
#endif
CONSOLE_APP_MAIN
{
String fn;
int argc = CommandLine().GetCount();
const Vector<String>& argv = CommandLine();
if(argc < 1)
fn = GetDataFile("main.cpp");
else
fn = argv[0];
BenchValueMap(fn);
cout << "===========================\n";
BenchNTL(fn); // first run to cache the file
#ifdef TEST_HASHMAP
{
BenchHashMap(fn);
TimeStop tm;
for(int n = 0; n < N; n++)
BenchHashMap(fn);
cout << "STL hash_map time: " << tm.Elapsed() << " ms \n";
}
#endif
{
BenchMap(fn);
TimeStop tm;
for(int n = 0; n < N; n++)
BenchMap(fn);
cout << "STL map time: " << tm.Elapsed() << " ms \n";
}
{
BenchNTL(fn);
TimeStop tm;
for(int n = 0; n < N; n++)
BenchNTL(fn);
cout << "NTL time: " << tm.Elapsed() << " ms\n";
}
{
BenchValueMap(fn);
TimeStop tm;
for(int n = 0; n < N; n++)
BenchValueMap(fn);
cout << "ValueMap time: " << tm.Elapsed() << " ms\n";
}
}