iOS에서 simdjson으로 JSON 분석

5094 단어
simdjson을 바탕으로 JSON 데이터를 해석합니다. simdjson은 데이밍 선생님의 iOS 개발 고수 과정을 보고 26|JSON 해석의 성능을 어떻게 향상시킵니까?simdjson에 관심이 많아서 자신은simdjson 코드를 정적 라이브러리로 바꾸어 시스템의 NSJSONserialization과 비교하여 그 성능을 분석하려고 시도했다
- (void)viewDidLoad {
[super viewDidLoad];


dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

///  json  
[self testWithSDJSONFileName:@"citm_catalog"];
[self testNSJSONFileName:@"citm_catalog"];

[self testWithSDJSONFileName:@"package-lock"];
[self testNSJSONFileName:@"package-lock"];

[self testWithSDJSONFileName:@"package"];
[self testNSJSONFileName:@"package"];

//twitterescaped
[self testWithSDJSONFileName:@"twitter"];
[self testNSJSONFileName:@"twitter"];

[self testWithSDJSONFileName:@"random"];
[self testNSJSONFileName:@"random"];

[self testWithSDJSONFileName:@"mesh.pretty"];
[self testNSJSONFileName:@"mesh.pretty"];

//small data

//twitter_timeline
[self testWithSDJSONFileName:@"twitter_timeline"];
[self testNSJSONFileName:@"twitter_timeline"];

[self testWithSDJSONFileName:@"repeat"];
[self testNSJSONFileName:@"repeat"];

[self testWithSDJSONFileName:@"truenull"];
[self testNSJSONFileName:@"truenull"];

[self testWithSDJSONFileName:@"flatadversarial"];
[self testNSJSONFileName:@"flatadversarial"];

[self testWithSDJSONFileName:@"demo"];
[self testNSJSONFileName:@"demo"];
}];
[op start];
});


}

//simdjson JSON  
- (void) testWithSDJSONFileName:(NSString *)fileName {
NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent();
id object = [MTJSONSerialization sd_JSONObjectWithData:data];
CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime);
NSLog(@"%@ simdjson Linked in %f ms", fileName ,linkTime *1000.0);
}

///  JSON  
- (void) testNSJSONFileName:(NSString *)fileName {
NSString *path = [[NSBundle mainBundle] pathForResource:fileName ofType:@"json"];
NSData *data = [NSData dataWithContentsOfFile:path];
CFAbsoluteTime startTime =CFAbsoluteTimeGetCurrent();
id object = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:NULL];
CFAbsoluteTime linkTime = (CFAbsoluteTimeGetCurrent() - startTime);
NSLog(@"%@ system Linked in %f ms", fileName ,linkTime *1000.0);
}


테스트 결과


2019-06-21 21:01:42.320578+0800 MTSimdjson[5427:64308] citm_catalog simdjson Linked in 32.685995 ms 2019-06-21 21:01:42.331235+0800 MTSimdjson[5427:64308] citm_catalog system Linked in 9.927034 ms
2019-06-21 21:01:42.332638+0800 MTSimdjson[5427:64308] package-lock simdjson Linked in 0.445008 ms 2019-06-21 21:01:42.333043+0800 MTSimdjson[5427:64308] package-lock system Linked in 0.244975 ms
2019-06-21 21:01:42.334273+0800 MTSimdjson[5427:64308] package simdjson Linked in 0.033975 ms 2019-06-21 21:01:42.334433+0800 MTSimdjson[5427:64308] package system Linked in 0.016928 ms
2019-06-21 21:01:42.349764+0800 MTSimdjson[5427:64308] twitter simdjson Linked in 12.775898 ms 2019-06-21 21:01:42.355304+0800 MTSimdjson[5427:64308] twitter system Linked in 5.193949 ms
2019-06-21 21:01:42.372887+0800 MTSimdjson[5427:64308] random simdjson Linked in 14.144063 ms 2019-06-21 21:01:42.379515+0800 MTSimdjson[5427:64308] random system Linked in 6.255984 ms
2019-06-21 21:01:42.400383+0800 MTSimdjson[5427:64308] mesh.pretty simdjson Linked in 15.720010 ms 2019-06-21 21:01:42.423751+0800 MTSimdjson[5427:64308] mesh.pretty system Linked in 22.629023 ms
2019-06-21 21:01:42.425485+0800 MTSimdjson[5427:64308] twitter_timeline simdjson Linked in 0.821948 ms 2019-06-21 21:01:42.426221+0800 MTSimdjson[5427:64308] twitter_timeline system Linked in 0.571012 ms
2019-06-21 21:01:42.427058+0800 MTSimdjson[5427:64308] repeat simdjson Linked in 0.325918 ms 2019-06-21 21:01:42.427323+0800 MTSimdjson[5427:64308] repeat system Linked in 0.105023 ms
2019-06-21 21:01:42.428360+0800 MTSimdjson[5427:64308] truenull simdjson Linked in 0.326991 ms 2019-06-21 21:01:42.428588+0800 MTSimdjson[5427:64308] truenull system Linked in 0.064015 ms
2019-06-21 21:01:42.429058+0800 MTSimdjson[5427:64308] flatadversarial simdjson Linked in 0.024080 ms 2019-06-21 21:01:42.429219+0800 MTSimdjson[5427:64308] flatadversarial system Linked in 0.014901 ms
2019-06-21 21:01:42.429624+0800 MTSimdjson[5427:64308] demo simdjson Linked in 0.027061 ms 2019-06-21 21:01:42.429761+0800 MTSimdjson[5427:64308] demo system Linked in 0.012040 ms
실험을 통해simdjson 순수 해석 json 데이터가 NSJSONserialization보다 빠르지만 해석된 json 데이터를 OC NSDictionary나 NSArray로 전환하는 효율이 NSJSONserialization보다 낮다는 것을 발견했다. 현재simdjson은arm64 구조를 지원하지 않기 때문에 iOS 리얼리티 장치에서 실행할 수 없고 x86-64에서만 테스트 데모 주소를 실행할 수 있다.https://github.com/BestiOSDev/MTSimdjson

좋은 웹페이지 즐겨찾기