Свифт массивов очень медленно (при использовании в словарях) - PullRequest
0 голосов
/ 15 октября 2018

Я имею дело с очень большими массивами в Swift и пришел к выводу, что они чрезвычайно медленны при добавлении элементов к нему.

Я наблюдаю за этимипроблемы, в основном, когда я использую массивы в Dictionary.

ex: var array = [String : [String]]

Поэтому я решил сравнить очень простой array тест с использованием игровой площадки, думая, что проблема возникла изarray само по себе:

var arr = [Int]()

for i in 0..<1_000_000 {
    arr.append(i)
}

Этот код может длиться вечно.Теперь тот же код в C # с реальным List, даже не занимает секунду .

IList list = new List<int>();

for (int i = 0; i < 1000000; i++) {
   list.Add(i);
}

Я знаю, что массивыв Swift нет списков, как на других языках, где у вас есть возможность выбрать ArrayList, LinkedList.Swift, перераспределяет каждый раз, когда вы добавляете новый элемент, и в основном помещает весь массив в более новое пространство большего размера.

Как мы можем решить эту проблему?

EDIT 1: Хэмиш отметил, что использование среды Xcode Playground - ужасная идея для отслеживания производительности.Он прав, Свифт arrays так же быстр, как С #, когда не используется на игровой площадке.

РЕДАКТИРОВАТЬ 2: Проблемы с производительностью arrays не из-за самого array,но только при использовании arrays внутри словаря .Смотрите ответы ниже.

1 Ответ

0 голосов
/ 15 октября 2018

Ну, эта проблема в основном из-за функции .append, которая должна создать местоположение и затем заполнить его,

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

var arr = [Int].init(repeating: 0, count: 1_000_000)

for i in 0..<1_000_000 {
    arr[i] = i
}

Это было использование игровой площадки,однако производительность игровой площадки крайне низкая по сравнению с инструментом command-line или реальным проектом, но, тем не менее, этот код работает немного быстрее на детской площадке.

...