[Swift]EquatableとHashableの比較性能テスト
まず、Equatable、ComparableおよびHashableについて簡単に説明します.
Equatable:“==”で比較できるやつ
Comp耕地:「<,>,<=,>=」で比較できるやつ
Hashable:ハッシュ値を与えるやつ(「1087090954923794」この方式)
ハッシュ値は、オブジェクトに固有の値を作成します.
したがって、Hashableのみを継承する場合は、Setデータ型に入れることも、Dictionaryのキー値として使用することもできます.
でもここに好奇心が生まれた
hash値で値を比較するのが速いですか、それともEquatableで値を比較するのが速いですか.
さっそくテストしてみましょう
まずハッシュ値が正しいかどうかを確認します.
デバイス名と容量が同じであれば、同じハッシュ値が表示され、容量が異なる場合でも異なるハッシュ値が表示されます.
ではHashableとEquatableの比較性能をテストしてみましょう
テスト方法は次のとおりです.
//Equatable
//0.8124189376831055
//0.7504860162734985
//0.763375997543335
//Hashable
//0.7399230003356934
//0.7337720394134521
//0.7278430461883545
意味のある結果ではありませんがHashableの方が早いです
なぜなら、Hashableは構造インスタンスの作成時にもhash値を作成するからだと思います.
予め作成したhash値を利用して比較するために速度を上げたのではないかと思います.
(インスタンスの作成時間を含めたパフォーマンスが比較的遅い場合があります...)
だから同じ検査をするときもHashableを受け継ぐことができます
(Hashable実施部から見ると、Equatableを継承しているので、Equatableでもできる.)
Equatableを使用する必要がある場合は、例で「iPhoneデバイス名と同じデバイスを使用する」というカスタム比較文を作成します.
正直性能の差が少ないので好みでやればいいのですが
Equatable:“==”で比較できるやつ
Comp耕地:「<,>,<=,>=」で比較できるやつ
Hashable:ハッシュ値を与えるやつ(「1087090954923794」この方式)
だから今回知りたいことは何ですか?!
ハッシュ値は、オブジェクトに固有の値を作成します.
したがって、Hashableのみを継承する場合は、Setデータ型に入れることも、Dictionaryのキー値として使用することもできます.
でもここに好奇心が生まれた
hash値で値を比較するのが速いですか、それともEquatableで値を比較するのが速いですか.
さっそくテストしてみましょう
// Hashable
struct iPhone: Hashable {
let name: String
let storage: Int
}
// Equatable
struct iPhone: Equatable {
let name: String
let storage: Int
}
デバイス名と容量を持つiPhoneという構造を作成しました.まずハッシュ値が正しいかどうかを確認します.
let iPhone13_pro128 = iPhone(name: "13pro", storage: 128)
print(iPhone13_pro128.hashValue) // -1087909095493923794
let iPhone13_pro128_2 = iPhone(name: "13pro", storage: 128)
print(iPhone13_pro128_2.hashValue) // -1087909095493923794
let iPhone13_pro256 = iPhone(name: "13pro", storage: 256)
print(iPhone13_pro256.hashValue) // -1747077728359295826
あなたの考え通りによく撮れました.デバイス名と容量が同じであれば、同じハッシュ値が表示され、容量が異なる場合でも異なるハッシュ値が表示されます.
ではHashableとEquatableの比較性能をテストしてみましょう
テスト方法は次のとおりです.
// 6종류의 아이폰 10만대 만들기
let iPhones = (0...99999).map { index -> iPhone in
switch index % 5 {
case 0:
return iPhone(name: "11", storage: 64)
case 1:
return iPhone(name: "12mini", storage: 128)
case 2:
return iPhone(name: "12pro", storage: 256)
case 3:
return iPhone(name: "12pro", storage: 512)
case 4:
return iPhone(name: "13pro", storage: 128)
default:
return iPhone(name: "13pro", storage: 256)
}
}
// 앞으로 찾을 아이폰
let iPhone13_pro128 = iPhone(name: "13pro", storage: 128)
// 비교 시간 체크
let start = CFAbsoluteTimeGetCurrent()
let iPhone13_pro128_arr = iPhones.filter { $0 == iPhone13_pro128 }
let diff = CFAbsoluteTimeGetCurrent() - start
print("Took \(diff) seconds")
全部で3回テストしましたが、結果は以下の通りです.//Equatable
//0.8124189376831055
//0.7504860162734985
//0.763375997543335
//Hashable
//0.7399230003356934
//0.7337720394134521
//0.7278430461883545
微妙な差ですが、Hashable 3連勝!
意味のある結果ではありませんがHashableの方が早いです
なぜなら、Hashableは構造インスタンスの作成時にもhash値を作成するからだと思います.
予め作成したhash値を利用して比較するために速度を上げたのではないかと思います.
(インスタンスの作成時間を含めたパフォーマンスが比較的遅い場合があります...)
だから同じ検査をするときもHashableを受け継ぐことができます
(Hashable実施部から見ると、Equatableを継承しているので、Equatableでもできる.)
Equatableを使用する必要がある場合は、例で「iPhoneデバイス名と同じデバイスを使用する」というカスタム比較文を作成します.
正直性能の差が少ないので好みでやればいいのですが
Reference
この問題について([Swift]EquatableとHashableの比較性能テスト), 我々は、より多くの情報をここで見つけました https://velog.io/@haze5959/Swift-Equatable-vs-Hashable-비교-성능-테스트テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol