Created
June 17, 2022 10:22
-
-
Save langyanduan/4f9e773c9b25f8f829542185ea55581d to your computer and use it in GitHub Desktop.
Decoder performance
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import XCTest | |
@testable import JSONPerformance | |
import NEAutoCodable | |
import HandyJSON | |
class JSONPerformanceTests: XCTestCase { | |
override func setUpWithError() throws { | |
// Put setup code here. This method is called before the invocation of each test method in the class. | |
} | |
override func tearDownWithError() throws { | |
// Put teardown code here. This method is called after the invocation of each test method in the class. | |
} | |
func jsonObject() -> [String: Any] { | |
let object: [String: Any] = [ | |
"userId": "12345", | |
"nickname": "用户1", | |
"avatarImgUrl": "http://baidu.com/avatarImageUrl.jpg", | |
"signature": "qqq", | |
"age": 19, | |
"birthday": 1052209042000, | |
"gender": 2, | |
"constellation": "金牛座", | |
"imAccId": "abcdefgzzzzzzzzz", | |
"realMan": 1, | |
"realPersonGender": 0, | |
"registerTime": 1620289047216, | |
"language": "en-US", | |
] | |
return object | |
} | |
func jsonData() -> Data { | |
return try! JSONSerialization.data(withJSONObject: jsonObject()) | |
} | |
class Codable_Model: NECodable { | |
var userId: String | |
var nickname: String | |
var avatarImgNosKey: String? | |
var avatarImgUrl: String | |
var signature: String | |
var age: Int | |
var birthday: Int | |
var gender: Int | |
var constellation: String | |
var imAccId: String | |
var realMan: Int | |
var realPersonGender: Int | |
var registerTime: Int | |
var language: String | |
} | |
class NECodable_Model: NECodable { | |
var userId: String | |
var nickname: String | |
var avatarImgNosKey: String? | |
var avatarImgUrl: String | |
var signature: String | |
var age: Int | |
var birthday: Int | |
var gender: Int | |
var constellation: String | |
var imAccId: String | |
var realMan: Int | |
var realPersonGender: Int | |
var registerTime: Int | |
var language: String | |
} | |
class HandyJSON_Model: HandyJSON { | |
var userId: String = "" | |
var nickname: String = "" | |
var avatarImgNosKey: String? | |
var avatarImgUrl: String = "" | |
var signature: String = "" | |
var age: Int = 0 | |
var birthday: Int = 0 | |
var gender: Int = 0 | |
var constellation: String = "" | |
var imAccId: String = "" | |
var realMan: Int = 0 | |
var realPersonGender: Int = 0 | |
var registerTime: Int = 0 | |
var language: String = "" | |
required init() {} | |
} | |
let loopCount = 10000 | |
// 0.128 | |
func testDataJSONDecoder() throws { | |
self.measure { | |
let decoder = JSONDecoder() | |
let data = jsonData() | |
for _ in 0..<loopCount { | |
let model = try! decoder.decode(Codable_Model.self, from: data) | |
} | |
} | |
} | |
// 0.196 | |
func testObjectJSONDecoder() throws { | |
// This is an example of a performance test case. | |
self.measure { | |
let decoder = JSONDecoder() | |
let object = jsonObject() | |
for _ in 0..<loopCount { | |
let data = try! JSONSerialization.data(withJSONObject: object) | |
let model = try! decoder.decode(Codable_Model.self, from: data) | |
} | |
} | |
} | |
// 0.251 | |
func testDataNEJSONDecoder() throws { | |
self.measure { | |
let decoder = NEJSONDecoder() | |
let data = jsonData() | |
for _ in 0..<loopCount { | |
let model = try! decoder.decode(NECodable_Model.self, data: data) | |
} | |
} | |
} | |
// 0.166 | |
func testObjectNEJSONDecoder() throws { | |
self.measure { | |
let decoder = NEJSONDecoder() | |
let object = jsonObject() | |
for _ in 0..<loopCount { | |
let model = try! decoder.decode(NECodable_Model.self, jsonObject: object) | |
} | |
} | |
} | |
// 0.440 | |
func testDataHandyJSON() throws { | |
self.measure { | |
let data = jsonData() | |
for _ in 0..<loopCount { | |
let object = try! JSONSerialization.jsonObject(with: data) as! [String: Any] | |
let model = HandyJSON_Model.deserialize(from: object)! | |
} | |
} | |
} | |
// 0.335 | |
func testObjectHandyJSON() throws { | |
self.measure { | |
let object = jsonObject() | |
for _ in 0..<loopCount { | |
let model = HandyJSON_Model.deserialize(from: object) | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment