Выполняет ли печать()/println() медленное выполнение?

У меня есть приложение с несколькими тысячами строк, и внутри этого кода есть много команд println(). Это замедляет приложение? Очевидно, что это выполняется в Simulator, но что происходит, когда вы архивируете, отправляете и загружаете приложение из магазина приложений /TestFlight. Является ли этот код еще "активным", и как насчет кода, который "закомментирован"?

Является ли это буквально никогда не читаемым или я должен удалить код с комментариями, когда я отправляю в тестовый рейс/магазин приложений?

Ответ 1

Да, это замедляет работу кода.
Как print, так и println снижают производительность приложения.

Проблема с печатью

println не удаляется, когда Swift оптимизирует код.

for i in 0...1_000 {
  println(i)
}

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

Анализ кода сборки

Проблема заключается в том, что компилятор Swift не может оптимально оптимизировать код с помощью команд print и println. Вы можете увидеть это, если вы посмотрите на сгенерированный код сборки.

Вы можете увидеть код сборки с помощью Hopper дизассемблера или путем компиляции кода Swift на сборку с помощью swiftc компилятора:

xcrun swiftc -emit-assembly myCode.swift

Оптимизация быстрого кода

Давайте рассмотрим несколько примеров для лучшего понимания.
Компилятор Swift может устранить много ненужного кода, например:

  • Пустые вызовы функций
  • Создание объектов, которые не используются
  • Пустые циклы

Пример:

class Object {
  func nothing() {
  }
}

for i in 0...1_000 {
  let object = Object3(x: i)
  object.nothing()
  object.nothing()
}

В этом примере Swift-компилятор выполнит эту оптимизацию:

1. Удалите вызовы методов nothing

После этого тело цикла будет иметь только 1 команду

for i in 0...1_000 {
  let object = Object(x: i)
}

2. Затем он удалит создание экземпляра Object, потому что он фактически не используется.

for i in 0...1_000 {
}

3. Последний шаг - удаление пустого цикла.
И мы закончили без кода для выполнения

Решение

  • Комментарий print и println

Это определенно не лучшее решение.
//println("A")

  • Использовать инструкцию DEBUG препроцессора

С помощью этого решения вы можете легко изменить логику вашей функции debug_print
debug_println("A)

func debug_println<T>(object: T) {
  #if DEBUG
    println(object)
  #endif
}

Заключение

Всегда удаляйте print и println из приложения выпуска.

Если вы добавите инструкцию print и println, код Swift не может быть оптимизирован самым оптимальным способом, и это может привести к большим штрафам за производительность.

Ответ 2

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

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

См. этот ответ о том, как отключить println() в производственном коде, существует множество решений Удалить println() для выпуска версии iOS Swift

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

Ответ 3

printLn не должен иметь большого влияния, поскольку основная часть операции уже выполнена до этой точки.

Код с комментариями иногда полезен, хотя он может затруднить чтение вашего источника, он абсолютно не влияет на производительность, и я никогда не отказывался от комментариев кода, и мои вещи полны его.