IndexedDB работает очень медленно по сравнению с WebSQL, что я делаю не так?

Я сделал демо-расширение для Chrome, чтобы сравнить websql и indexeddb и более подробно изучить, как они работают.

К моему удивлению, оказалось, что indexeddb намного медленнее даже по сравнению с самой наивной командой sql.

Поскольку websql устарел в пользу indexeddb, я предположил, что indexeddb будет таким же или даже быстрее, чем websql.

Я предполагаю, что делаю что-то неправильно в коде indexeddb. Потому что отказываться от чего-то, что намного быстрее, было бы глупо, и я предполагаю, что они знали, что делали, отказываясь от websql в пользу indexeddb.

Код поиска sql:

// Search entries
        var term = search_query;
        db.transaction(function(tx) {
            tx.executeSql('SELECT * FROM places', [], function (tx, results) {
                console.log("sql search");
                var count = 0;
                var wm = WordsMatch.init(term.trim().toLowerCase());
                var len = results.rows.length
                for (var i = 0; i < len; ++i) {
                    var item = results.rows.item(i);
                    if (wm.search(item.url.toLowerCase())) {
                        //console.log(item.id, item.url);
                        ++count;
                    }
                }
                console.log("Search matches:", count);
                console.log("\n");
            });
        }, reportError);

Код поиска indexeddb:

    PlacesStore.searchPlaces(search_query, function(places) {
                    console.log("indexedDB search");
                    var count = places.length;
                    console.log("Search matches:", count);
                    console.log("\n");
                });

var PlacesStore = { searchPlaces: function (term, callback) {
        var self = this,
            txn = self.db.transaction([self.store_name], IDBTransaction.READ_ONLY),
            places = [],
            store = txn.objectStore(self.store_name);
        var wm = WordsMatch.init(term.trim().toLowerCase());
        Utils.request(store.openCursor(), function (e) {
            var cursor = e.target.result;
            if (cursor) {
                if (wm.search(cursor.value.url.toLowerCase())) {
                    places.push(cursor.value);
                }

                cursor.continue();
            }
            else {
                // we are done retrieving rows; invoke callback
                callback(places);
            }
        });
    }
}/**/


var Utils = {
    errorHandler: function(cb) {
        return function(e) {
            if(cb) {
                cb(e);
            } else {
                throw e;
            }
        };
    },

    request: function (req, callback, err_callback) {
        if (callback) {
            req.onsuccess = function (e) {
                callback(e);
            };
        }
        req.onerror = Utils.errorHandler(err_callback);
    }
};

Я также сделал отчет об ошибке chrome и загрузил туда полный код расширения: http://code.google.com/p/chromium/issues/detail?id=122831

(Я не могу загрузить сюда zip-файл расширения, такой функции нет)

Я заполнил базы данных websql и indexeddb 38862 URL-адресами, которые я использовал в качестве тестовых данных.

5
задан Özgür 12 January 2013 в 12:22
поделиться