Будет ли несколько значений Date () (timestamp) равными при инициализации в том же методе и в том же потоке? - PullRequest
0 голосов
/ 28 ноября 2018

Мне любопытно знать, что инициализация Date() объектов в том же методе и в том же потоке будет равна orderSame.Я попробовал это с модулем Test Case, но он дал различные результаты в виде прикрепленных снимков экрана.

Тестовый случай не прошел в Assert # 2: enter image description here

Тестовый случай не прошел в Assert# 4: enter image description here

Успешный тест: enter image description here

Я думаю, временные компоненты Date() будут менятьсяна основе времени выполнения кода от date1 до date5.

Итак, можно ли сказать, что объект Date(), созданный в строке # 2, будет отличаться от объекта, созданного в строке # 1?

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Каждый раз, когда вы звоните Date(), система извлекает время из часов реального времени.Если между этим вызовом и предыдущим вызовом прошло какое-то измеримое время, даты будут другими.Date объекты используют внутреннее количество секунд Double, которое имеет точность ≈15 десятичных цифр, поэтому они могут измерять крошечные, крошечные промежутки времени (менее пикосекунды). Я не знаю точностичасов реального времени на iOS, но, скорее всего, они будут в наносекундах.

Попробуйте запустить этот код в режиме выпуска на целевом устройстве:

let arraySize = 1000
var array = [Date]()
var differences = 0
array.reserveCapacity(arraySize)
for _ in 1...arraySize {
    array.append(Date())
}
for index in 0 ..< arraySize-1 {
    if array[index] != array[index+1] {
        differences += 1
        let difference = array[index+1].timeIntervalSinceReferenceDate -
            array[index].timeIntervalSinceReferenceDate
        print("Dates at index \(index) are different! by \(difference)")
    }
}
if differences == 0 {
    print("All dates are equal")
} else {
    print("\(differences) dates were different out of \(arraySize)")
}

Я запустил его как командную строкуинструмент на моем Mac и обнаружил, что я всегда получал по крайней мере пару дат, которые были разными.(Mac работают намного быстрее, чем устройства iOS)

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

0 голосов
/ 28 ноября 2018

При создании даты по дате () система запрашивает новую метку времени.В зависимости от загрузки всей системы вы можете получить небольшую задержку.Объекты даты чувствительны к миллисекундам, поэтому у вас нет гарантии, что объекты будут созданы за одну и ту же миллисекунду.Чтобы проверить это, вы можете проверить timeIntervalSince1970 каждой даты (этот метод возвращает метку времени Unix.

0 голосов
/ 28 ноября 2018

Вы не можете ничего предположить.Date()

Создает значение даты, инициализированное для текущей даты и времени.

Два последовательных вызова Date() могут возвращать одно и то же значениепоскольку

  • внутренние часы имеют ограниченное разрешение,
  • дата сохраняется как TimeInterval aka Double, которая имеет ограниченную точность.

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

0 голосов
/ 28 ноября 2018

Абсолютно каждый объект отличается от другого объекта, потому что каждый отдельный объект имеет свой адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...