📄 speedtest.cpp
字号:
/******************************************************************* * * * speedtest.cpp * * * * This file is a part of the eXtremeDB source code * * Copyright (c) 2001-2007 McObject LLC * * All Rights Reserved * * * *******************************************************************/#include "mcosql.h"#include "speedtestdb.h"#include "platform.h"using namespace McoSql;#ifndef MCO_PLATFORM_X64size_t const PAGE_SIZE = 128; // define eXtremeDB page size#elsesize_t const PAGE_SIZE = 256;#endifsize_t const DATABASE_SIZE = 32 * 1024 * 1024;void* const MAP_ADDRESS = (void*)0x20000000;size_t const MAX_TRANS_SIZE = 50000;const int N_INSERTS = 1000;const int N_INSERTS_IN_TRANS = 25000;const int N_SELECTS_WITHOUT_INDEX = 100;const int N_SELECTS_STRING_CMP = 100;const int N_SELECTS_WITH_INDEX = 5000;const int N_UPDATES_WITHOUT_INDEX = 1000;const int N_UPDATES_WITH_INDEX = 25000;const int N_UPDATES_TEXT_WITH_INDEX = 25000;const int N_INSERTS_AFTER_DELETE = 3000;int numberName(char* buf, int n){ static const char* ones[] = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; static const char* tens[] = { "", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; int pos = 0; if (n >= 1000) { pos = numberName(buf, n/1000); pos += sprintf(buf + pos, " thousand"); n %= 1000; } if (n >= 100) { if (pos != 0) { buf[pos++] = ' '; } pos += sprintf(buf + pos, "%s hundred", ones[n/100]); n %= 100; } if (n >= 20) { if (pos != 0) { buf[pos++] = ' '; } pos += sprintf(buf + pos, "%s hundred", tens[n/10]); n %= 10; } if (n > 0) { if (pos != 0) { buf[pos++] = ' '; } pos += sprintf(buf + pos, "%s", ones[n]); } if (pos == 0) { pos = sprintf(buf, "zero"); } return pos;}inline double rnd() { return (double)rand() / RAND_MAX;}void readData(DataSource* source){ Cursor* cursor = source->records(); while (cursor->hasNext()) { cursor->next(); } source->release();}int main() { int i; time_t start; char buf[256]; McoSqlEngine engine; engine.open("speedtestdb", speedtestdb_get_dictionary(), DATABASE_SIZE, PAGE_SIZE, MAP_ADDRESS, MAX_TRANS_SIZE); start = msec(); for (i = 0; i < N_INSERTS; i++) { int r = (int)(rnd()*100000); numberName(buf, r); engine.executeStatement("INSERT INTO t1 VALUES(%i,%i,%s)", i, r, buf); } printf("%d INSERTs: %d msec\n", N_INSERTS, (int)(msec() - start)); start = msec(); Transaction* trans = engine.database()->beginTransaction(Transaction::ReadWrite); for (i = 0; i < N_INSERTS_IN_TRANS; i++) { int r = (int)(rnd()*500000); numberName(buf, r); engine.executeStatement(trans, "INSERT INTO t2 VALUES(%i,%i,%s)", i, r, buf); } trans->commit(); trans->release(); printf("%d INSERTs in a transaction: %d msec\n", N_INSERTS_IN_TRANS, (int)(msec() - start)); // I have to change this test and select from t1 instead of t2, because otherwise // voluntary index will be created by McoSQL and query will be executed using index start = msec(); for (i = 0; i < N_SELECTS_WITHOUT_INDEX; i++) { int lwr = i*100; int upr = (i+10)*100; readData(engine.executeQuery("SELECT count(*), avg(b) FROM t1 WHERE b>=%i AND b<%i", lwr, upr)); } printf("%d SELECTs without an index: %d msec\n", N_SELECTS_WITHOUT_INDEX, (int)(msec() - start)); start = msec(); for (i = 0; i < N_SELECTS_STRING_CMP; i++) { int len = numberName(buf+1, i); buf[0] = '%'; buf[len+1] = '%'; buf[len+2] = '\0'; readData(engine.executeQuery("SELECT count(*), avg(b) FROM t2 WHERE c LIKE %s", buf)); } printf("%d SELECTs on a string comparison: %d msec\n", N_SELECTS_STRING_CMP, (int)(msec() - start)); start = msec(); readData(engine.executeQuery("SELECT * from t2 where a=0")); readData(engine.executeQuery("SELECT * from t2 where b=0")); printf("Creating an index: %d msec\n", (int)(msec() - start)); start = msec(); for (i = 0; i < N_SELECTS_WITH_INDEX; i++) { int lwr = i*100; int upr = (i+10)*100; readData(engine.executeQuery("SELECT count(*), avg(b) FROM t2 WHERE b>=%i AND b<%i", lwr, upr)); } printf("%d SELECTs with an index: %d msec\n", N_SELECTS_WITH_INDEX, (int)(msec() - start)); start = msec(); for (i = 0; i < N_UPDATES_WITHOUT_INDEX; i++) { int lwr = i*10; int upr = (i+1)*10; engine.executeStatement("UPDATE t1 SET b=b*2 WHERE a>=%i AND a<%i", lwr, upr); } printf("%d UPDATEs without an index: %d msec\n", N_UPDATES_WITHOUT_INDEX, (int)(msec() - start)); start = msec(); for (i = 0; i < N_UPDATES_WITH_INDEX; i++) { int r = (int)(rnd()*500000); engine.executeStatement("UPDATE t2 SET b=%i WHERE a=%i", r, i); } printf("%d UPDATEs with an index: %d msec\n", N_UPDATES_WITH_INDEX, (int)(msec() - start)); start = msec(); for (i = 0; i < N_UPDATES_WITH_INDEX; i++) { int r = (int)(rnd()*500000); numberName(buf, r); engine.executeStatement("UPDATE t2 SET c=%s WHERE a=%i", buf, i); } printf("%d text UPDATEs with an index: %d msec\n", N_UPDATES_WITH_INDEX, (int)(msec() - start)); start = msec(); engine.executeStatement("INSERT INTO t1 SELECT * FROM t2"); engine.executeStatement("INSERT INTO t2 SELECT * FROM t1"); printf("INSERTs from a SELECT: %d msec\n", (int)(msec() - start)); start = msec(); engine.executeStatement("DELETE FROM t2 WHERE c LIKE '%fifty%'"); printf("DELETE without an index: %d msec\n", (int)(msec() - start)); start = msec(); engine.executeStatement("DELETE FROM t2 WHERE a>10 AND a<20000"); printf("DELETE with an index: %d msec\n", (int)(msec() - start)); start = msec(); engine.executeStatement("INSERT INTO t2 SELECT * FROM t1"); printf("A big INSERT after a big DELETE: %d msec\n", (int)(msec() - start)); start = msec(); engine.executeStatement("DELETE FROM t1"); for (i=1; i <= N_INSERTS_AFTER_DELETE; i++) { int r = (int)(rnd()*100000); numberName(buf, r); engine.executeStatement("INSERT INTO t1 VALUES(%i,%i,%s)", i, r, buf); } printf("A big DELETE followed by %d small INSERTs: %d msec\n", N_INSERTS_AFTER_DELETE, (int)(msec() - start)); start = msec(); engine.executeStatement("DELETE FROM t1"); engine.executeStatement("DELETE FROM t2"); printf("Delete all data: %d msec\n", (int)(msec() - start)); engine.close(); printf( "\nPress Enter to exit" ); getchar(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -