Как я понимаю, типы значений в swift могут быть более эффективными, потому что они хранятся в стеке, а не в куче. Но если вы делаете много звонков на DispatchQueue.sync
или DispatchQueue.async
, это не делает преимущества типов значений немыми, потому что закрытие хранится в куче?Выполняет ли параллельное программирование в быстрой оптимизации оптимизации типа значения?
ответ
Как я понимаю, типы значений в swift могут быть более эффективными, поскольку они хранятся в стеке, а не в куче.
Иногда. Часто нет. Например, String
включает хранилище, выделенное кучей. Многие типы значений имеют скрытое хранилище, выделенное кучей (это фактически действительно общий). Таким образом, вы можете не получать выигрыш в производительности, который вы ожидаете от многих типов, но во многих случаях вы также не теряете его путем закрытия.
Типы значений относятся к поведению, а не к производительности (и, конечно же, вам нужно различать value types and value semantics, которые отличаются и могут влиять на производительность). Таким образом, хорошая вещь о типах значений и DispatchQueue
заключается в том, что вы знаете, что не собираетесь случайно изменять значение в нескольких очередях, потому что знаете, что у вас есть собственная независимая копия. К тому времени, когда вы заплатили накладные расходы на отправку в очередь (которая оптимизирована, но все же не дешевая), дополнительная стоимость копирования типа значения, вероятно, не является основной проблемой.
По моему опыту, очень сложно рассуждать о производительности Swift, особенно из-за оптимизации копирования на запись. Но тот факт, что очевидные «типы значений» могут иметь скрытые внутренние ссылочные типы, также делает анализ производительности очень сложным. Вам часто приходится знать и полагаться на внутренние детали, которые могут быть изменены. Чтобы даже начать работу с Swift, вам обязательно нужно посмотреть Understand Swift Performance (возможно, пару раз). Если вы привносите какие-либо интуиции производительности из C++, вы должны бросить почти все это для Swift. Это просто делает так много по-другому.
Я подозреваю, что ваш взгляд на показатели производительности и оптимизацию не полностью соответствует модели Swift.
Во-первых, похоже, что у вас есть эта точка правильно, но в целом термин «выделенные стек» и «выделенные кучи» вводят в заблуждение. Типы значений могут быть частью ссылочных типов и жить в куче. Точно так же вещи, которые, по-видимому, попадают в кучу, на самом деле не должны идти в кучу: объект, подсчитанный по ссылке, который, возможно, не нуждается в подсчете ссылок, может быть выделен в стеке без каких-либо замечаний. На других языках, таких как C++, preferred terminology - это «автоматическое хранилище» («стек») и «динамическое хранилище» («куча»). Конечно, Swift не имеет этих концепций (он имеет только типы значений и ссылочные типы), но они полезны для описания характеристик производительности.
Укрытия Затворы требуют динамического хранения, потому что их срок службы не может быть привязан к раме стека. Тем не менее, цена исполнения, которую вы платите за вызов функции, которая берет закрытие закрытия, является однородной, независимо от того, сколько переменных необходимо убрать, потому что закрытие всегда будет выделено и это закрытие может иметь хранилище для любого количества значений.
Другими словами, все ваши захваченные объекты с типизированной величиной сгруппированы в одно динамическое распределение, а затраты на выделение памяти не масштабируются с суммой, которую вы запрашиваете. Поэтому вы должны учитывать, что есть (небольшая) стоимость скорости, связанная с экранированием самих закрытий, но эта стоимость не масштабируется с количеством значений, которые фиксирует закрытие. Помимо неизбежной первоначальной стоимости, не должно ухудшаться производительность для типов значений.
Кроме того, как сказал Роб, каждый нетривиальный тип значения (строки, массивы, словари, наборы и т. Д.) На самом деле является оберткой ссылочного типа, поэтому для этих объектов типы значений имели больше семантического преимущества, чем преимущество в производительности для начала.
- 1. Помощь в оптимизации оптимизации
- 2. Радиус оптимизации оптимизации хвоста
- 3. C алгоритм оптимизации оптимизации
- 4. Доверяя оптимизации возвращаемого значения
- 5. программирование невыпуклой оптимизации (квадратичная максимизация) полуопределенное программирование
- 6. Есть ли название для такого типа оптимизации?
- 7. Пример оптимизации оптимизации CUDA
- 8. Предложение оптимизации оптимизации Mysql
- 9. Проблемы оптимизации оптимизации в R
- 10. Когда JVM не выполняет метод оптимизации кода
- 11. Ошибка оптимизации оптимизации Swift 1.2
- 12. Параллельное и параллельное программирование
- 13. Является ли параллельное программирование таким же, как параллельное программирование?
- 14. параллельное программирование в java
- 15. Выполняет ли компилятор scala что-либо для оптимизации неявных классов?
- 16. Рекомендации по оптимизации производительности/оптимизации C++
- 17. Параллельное программирование
- 18. Параллельное программирование в Julia
- 19. Какой алгоритм оптимизации оптимизации Optimized/Mixed Integer используется?
- 20. оптимизации запросов
- 21. Шахматные оптимизации
- 22. Ошибка только при оптимизации оптимизации компиляции
- 23. код оптимизации
- 24. с использованием оптимизации r.js для оптимизации модулей
- 25. инструмент оптимизации
- 26. JQuery оптимизации
- 27. Mysql оптимизации
- 28. Важность оптимизации
- 29. Задача оптимизации
- 30. Уровень оптимизации в Rhino