2016-10-06 2 views
3

Я использую SwiftyJSON для разбора JSON в моем приложении. Недавно я обновил свое приложение до Swift3 и наблюдаю значительные проблемы с производительностью. Я попытался изолировать проблему в небольшом проекте. Я рассматриваю возможность перехода на другую библиотеку или переход на родную (но это большая работа в моем приложении), но хотелось бы, чтобы кто-либо из сообщества наблюдал подобную проблему. Любая помощь приветствуется и благодарит заранее.Swifty JSON Деградация производительности с Swift3, XCode8, iOS10

ниже код используется принять субсекундных в Swift2, но занимает 15 секунд в исполняемый релиз с помощью Swift3:

func parseSampleJson() { 
     let st = NSDate() 

     let file:NSString = Bundle.main.path(forResource: "testJson", ofType: "json")! as NSString 
     let jsonData:NSData = NSData.dataWithContentsOfMappedFile(file as String) as! NSData 
     let json = JSON(data: jsonData as Data) 

     let dataJson = json["data"] 
     for (_, subJson): (String, JSON) in dataJson { 
//   NSLog("Name = " + subJson["Name"].stringValue) 
      let castes = subJson["Castes"] 
      for (_, cn): (String, JSON) in castes { 
//    NSLog(" Name = " + cn["Name"].stringValue) 
      } 
     } 
     let et = NSDate() 
     let timeTaken = et.timeIntervalSince(st as Date) 
     NSLog("******* Time taken = \(timeTaken)") 
    } 

Полный проект находится на GitHub в https://github.com/good2best123/SwiftyJSONTest.

+0

Это похоже на проблему! вы находите решение еще? –

ответ

1

У меня такое же поведение. Судя по всему, существует существенная регрессия производительности между SwiftyJSON 2.3.2/Swift 2.2 и SwiftyJSON 3.1.1/Swift 3.0.

Первое, что я попробую использовать индекс для доступа к данным JSON.

let dataJson = json["data"] 
let n = dataJson.count 

for djIndex in 0...n-1 { 
    let subJson = dataJson[djIndex] 
    let castes = subJson["Castes"] 
    let castesCount = castes.count 

//   NSLog("Name = " + subJson["Name"].stringValue) 

    for cnIndex in 0..castesCount-1{ 
    let cn = castes[cnIndex] 
    //    NSLog(" Name = " + cn["Name"].stringValue) 
    } 

} 

От тестирования я сделал на моем коде, это было ясно, что массив разбор JSON там циклы процессора использовался.

Кэширование любого свойства JSON, используемого более одного раза в переменной, в то время как уродливое, привело к тому, что производительность моего кода Swift 3/SwiftJSON 3.1.1 вернулась к исходному SWIFT 2.2/SwiftyJSON 2.3.2.

Надеюсь, это поможет.

2

Можете ли вы попробовать перейти на версию 3.1.3. Решение проблемы there

Смежные вопросы