Производительность - структуры в NSValue vs контейнерный объект

В ситуации, когда мне нужно сохранить все элементы данных в NSDictionaryимеет ли смысл ставить структуры (пользовательские типы или даже скаляры, т.е. CGPoint) в моей собственной обертке (не NSValue), поэтому я могу избежать накладных расходов на кодирование / декодирование каждый раз, когда получаю или устанавливаю элемент?

Для больших конструкций (16 поплавков) экономия значительна по IMO. Но даже с CGPoint Я бы сэкономил 4 байта копирования плюс время кодирования / декодирования.

3 ответа

Решение

Почему бы просто не измерить это для вашего конкретного случая? Это единственный действительно надежный способ выяснить это.

Если оба варианта не достаточно, вы можете посмотреть в CFDictionary с указателями на простые структуры, устанавливая значения обратного вызова соответственно или принять C++ std::map/std::tr1::unordered_map для вращения (если вы не против смешивания в C++, то есть).

На самом деле вы можете пойти еще дальше: полностью отказаться от структуры и сделать ее объектом модели. Затем вы можете интегрировать логику (например, вычисляемые свойства) в нее и дать ей возможность кодировать и декодировать себя в любых соответствующих форматах, а также помещать ее в коллекции.

Что ж, типы NSDictionary требуют объектов в качестве их членов в любом случае, поэтому вы не можете сохранить структуру в NSDictionary. Вы должны были бы обернуть это в контейнерный объект.

Другие вопросы по тегам