2010-07-12 3 views
0

Мне нужно использовать волатильный блок памяти для постоянной записи и перезаписи данных внутри с использованием нескольких потоков. Данные будут отображаться в потоковом режиме с использованием @synchronized, если я использую данные malloc'd или NSMutableData.iPhone Objective-C, malloc или NSMutableData?

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

Я собираюсь провести собственное исследование по этому предмету, но мне было интересно, если кто-нибудь знает, что если накладные расходы Objective-C NSMutableData приведут к снижению скорости?

+0

какие данные? Если это просто примитивные типы, использование ключевого слова «volatile» в дополнение к тому, о чем вы думаете, может быть достаточно. – psychotik

+0

Я не знаком с ключевым словом volatile, я пытаюсь найти его, но это Objective-C или C? Простите, я нашел свое общее ключевое слово, идиот. Сейчас я исследую – Parad0x13

ответ

1

re: предложение psychotik: volatile - это ключевое слово в C, которое в основном сообщает компилятору, чтобы избежать оптимизации использования символа, к которому он привязан. Это важно для многопоточного кода или кода, который напрямую взаимодействует с оборудованием. Тем не менее, это не очень полезно для работы с блоками памяти (от malloc() или NSData.) Как сказал психотик, он предназначен для использования с примитивами, такими как int или указателем (то есть самим указателем, а не данными, на которые он указывает). не сделав доступ к вашим данным быстрее, и может фактически замедлить его, победив приемы оптимизации компилятора.

Для синхронизации по перекрестным каналам ваша самая быстрая ставка - это, я думаю, OSSpinLock, если вам не нужен рекурсивный доступ, или pthread_mutex настроен как рекурсивный, если вы это сделаете. Помните, что OSSpinLock, как следует из названия, является блокировкой спина, поэтому определенные шаблоны использования делают его менее эффективным, чем pthread_mutex, но он также очень близок к металлу (он основан на операциях атомарного ввода/установки оборудования).

Если ваши данные действительно доступны достаточно часто, что вы заинтересованы в эффективности блокировки, вы, вероятно, захотите избежать NSData и просто работать с блоком памяти от malloc() - но не зная больше о том, что вы пытаясь выполнить или как часто вы обращаетесь к данным, решение не может быть легко представлено. Не могли бы вы рассказать нам больше о своих намерениях?

+0

У OSSpinLocks есть ошибка на iOS: http://openradar.appspot.com/23896366 – Petr