「SQLite性能評価その2」の続きです。 テーブルに100000件追加する処理だけでも、Case2の他にいろいろな書き方があるので、試してみました。
sqlite3_execの代わりにsqlite3_prepareとsqlite3_stepを使ってみました。これをCase3とします。
// Case3 struct sqlite3* Db; struct sqlite3_stmt* Statement; char Buffer[256]; sqlite3_open("testdb.sq3", &Db); sqlite3_prepare(Db, "CREATE TABLE test1(name TEXT,value INTEGER)", -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); // 処理時間測定開始 sqlite3_prepare(Db, "BEGIN", -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); for (int i = 0; i < 100000; ++i) { char* Sql = sqlite3_snprintf(sizeof(Buffer), Buffer, "INSERT INTO test1 VALUES('%q',%d)", StringList[i].c_str(), ValueList[i]); sqlite3_prepare(Db, Sql, -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); } sqlite3_prepare(Db, "COMMIT", -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); // 処理時間測定終了 sqlite3_close(Db);
「sqlite3_prepare の真価」で紹介されている方法を使ってみました。 これをCase4とします。
// Case4 struct sqlite3* Db; struct sqlite3_stmt* Statement; sqlite3_open("testdb.sq3", &Db); sqlite3_prepare(Db, "CREATE TABLE test1(name TEXT,value INTEGER)", -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); // 処理時間測定開始 sqlite3_prepare(Db, "BEGIN", -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); sqlite3_prepare(Db, "INSERT INTO test1 VALUES(?,?)", -1, &Statement, NULL); for (int i = 0; i < 100000; ++i) { sqlite3_reset(Statement); sqlite3_bind_text(Statement, 1, StringList[i].c_str(), static_cast<int>(StringList[i].size()), SQLITE_TRANSIENT); sqlite3_bind_int(Statement, 2, ValueList[i]); while (sqlite3_step(Statement) == SQLITE_BUSY); } sqlite3_finalize(Statement); sqlite3_prepare(Db, "COMMIT", -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); // 処理時間測定終了 sqlite3_close(Db);
Case4のsqlite3_prepareをsqlite3_prepare_v2に変えてみました。これをCase5とします。
// Case5 struct sqlite3* Db; struct sqlite3_stmt* Statement; sqlite3_open("testdb.sq3", &Db); sqlite3_prepare_v2(Db, "CREATE TABLE test1(name TEXT,value INTEGER)", -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); // 処理時間測定開始 sqlite3_prepare_v2(Db, "BEGIN", -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); sqlite3_prepare_v2(Db, "INSERT INTO test1 VALUES(?,?)", -1, &Statement, NULL); for (int i = 0; i < 100000; ++i) { sqlite3_reset(Statement); sqlite3_bind_text(Statement, 1, StringList[i].c_str(), static_cast<int>(StringList[i].size()), SQLITE_TRANSIENT); sqlite3_bind_int(Statement, 2, ValueList[i]); while (sqlite3_step(Statement) == SQLITE_BUSY); } sqlite3_finalize(Statement); sqlite3_prepare_v2(Db, "COMMIT", -1, &Statement, NULL); while (sqlite3_step(Statement) == SQLITE_BUSY); sqlite3_finalize(Statement); // 処理時間測定終了 sqlite3_close(Db);
測定結果は以下のようになりました。
分かったこと。
「SQLiteの性能評価その4」に続きます。
投稿者 MASATO : 2007年10月08日 16:34 | トラックバック