SMXMLDocument 로 작업을 하고 있었는데, 파싱이 너무 느리다….
전에는 느껴보지 못했던 엄청난 속도 저하와 엄청난 메모리 사용량….
용량이 작은 파일에서는 문제가 없는데, xml 파일 용량이 3메가 넘는 걸 로딩시켰더니 몇 초나 걸릴 정도였다.
너무나도 느려서 http://jansanchez.com/blog/2013/01/22/state-of-ios-xml-libraries-in-2013/ 에서 제일 빠르다고 하는 TBXML로 하려고 했는데, 얘는 배열처리하는게 너무 귀찮게 되어있다.
요즘 세상에 -> 를 사용하다니 ㄷㄷ
그래서 저 글에 나온 데로 RaptureXML로 예제를 만들어봤는데, TBXML 만큼 빠르고, SMXML보다 쓰기 쉽게 되어있다.
<TrainingCenterDatabase> <Activities> <Activity Sport="Biking"> <Id>2012-04-29T00:04:51.000Z</Id> <Lap StartTime="2012-04-29T00:04:51.000Z"> <TotalTimeSeconds>16462.779</TotalTimeSeconds> <DistanceMeters>117454.14</DistanceMeters> <MaximumSpeed>16.547000885009766</MaximumSpeed> <Calories>4200</Calories> <Intensity>Active</Intensity> <Cadence>79</Cadence> <TriggerMethod>Manual</TriggerMethod> <Track> <Trackpoint> <Time>2012-04-29T00:04:51.000Z</Time> <AltitudeMeters>2.4000000953674316</AltitudeMeters> <DistanceMeters>0.0</DistanceMeters> <Extensions> <TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2"> <Speed>2.9670000076293945</Speed> </TPX> </Extensions> </Trackpoint> <Trackpoint> <Time>2012-04-29T00:04:52.000Z</Time> <AltitudeMeters>2.4000000953674316</AltitudeMeters> <DistanceMeters>1.4900000095367432</DistanceMeters> <Extensions> <TPX xmlns="http://www.garmin.com/xmlschemas/ActivityExtension/v2"> <Speed>3.5950000286102295</Speed> </TPX> </Extensions> </Trackpoint> </Track> </Lap> </Activity> </Activities> <Author xsi:type="Application_t"> <Name>Garmin Connect API</Name> <Build> <Version> <VersionMajor>13</VersionMajor> <VersionMinor>4</VersionMinor> <BuildMajor>0</BuildMajor> <BuildMinor>0</BuildMinor> </Version> </Build> <LangID>en</LangID> <PartNumber>006-D2449-00</PartNumber> </Author> </TrainingCenterDatabase>
NSString *filePath = [[NSBundle mainBundle] bundlePath]; NSString *path = [[NSString alloc] initWithString:[filePath stringByAppendingPathComponent:@"activity_172801550.tcx"]]; NSData *data = [NSData dataWithContentsOfFile:path]; RXMLElement *root = [RXMLElement elementFromXMLData:data]; RXMLElement *activities = [root child:@"Activities"]; RXMLElement *activity = [activities child:@"Activity"]; RXMLElement *lap = [activity child:@"Lap"]; NSString* startTime = [lap attribute:@"StartTime"]; RXMLElement* totalTimeSeconds = [lap child:@"TotalTimeSeconds"]; RXMLElement* track = [lap child:@"Track"]; NSArray* trackPoints = [track children:@"Trackpoint"]; RXMLElement *author = [root child:@"Author"]; RXMLElement *name = [author child:@"Name"]; NSLog(@"total time : %@, start time : %@, name : %@, count : %d", totalTimeSeconds.text, startTime, name.text, trackPoints.count); // total time : 16462.779, start time : 2012-04-29T00:04:51.000Z, name : Garmin Connect API, count : 2
SMXML로 작업하면서 속도저하를 유발시켰던 파일을 로딩해도 RXML에서는 아주 빠르게 파싱을 한다.