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

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

Пример: 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 перераспределяет каждый раз, когда вы добавляете новый элемент, и в основном помещает весь массив в новое, большее пространство.

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

РЕДАКТИРОВАТЬ 1: Хэмиш указал, что использование среды Xcode Playground - ужасная идея для отслеживания производительности. Он прав, Swift arrays работают так же быстро, как C #, когда не используются в Playground.

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

3
Scaraux 15 Окт 2018 в 00:28

1 ответ

Лучший ответ

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

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

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

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

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

0
Mohmmad S 14 Окт 2018 в 21:50