Функция расстояния для SQLite в iOS 5 очень медленная - PullRequest
4 голосов
/ 30 августа 2011

Я давно использую функцию C, которая вычисляет расстояние между координатами в SQLLite.

Дело в том, что для той же базы данных и разных устройств iOS (4 и 5) время длявыполнение того же запроса в 5 раз дольше при работе с iOS 5.

Кто-нибудь знает почему?

Вот код для расстояния:

static void distanceFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
// check that we have four arguments (lat1, lon1, lat2, lon2)
assert(argc == 4);

// check that all four arguments are non-null
if (sqlite3_value_type(argv[0]) == SQLITE_NULL || sqlite3_value_type(argv[1]) == SQLITE_NULL || sqlite3_value_type(argv[2]) == SQLITE_NULL || sqlite3_value_type(argv[3]) == SQLITE_NULL) {
    sqlite3_result_null(context);
    return;
}

// get the four argument values
double lat1 = sqlite3_value_double(argv[0]);
double lon1 = sqlite3_value_double(argv[1]);
double lat2 = sqlite3_value_double(argv[2]);
double lon2 = sqlite3_value_double(argv[3]);

// convert lat1 and lat2 into radians now, to avoid doing it twice below
double lat1rad = DEG2RAD(lat1);
double lat2rad = DEG2RAD(lat2);

// apply the spherical law of cosines to our latitudes and longitudes, and set the result appropriately
// 6378.1 is the approximate radius of the earth in kilometres
sqlite3_result_double(context, (acos(sin(lat1rad) * sin(lat2rad) + cos(lat1rad) * cos(lat2rad) * cos(DEG2RAD(lon2) - DEG2RAD(lon1))) * 6378.1) * 1000); }

и вот примеро том, как я его использую:

Select distance(Latitude, Longitude,-22.89095,-47.05134) from TABLE

Пожалуйста, любая помощь будет очень признателен

Спасибо

Ответы [ 4 ]

2 голосов
/ 06 ноября 2011

OK.Я понял, что это проблема в iOS 5.0. Даже в финальной версии медленные запросы все еще продолжались.

Мне пришлось удалить «order by distance(Latitude, Longitude,-22.89095,-47.05134)», и запрос снова стал быстрее.

Затем я сделал сортировку с использованием кода ... Не лучшим образом.но ...

0 голосов
/ 15 февраля 2012

Мне пришлось добавить индексы. Даже с этим изменением он все еще работает медленнее, чем раньше. Я пробежал по всем настройкам и похоже что-то еще - версия sqlite такая же. Тайна.

0 голосов
/ 29 ноября 2011

У меня был такой же опыт с CoreData (с использованием контейнера sqllite).

До IOS5 наличие NSFetchRequest с sortDescriptors работало с разумной скоростью.

После обновления до 5очень заметная задержка.Установка для sortDescriptors пустого массива исправила низкую производительность, но означала, что мне нужно было вручную сортировать (и группировать) свои результаты по коду.

Надеюсь, что обновление 5.0.1 исправит это, но все равно кажетсяпроблема.

0 голосов
/ 17 сентября 2011

iOS 5 все еще является бета-версией, и производительность на бета-сборках обычно не является хорошим эталоном производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...