Swift vs JavascriptCore perf - PullRequest
       32

Swift vs JavascriptCore perf

0 голосов
/ 08 января 2020

Я работаю над новой конечной точкой (iOS) продукта. Он имеет веб-присутствие. Несколько компонентов (бизнес-логика c) также потребуются в iOS. Я пытаюсь взвесить преимущества JS повторного использования кода по сравнению с повторной реализацией бизнес-логики c в Swift.
Чтобы измерить производительность, я выполнил пузырьковую сортировку с жестко закодированными данными размера 10. Тот же код (кроме syntacti c) сахар) было написано в Swift и JS. Библиотека JavascriptCore использовалась для выполнения кода, записанного в файле. js.

if let jsSourcePath = Bundle.main.path(forResource: "TestPerf", ofType: "js") {
            do {
            // Load its contents to a String variable.
            let jsSourceContents = try String(contentsOfFile: jsSourcePath)

            // Add the Javascript code that currently exists in the jsSourceContents to the Javascript Runtime through the jsContext object.
            context.evaluateScript(jsSourceContents)

        }
        catch {
            print(error.localizedDescription)
        }   

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

for i in 1...5 {
    testPerfOneIteration(context: self.jsContext) <-------- Same JSContext every time
}

одна итерация в мс.
Swift: 0.09500980377197266 JS: 1.0221004486083984

Swift: 0.04100799560546875 JS: 0.160932540235547

Swift: 0,0400543212890625 JS: 0,11491775512695312

Swift: 0,03910064697265625 JS: 0,12,91036605834961

Swift: 0,03898143768310547 JS 101 * 101 * 10 * 288, 1030, 030800000000 запустить сортировку пузырьков 10k раз и запомните общее истекшее время.

10 тыс. Итераций в мс
Сдв. Общее время: 432,3619604110718 JS общее время: 1050.1370429992676

Сдвиг общее время: 405.10010719299316 JS общее время: 1043,85790662

Общее время выполнения Swift: 396,6749906539917 * Общее время выполнения JS: 1031.238079071045

Общее время выполнения Swift: 399,82903003692627 JS Общее время выполнения: 1010,8669996261597

Общее время выполнения Swift : 419.8509454727173 JS общее время: 1007.6370239257812

В первом эксперименте видно, что JS perf было 10x Swift в первом запуске и 2,5 - 4x в последующих. Во втором эксперименте JS perf было примерно в 2,5 раза больше Swift.

Вопросы:
1. Почему JS perf меняется в первом и последующих прогонах? Движок JS выполняет кэширование байтового кода? Что за JS настройка компонента / среды выполняется Swift?
2. В настоящее время один и тот же JSContext передается при каждом вызове. Будет ли какая-то разница, если JSContext создается перед каждым вызовом?
3. Ожидается ли, что выполнение кода JS всегда будет медленнее, чем в Swift? Рекомендуется ли выполнять код JS из Swift, если производительность (2.5x) плохая?
4. Насколько громоздкой является JS история отладки, когда она забита Swift?

...