2016-11-08 2 views
1

я прочитал строки из Plist файла, строка имеет 105625 символов, которая, как 325 х 325 сеток информационного узла, я использую цикл для извлечения полукокса:Строка индекс занимает много времени

for x in 1...325{ 
    for y in 1...325{ 
     let char = string[string.index(string.startIndex, offsetBy: x * y)] 
     .... 
    } 
} 

но очень медленно, почему?

+0

поставить это код в папке dispatch_asyn –

+1

что вы делаете с char? если вы делаете дорогостоящую операцию, используя ее 105625 раз, это, скорее всего, замедлит работу вниз. – Fonix

+0

Получите ссылку на указатель на string.characters и итерации по указателю. См. Пример здесь https://github.com/petershaw/charsinfile/blob/master/charsinfile/CharReader.swift –

ответ

0

Вы можете попробовать использовать немного резьбы с помощью этого метода, чтобы ускорить процесс, можно просто положить все это в нормальном dispatch_async, если ничего не нужно ждать его, чтобы закончить

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { 
     //put all lengthy calculations here 

     dispatch_async(dispatch_get_main_queue()) { 
      //do any UI updates here 
     } 
    } 

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

let group = dispatch_group_create(); 
    let queue = dispatch_queue_create("processStuff", DISPATCH_QUEUE_CONCURRENT) 

    for x in 1...325{ 
     dispatch_group_async(group,queue,{ 
      for y in 1...325{ 
       //do stuff 
      } 
     }) 
    } 

    //dispatch_group_wait(group,DISPATCH_TIME_FOREVER); // use this if you want to wait here, blocking the main thread 

    dispatch_group_notify(group,dispatch_get_main_queue(),{ //use this if you want to be notified when all the groups have finished without blocking the main thread 

    }) 

предупреждения: если вы расчеты в каждый внутреннего цикла зависят от других итераций других для итераций цикла или переменные внешней r, ваши вычисления могут испортиться, поэтому будьте осторожны.

+0

Спасибо за вашу помощь, я попробую позже. – user4851347

0

Я решил эту проблему другим способом.

Вместо шпагатом подстрочный, я использую это:

for char in string.characters{ 
    doing some thing 
} 

Выше решения гораздо быстрее, чем строка [string.index (string.startIndex, offsetBy: х * у - 1)]

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