4

プロジェクトの Android と iOS で SQLite のパフォーマンスのベンチマークを実行しようとしていますが、iOS プラットフォームでは Android と比較してパフォーマンスが非常に悪いようです。

私が達成しようとしているのは、多数の行 (5000) を SQLite DB に挿入する時間を測定し、プラットフォーム間で比較することです。Android の場合、5000 の挿入すべてを実行するために約 500 ミリ秒で結果が得られますが、iOS の場合、同じ操作に 20 秒以上かかります。どうすればいいの?

これは私の iOS コード (挿入部分) のスニペットです。dataArray は、5000 個のランダムな 100 文字の NSString を持つ配列です。

int numEntries = 5000;
self.dataArray = [[NSMutableArray alloc] initWithCapacity:numEntries];//Array for random data to write to database

//generate random data (100 char strings)
for (int i=0; i<numEntries; i++) {
    [self.dataArray addObject:[self genRandStringLength:100]];
}

// Get the documents directory
NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *docsDir = [dirPaths objectAtIndex:0];

// Build the path to the database file
NSString *databasePath = [[NSString alloc] initWithString:[docsDir stringByAppendingPathComponent: @"benchmark.db"]];

NSString *resultHolder = @"";

//Try to open DB, if file not present, create it
if (sqlite3_open([databasePath UTF8String], &db) == SQLITE_OK){

    sql = @"CREATE TABLE IF NOT EXISTS BENCHMARK(ID INTEGER PRIMARY KEY AUTOINCREMENT, TESTCOLUMN TEXT)";

    //Create table
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, NULL) == SQLITE_OK){
        NSLog(@"DB created");
    }else{
        NSLog(@"Failed to create DB");
    }

        //START: INSERT BENCHMARK
        NSDate *startTime = [[NSDate alloc] init];//Get timestamp for insert-timer

        //Insert values in DB, one by one
        for (int i = 0; i<numEntries; i++) {
            sql = [NSString stringWithFormat:@"INSERT INTO BENCHMARK (TESTCOLUMN) VALUES('%@')",[self.dataArray objectAtIndex:i]];
            if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, NULL) == SQLITE_OK){
                //Insert successful
            }
        }

        //Append time consumption to display string
        resultHolder = [resultHolder stringByAppendingString:[NSString stringWithFormat:@"5000 insert ops took %f sec\n", [startTime timeIntervalSinceNow]]];

        //END: INSERT BENCHMARK

Android コード スニペット:

           // SETUP
           long startTime, finishTime;

        // Get database object
            BenchmarkOpenHelper databaseHelper = new BenchmarkOpenHelper(getApplicationContext());
            SQLiteDatabase database = databaseHelper.getWritableDatabase();

            // Generate array containing random data
            int rows = 5000;
            String[] rowData = new String[rows];
            int dataLength = 100;

            for (int i=0; i<rows; i++) {
                rowData[i] = generateRandomString(dataLength);
            }

            // FIRST TEST: Insertion
            startTime = System.currentTimeMillis();

            for(int i=0; i<rows; i++) {
                database.rawQuery("INSERT INTO BENCHMARK (TESTCOLUMN) VALUES(?)", new String[] {rowData[i]});
            }

            finishTime = System.currentTimeMillis();
            result += "Insertion test took: " + String.valueOf(finishTime-startTime) + "ms \n";
            // END FIRST TEST
4

2 に答える 2

3

トランザクションを使用する必要があります-実行BEGINして開始し、で終了しCOMMITます。

INSERTこれにより、パフォーマンスが大幅に向上するはずです。

http://www.titaniumdevelopment.com.au/blog/2012/01/27/10x-faster-inserts-in-sqlite-using-begin-commit-in-appcelerator-titanium-mobile/

それが完了すると、両方のプラットフォームで 5000 回の挿入が非常に高速になると期待できます。

これは、バインド変数の使用や、速度と堅牢性をトレードオフするさまざまな PRAGMA モードの有効化など、SQLite のパフォーマンスを向上させることができるさまざまなことをリストした別の StackOverflow の回答です。

于 2013-04-18T23:05:45.977 に答える