Skip to content

Instantly share code, notes, and snippets.

@langyanduan
Created June 17, 2022 10:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save langyanduan/4f9e773c9b25f8f829542185ea55581d to your computer and use it in GitHub Desktop.
Save langyanduan/4f9e773c9b25f8f829542185ea55581d to your computer and use it in GitHub Desktop.
Decoder performance
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