2012-04-06 4 views
1

Есть ли разница в скорости между следующими двумя случаями:NSUserDefaults сравнение производительности

A:

userName=[[NSUserDefaults standardUserDefaults] objectForKey:@"userName"]; 
userEmail=[[NSUserDefaults standardUserDefaults] objectForKey:@"userEmail"]; 
userId=[[[NSUserDefaults standardUserDefaults] objectForKey:@"userId"] intValue]; 

B:

userDictionary=[[NSUserDefaults standardUserDefaults] objectForKey:@"userDictionary"]; 
userName=[userDictionary objectForKey:@"name"]; 
userEmail=...etc... 

Несмотря на различия в скорости может быть крайне небольшим, технически, есть ли различия в производительности?

+0

Что показали ваши тесты производительности? (Ответ, кстати, обычно да, но такого требования нет. Компилятор может на законных основаниях оптимизировать его, если он захочет. Только тесты скажут вам разницу.) –

+0

Как выполнить тесты производительности? (Кроме того, я хотел знать «почему», а не просто «да» или «нет», на что я не могу ответить) – Snowman

+0

Поместив петлю и запустив ее миллион раз или так, и запустив ее. Что касается «почему», первый запрос метода называется много раз, что более дорого, чем не вызов этого метода. Компилятору разрешено оптимизировать это. Clang не может реально оптимизировать его, потому что он не знает, что вы не заменили 'standardUserDefaults' методом с побочными эффектами во время выполнения. Поэтому на практике это невозможно оптимизировать, и вы должны делать звонки. Но это, как правило, неправильный подход к вопросам производительности. Всегда начинайте с тестов. –

ответ

4

C самый быстрый.

C:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
userName=[defaults objectForKey:@"userName"]; 
userEmail=[defaults objectForKey:@"userEmail"]; 
userId=[[defaults objectForKey:@"userId"] intValue]; 

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

+1

Хотя * скорее всего * быстрее, это не гарантируется. '- [NSUserDefaults objectForKey:]' может иметь разные (худшие) характеристики производительности, чем '- [NSDictionary objectForKey:]'. –

+0

Ой, так что [defaults objectForKey .. "] не совпадает с [NSUserDefaults standardUserDefaults]? Не знал, что .. – Snowman

+0

@mohabitar' [NSUserDefaults standardUserDefaults] 'возвращает экземпляр класса' NSUserDefaults'. Этот факт позволяет вы должны кэшировать результат в локальную переменную, и доступ к этому локальному переменному будет всегда _ быстрее, чем вызов метода для получения того же значения. –

1

Технически, да. Но было бы неразумно рассуждать о том, какой из них быстрее. Предполагалось, что A быстрее, потому что он только три поиска в хеш-таблице, а не четыре. Но, возможно, +[NSUserDefaults standardUserDefaults] использует блокировку, чтобы сделать себя потокобезопасной, и, возможно, этого накладного расхода достаточно, чтобы сделать B быстрее. В качестве бонуса можно ускорить это для одной версии iOS, тогда как другая может быть быстрее для другой.

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

+0

от алгоритмического и грандиозного масштаба, это действительно ужасный ответ. – Katushai

Смежные вопросы