2016-12-22 2 views
3

Как я понимаю, типы значений в swift могут быть более эффективными, потому что они хранятся в стеке, а не в куче. Но если вы делаете много звонков на DispatchQueue.sync или DispatchQueue.async, это не делает преимущества типов значений немыми, потому что закрытие хранится в куче?Выполняет ли параллельное программирование в быстрой оптимизации оптимизации типа значения?

ответ

2

Как я понимаю, типы значений в swift могут быть более эффективными, поскольку они хранятся в стеке, а не в куче.

Иногда. Часто нет. Например, String включает хранилище, выделенное кучей. Многие типы значений имеют скрытое хранилище, выделенное кучей (это фактически действительно общий). Таким образом, вы можете не получать выигрыш в производительности, который вы ожидаете от многих типов, но во многих случаях вы также не теряете его путем закрытия.

Типы значений относятся к поведению, а не к производительности (и, конечно же, вам нужно различать value types and value semantics, которые отличаются и могут влиять на производительность). Таким образом, хорошая вещь о типах значений и DispatchQueue заключается в том, что вы знаете, что не собираетесь случайно изменять значение в нескольких очередях, потому что знаете, что у вас есть собственная независимая копия. К тому времени, когда вы заплатили накладные расходы на отправку в очередь (которая оптимизирована, но все же не дешевая), дополнительная стоимость копирования типа значения, вероятно, не является основной проблемой.

По моему опыту, очень сложно рассуждать о производительности Swift, особенно из-за оптимизации копирования на запись. Но тот факт, что очевидные «типы значений» могут иметь скрытые внутренние ссылочные типы, также делает анализ производительности очень сложным. Вам часто приходится знать и полагаться на внутренние детали, которые могут быть изменены. Чтобы даже начать работу с Swift, вам обязательно нужно посмотреть Understand Swift Performance (возможно, пару раз). Если вы привносите какие-либо интуиции производительности из C++, вы должны бросить почти все это для Swift. Это просто делает так много по-другому.

1

Я подозреваю, что ваш взгляд на показатели производительности и оптимизацию не полностью соответствует модели Swift.

Во-первых, похоже, что у вас есть эта точка правильно, но в целом термин «выделенные стек» и «выделенные кучи» вводят в заблуждение. Типы значений могут быть частью ссылочных типов и жить в куче. Точно так же вещи, которые, по-видимому, попадают в кучу, на самом деле не должны идти в кучу: объект, подсчитанный по ссылке, который, возможно, не нуждается в подсчете ссылок, может быть выделен в стеке без каких-либо замечаний. На других языках, таких как C++, preferred terminology - это «автоматическое хранилище» («стек») и «динамическое хранилище» («куча»). Конечно, Swift не имеет этих концепций (он имеет только типы значений и ссылочные типы), но они полезны для описания характеристик производительности.

Укрытия Затворы требуют динамического хранения, потому что их срок службы не может быть привязан к раме стека. Тем не менее, цена исполнения, которую вы платите за вызов функции, которая берет закрытие закрытия, является однородной, независимо от того, сколько переменных необходимо убрать, потому что закрытие всегда будет выделено и это закрытие может иметь хранилище для любого количества значений.

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

Кроме того, как сказал Роб, каждый нетривиальный тип значения (строки, массивы, словари, наборы и т. Д.) На самом деле является оберткой ссылочного типа, поэтому для этих объектов типы значений имели больше семантического преимущества, чем преимущество в производительности для начала.

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