В чем разница в написании файлов с атомарно на iPhone в objective-c и нет, есть ли разница в производительности между двумя?
Спасибо заранее!
В чем разница в написании файлов с атомарно на iPhone в objective-c и нет, есть ли разница в производительности между двумя?
Спасибо заранее!
Атомный вообще означает, что операция не может быть прервана завершится или не будет иметь никакого эффекта. При записи файлов это выполняется путем записи во временный файл, а затем заменяя оригинал временным, когда запись завершается.
Сбой при записи атомного файла означает, что оригинал не изменен, и есть файл мусора, который можно удалить. Авария при записи обычно означает, что ожидаемый хороший файл поврежден.
Производительность - это минимальная стоимость. Во время записи у вас будет две копии файла. Замена файла - очень простая операция на уровне файловой системы.
Изменить: спасибо zneak
Файловым системам не нужно прибегать к циклам записи/переименования для атомной записи. Файловые системы, имеющие семантику блокировки, позволяют вам "блокировать" части или весь файл, а в некоторых случаях даже делать такие вещи, как добавления к файлу, чтобы помочь с атомарностью.
@Randy, ваши предположения о фрагментации, вероятно, будут неправильными. В большинстве файловых систем запись всего файла и его закрытие приведет к менее фрагментированному файлу, и запись большого файла в одну запись, безусловно, приведет к лучшему использованию больших блоков. Если вы имели в виду, что блоки файлов имеют большую вероятность "ползать" по всему диску, это зависит от настроек макета в вашей файловой системе. Если вы пишете на флеш, вы, вероятно, хотите, чтобы файловая система ползала по доступному хранилищу как своего рода самовыравнивание записей.
Написание атомарно занимает больше шагов - дополнительно создается вспомогательный файл. NSString Class Reference объясняет:
Если ДА, приемник записывается во вспомогательный файл, а затем вспомогательный файл переименовывается в путь. Если NO, приемник написан прямо к пути. Параметр YES гарантирует, что путь, если он существует в все, не будут повреждены, даже если система должна потерпеть крах во время письменная форма.
Вот пример в случае pLists:
[array writeToFile:path atomically:YES];
когда "ДА", то pList обновляется один раз, даже если вы запустите код несколько раз в XCode,
[array writeToFile:path atomically:NO];
когда "НЕТ" обновляется столько, сколько вы запускаете тот же код (повторное обновление).