Многие вещи становятся приемлемыми, когда они оказывают существенное влияние на производительность, но в приведенном вами примере, похоже, есть гораздо лучшие решения.
Во-первых, почему [myinst computeNextScalar:i]
не возвращает новый скаляр? Если бы вы сделали это, вам не нужно было бы его извлекать, и все было бы намного быстрее.
Нельзя ли перенести работу в myinst
? Я имею в виду, вы не можете создать что-то вроде:
result = [myinst totalOverArray:array];
Если reallyBigX
действительно большой, то вам следует рассмотреть здесь Accelerate.framework. Это может значительно улучшить производительность при выполнении операций, которые вы выполняете. (Вы должны выполнить тестирование производительности с помощью инфраструктуры Accelerate. Это может быть существенно медленнее для некоторых операций, но это может быть быстрее.)
Наконец, рассмотрим шаблон Objective-C get...
. Это выглядит так:
int *scalars = calloc(reallyBigX, sizeof(int));
[myinst getScalars:scalars range:NSMakeRange(0, reallyBigX)];
for (int i = 0; i < reallyBigX; i++) {
result += scalars[i] * array[i];
}
free(scalars);
Кстати, вышесказанное определенно является кандидатом на vDSP_dotpr()
, хотя вы должны проверить его на производительность. Во многих случаях простой цикл выполняется быстрее, чем эквивалентный вызов vDSP
при шаге = 1 (поскольку вы можете использовать простое приращение вместо += stride
).