Один из самых больших убийц производительности - выход в правой части игровой площадки. Теперь я покажу вам, как минимизировать этот вывод.
Смотрите в конце ваш пример кода.
Лучшее представление
Самый эффективный способ - сделать весь критический для производительности код в .swift
файле внутри папки Sources
на игровой площадке.
Примечание. Чтобы использовать функции, классы, свойства и методы из папки Sources
, вы должны отметить их public
. Если вы хотите создать подкласс класса, он должен быть помечен как open
.
Хорошая производительность, но уродливый код
Следующий метод (я думаю, что это не официальный / не предназначенный) можно использовать для отключения вывода на игровую площадку, но он также приводит к некрасивому коду. Однако это хорошо для временного отключения вывода.
Есть два основных способа (и два приема) для достижения минимального объема вывода (Если вы найдете способ лучше, дайте нам знать):
Используйте круглые скобки вокруг Void
(или Void?
) выражений, таких как присваивания (обычно не приводит к выводу, см. Также 3.).
var x = 0 // output: 0
(x = 1) // NO output
(x = 2 * x - 1) // NO output
(x.negate()) // NO output
Примечание. В Swift назначение возвращает Void
, а в случае необязательное связывание это Void?
.
var x: (Int, Int)? = nil
if (x?.0 = 0) != nil {
// assignment was successful (x!=0 and now x=(0, x.1))
} else {
// assignment was not successful (x==nil)
}
Инициализировать и объявлять переменные отдельно.
var x: Int // NO output
(x = 0) // NO output
Если 1. не работает, добавьте дополнительную строку no-op (no operation) выше или ниже ()
.
Это происходит при закрытии одной строки (и, возможно, в некоторых других контекстах), например: (см. Также код ниже)
[1, 4, 5, 6].mmap{
() // without this line the line below would yield to an output
($1 = $0 + 1)
} as [Int]
Вместо того, чтобы заключать каждую строку в круглые скобки, вы также можете использовать кортеж всех выражений, который затем присваивается переменной:
var a: Any // this may be a useful definition in this context
var x: Int
var y: Int
(a = (x = 0,
y = 1,
x = y + 1,
y = x*x))
Однако это могло привести к катастрофе с вдавливанием ...
Где это не работает (я не нашел способа удалить вывод; этот список, вероятно, не полный):
return
s в функциях и замыканиях
- Объявление
Optional
переменных, например: var x: Int?
Пример нового map
метода на Sequence
Использование: см. Выше в пункте 3.
Подпись Sequence.map
func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]
Поскольку я не нашел способа удалить вывод return
s, можно использовать закрытие с аргументом inout
(получить "возвращаемое" значение с присваиванием). Возможная подпись тогда могла бы быть:
func mmap<U>(_ transform: (Element, inout U?) -> ()) -> [U]
поэтому мы можем передать nil
в аргументе inout
, поскольку это хорошее значение по умолчанию для всех возможных U
, без наложения ограничений на U
, для чего может потребоваться генератор экземпляров (например: init() { ... }
).
К сожалению, Swfit с трудом выводит U
, поэтому вам нужно будет помочь компилятору с явными аннотациями типов. Кроме того, var newElement: U?
возвращает nil
на боковой панели.
Теперь я буду использовать Any
вместо U?
:
extension Sequence {
// ATTENTION: this is not as performant as the normal `map`!
func mmap<U>(transform: (Element, inout Any) -> ()) -> [U] {
var result: [U]
(result = [U]())
for element in self {
var newElement: Any
(newElement = 0) // some placeholder element
(transform(element, &newElement))
// assume the inout element to be of type `U`
(result.append(newElement as! U))
}
return result // the ONLY output in this method
}
}
Ваш пример кода
Использование Swift 4
var count = 0
for i in 0..<1_000_000_000 {
(count += 1)
if count % 100_000 == 0 {
// print only every 100_000th loop iteration
print(count)
}
}
Без скобок: около 10.000 итераций цикла в секунду.
В скобках: около 10.000.000 итераций цикла в секунду !!!
person
Qbyte
schedule
28.11.2017
var count = 1000000000
. - person zaph   schedule 27.09.2014