Какая самая быстрая процедура для преобразования NSArrays в C-style (double) массивы? - PullRequest
4 голосов
/ 09 февраля 2010

У меня есть 2 NSArray (фактически изменяемые), которые я пытаюсь преобразовать в двойной массив в стиле C для подпрограммы c, в которую я передаю их.

Вот моя процедура Objective-C:

NSMutableDictionary *childDictionary = [myParentDictionary objectForKey:resort_code];

latitudeArray = [childDictionary objectForKey:@"lat"];
longitudeArray = [childDictionary objectForKey:@"lon"];

int nvert = [latitudeArray count];
double laArray[nvert];
double loArray[nvert];

for(int i=0; i<nvert; i++) {
    double dLat = [[latitudeArray objectAtIndex:i]doubleValue];
    double dLon = [[longitudeArray objectAtIndex:i]doubleValue];
    laArray[i] = dLat;
    loArray[i] = dLon;
}

Это займет более 3-8 секунд на iPhone 3G (мгновенно на симуляторе - еще одна причина для тестирования на устройстве)

есть ли более быстрый способ? Я должен в итоге получить laArray[i] и loArray[i] как массивы двойных в стиле c.

(чтобы расширить вопрос в пользу комментатора): Каждый массив состоит из содержимого в стиле @ 38.448745 (lat) и @ "- 122.9847684" (lon). Я делаю это потому, что меня помещают в NSArray, а lat и lon должны быть объектами. Я просто использовал:

[latitudeArray addObject:[NSString stringWithFormat: @"%.10f",dlat]];
[longitudeArray addObject:[NSString stringWithFormat: @"%.10f",dlon]];

Полагаю, я мог бы изменить это на:

[latitudeArray addObject:[NSNumber numberWithDouble: @"%.10f",dlat]];
[longitudeArray addObject:[NSNumber numberWithDouble: @"%.10f",dlon]];

... что может сократить время преобразования

double dLat = [[latitudeArray objectAtIndex:i]doubleValue];

но разве мне не понадобится точная строка для преобразования из NSString в double? Это может работать быстрее?

ТНХ

Ответы [ 5 ]

2 голосов
/ 09 февраля 2010

dlat это двойной, верно?

Так что вместо:

[latitudeArray addObject:[NSString stringWithFormat: @"%.10f",dlat]];

Do:

[latitudeArray addObject:[NSNumber numberWithDouble:dlat]];

Они оба отвечают на doubleValue, но NSNumber не должен выполнять какой-либо разбор строки, поскольку он уже сохранен как числовое значение. И вам никогда не нужно идти на строку вообще.

2 голосов
/ 09 февраля 2010

Для общего случая преобразования NSArray в массив C вы можете использовать getObjects:. В этом случае, однако, то, что вы на самом деле хотите, это не преобразовать NSArray, а получить массив значений типа double из NSArray некоторого неопределенного типа объекта.

Один очевидный способ ускорить процесс - это быстрое перечисление вместо отправки сообщения для получения объекта для каждой итерации цикла. Я подозреваю, что реальное решение находится за пределами вашего алгоритма. Замедление, вероятно, происходит из-за преобразования любых объектов, содержащихся в массиве, в удвоения, и в этом случае вам нужно найти способ обойти это - возможно, хранить двойники все время, возможно делать преобразование в фоновом режиме и т. Д. массивов, и нет никаких веских причин для того, чтобы объекты были строками, вместо этого вы должны использовать NSNumbers. Это должно быть немного быстрее.

2 голосов
/ 09 февраля 2010

Я подозреваю, что у вас есть массив строк типа @"213.12385", которые нужно проанализировать и преобразовать, когда вы вызываете doubleValue для них. Если проблема именно в этом, массивы C не имеют к этому никакого отношения.

Единственное, что я хотел бы добавить здесь, это бросить Акулу на это и посмотреть, где он проводит свое время. Если он тратит время на doubleValue, найдите другой способ анализа строк с предварительной обработкой в ​​фоновом режиме или что-то в этом роде. Если оно в objectAtIndex:, возможно, быстрое перечисление поможет. Если он целиком где-то еще, то вы знаете, что этот фрагмент не медленный.

0 голосов
/ 09 февраля 2010

Лучшее решение, вероятно, состоит в том, чтобы эти значения никогда не заканчивались на NSArray как NSString значения. Я бы атаковал это у источника.

Итак, вы отредактировали свой вопрос и добавили, что вы на самом деле строите эти массивы. Так почему бы не использовать нативные массивы double или float с самого начала? Я обычно рекомендую против этого, но в вашем случае это звучит так, как будто вы получаете огромный прирост производительности.

0 голосов
/ 09 февраля 2010

Возможно использование быстрой итерации, но я сомневаюсь, что это действительно ускорит ваш цикл.

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