Производительность базы данных Google Gears
Я создал класс javascript, который позволял бы мне использовать gears или html5 (если доступно) для хранения строкового объекта json. код предназначен для использования на Android 1.5 и 2.0. Когда я сохраняю много объектов на передачах, это очень медленно, даже на ПК (Google Chrome / Gears). Процессор не загружается, но страница перестает отвечать на запросы в течение 45 секунд. На мобильном телефоне это еще хуже. Я удалил makeJsonString(oContent)
но это то же самое. Html5 часть кода (в IE8) работает быстро (2 секунды, чтобы вставить 300 элементов).
На телефоне я делаю только 1 вставку за раз.
В конструкторе:
this.db = google.gears.factory.create('beta.database');
this.db.open("foobar");
this.db.execute('CREATE TABLE IF NOT EXISTS ' + this.sDatabase + ' (AUTO_ID INTEGER PRIMARY KEY AUTOINCREMENT, CONTENT_JSON TEXT);');
Спасительная часть:
var sContent = makeJsonString(oContent);
this.db.execute("INSERT INTO " + this.sDatabase + " (CONTENT_JSON) VALUES (?)", [sContent]);
Код тестирования:
var oContent = {};
oContent.field = "test'os";
for (var i = 1; i < 300; i++)
db.saveContent(oContent);
makeJsonString
используйте json2.js или встроенную функцию.
РЕДАКТИРОВАТЬ
Профилирование ЦП Google Chrome: http://img685.imageshack.us/img685/4317/savecontent.jpg
РЕДАКТИРОВАТЬ 2
от: http://www.sqlite.org/faq.html
На самом деле, SQLite будет легко делать 50000 или более операторов INSERT в секунду на обычном настольном компьютере. Но он будет делать только несколько десятков транзакций в секунду. Скорость транзакции ограничена скоростью вращения вашего дисковода. Транзакция обычно требует двух полных оборотов дискового диска, что на диске 7200 об / мин ограничивает до 60 транзакций в секунду. Скорость транзакции ограничена скоростью диска, потому что (по умолчанию) SQLite фактически ожидает, пока данные действительно не будут безопасно сохранены на поверхности диска, прежде чем транзакция будет завершена. Таким образом, если вы вдруг потеряете питание или ваша ОС выйдет из строя, ваши данные останутся в безопасности. Подробнее читайте об атомарном коммите в SQLite.
По умолчанию каждый оператор INSERT является собственной транзакцией. Но если вы окружите несколько операторов INSERT с помощью BEGIN...COMMIT, тогда все вставки будут сгруппированы в одну транзакцию. Время, необходимое для фиксации транзакции, амортизируется по всем вложенным операторам вставки, поэтому время на оператор вставки значительно сокращается.
Другой вариант - запустить PRAGMA синхронно =OFF. Эта команда приведет к тому, что SQLite не будет ждать, пока данные достигнут поверхности диска, что сделает операции записи намного более быстрыми. Но если вы потеряете мощность в середине транзакции, файл базы данных может испортиться.
добавление транзакции (BEGIN
, COMMIT
) увеличил производительность на 300 вставок с 45 секунд до ~1 секунды. Еще нужно проверить это на телефоне.
РЕДАКТИРОВАТЬ 3
все еще медленный на телефоне:(