Почему приложение на OS X на Swift такое медленное?

Хочу для себя сделать софтинку по обработке текста, вот для теста запустил написание чисел от 1 до заданного числа (textCount) в поле NSTextView. Так вот, если запросить жалких 5000 итераций то программа думает секунд 15. При указании 10 000 итераций она вообще виснет. И в мониторинге системы грузит проц на 99%.

Кажется, турбо-паскаль 10 лет назад шуршал куда быстрее.

Это какой-то медленный девелоп-мод или я что-то не включил или почему последний макбук на вроде как хорошем ЯП за 15 секунд не может досчитать до 5 000 ? Как он тогда будет мне ковырять текстовые файлы в сотни мегабайт?

Код ниже.

import Cocoa

class ViewController: NSViewController {
    
    @IBOutlet var outcomeText: NSTextView!
    @IBOutlet var textCount: NSTextField!

    @IBAction func TextGenGo(sender: AnyObject) {
        var i:int_least32_t;
        for (i=1;i<=textCount.intValue;i++) {
            outcomeText.string = outcomeText.string! + String(i) + " ";
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override var representedObject: AnyObject? {
        didSet {
        // Update the view, if already loaded.
        }
    }


}


И так же не понятно почему оно дописывает строчки не в реалтайме, а думает и потом выдает полный список.

При этом в консоли скорость нормальная, проблем нет и пишет последовательно, а не все сразу в конце.
  • Вопрос задан
  • 3288 просмотров
Решения вопроса 1
ManWithBear
@ManWithBear
Swift Adept, Prague
Открываем профайлер и запускаем на 5000.
Видим, что из 26 секунд, необходимых программе на выполнение функции, почти все они уходят на завершение редактирования NSTextView.
pikucha.ru/iedeV

Теперь делаем финт ушами и выводим создание строки отдельно, отображение для неё отдельно. (Заранее извиняюсь за какие-то ошибки в коде, это мой первый раз на свифте)
@IBAction func TextGenGo(sender: AnyObject) {
        var i:int_least32_t;
        var string = outcomeText.string;
        for (i=1;i<=textCount.intValue;i++) {
            string = string! + String(i) + " ";
        }
        outcomeText.string = string;
    }

Теперь выполнение 20000 заняло пол секунды.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы