⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 speedtest.cpp

📁 全新的纯内存式实时数据库
💻 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 + -