Почему язык программирования Перфолента работает намного быстрее, чем языки 1С и OneScript
Язык программирования Перфолента работает довольно быстро. Но почему, что в нем не так, по сравнению с языками 1С, OneScript и Python? В этой статье мы проведем небольшое тестирование и измерение скорости работы программ на указанных языках программирования.
Почему Перфолента работает намного быстрее, чем 1С и OneScript?
Язык Перфолента это компилируемый язык, а не интерпретатор, как 1С, OneScript и Python. Поэтому код написанный на Перфоленте транслируется не в байт-код, как в упомянутых интерпретируемых языках, а в специальный низкоуровневый язык CIL. При запуске программа на лету (сразу вся или фрагментами по мере необходимости) компилируется в машинный код конкретного процессора специальным JIT компилятором. А машинный код работает на много быстрее, чем любой интерпретируемый байт-код, т.к. отсутствуют накладные расходы на работу интерпретатора.
Разница в скорости у разных интерпретаторов может быть весьма большой. Например, из указанных в первом абзаце интерпретаторов, самый медленный это 1С, а самый быстрый Python. OneScript находится примерно посередине между ними.
Проведем небольшое исследование.
Возьмем простую программу с циклами, условиями и переменными на языке Перфолента:
//***************************
Программа ТестСкорости
//---------------------------
Процедура Старт
Перем
а тип Целое;
Перем
б тип Булево;
Перем
т тип Число = ТекущаяУниверсальнаяДатаВМиллисекундах();
ВыводСтроки
"начало..."
а=5;
б=Истина;
Для
Инд=1 По 1000000 Цикл
Если б Тогда
б=НЕ б;
Иначе
б=НЕ б;
КонецЕсли;
Если а>Инд Тогда
а=а-1;
Иначе
а=а+5;
КонецЕсли;
а2=5;
б2=Истина;
Для Инд2=1 По 300 Цикл
Если б2 Тогда
б2=НЕ б2;
Иначе
б2=НЕ б2;
КонецЕсли;
Если а2>Инд2 Тогда
а2=а2-1;
Иначе
а2=а2+5;
КонецЕсли;
КонецЦикла;
КонецЦикла;
п="Время:
"+(ТекущаяУниверсальнаяДатаВМиллисекундах()
- т)/1000
ВыводСтроки
п
ВводСтроки
п
КонецПроцедуры
КонецПрограммы
И сравним скорость ее работы с аналогичной программой на языке 1С (она же работает и на OneScript):
Перем а;
Перем б;
т = ТекущаяУниверсальнаяДатаВМиллисекундах();
Сообщить("начало...");
а=5;
б=Истина;
Для Инд=1 По 1000000 Цикл
Если б Тогда
б=НЕ
б;
Иначе
б=НЕ
б;
КонецЕсли;
Если
а>Инд Тогда
а=а-1;
Иначе
а=а+5;
КонецЕсли;
а2=5;
б2=Истина;
Для Инд2=1 По 300 Цикл
Если
б2 Тогда
б2=НЕ б2;
Иначе
б2=НЕ б2;
КонецЕсли;
Если а2>Инд2 Тогда
а2=а2-1;
Иначе
а2=а2+5;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Сообщить("ок...");
Сообщить("Время, сек: "+(ТекущаяУниверсальнаяДатаВМиллисекундах() - т)/1000);
Тексты программы на языках Перфолента и 1С (OneScript) различаются очень мало. Главное различие в том, что в языке Перфолента явно или неявно указываются типы переменных.
Для сравнения возьмем аналогичную программу на языке Python:
import time
start_time = time.time()
а=5;
б=True;
for Инд in range(1,
1000000):
if б:
б=not б;
else:
б=not б;
if а>Инд:
а=а-1;
else:
а=а+5;
а2=5;
б2=True;
for Инд2 in
range(1, 300):
if б2:
б2=not б2;
else:
б2=not б2;
if а2>Инд2:
а2=а2-1;
else:
а2=а2+5;
print(a);
print("--- %s seconds ---" %
(time.time() - start_time))
В целом выглядит похоже, хотя и не привычно для глаза программиста 1С.
Запустим все программы и сведем результаты в таблицу:
Язык |
Время работы |
Разница в сравнении с Перфолентой |
Перфолента |
0.6647 сек |
- |
1С |
342.2 сек |
в 510 раз медленнее |
OneScript |
244.1 сек |
в 360 раз медленнее |
Python |
59.27 сек |
в 90 раз медленнее |
Конечно, приведенный результат вовсе не означает, что любые алгоритмы, написанные на этих языках, будут работать с таким же соотношением скорости. Чем больше в алгоритме вызовов библиотечных функций, тем меньше будет разница в скорости между Перфолентой и интерпретируемыми языками. Библиотечные функции обычно написаны на быстрых языках, вроде Си или Си++, но даже в таких алгоритмах Перфолента показывает большее быстродействие в 6-10 раз, т.к. между вызовами библиотечных функций все еще остается интерпретируемый код. И чем больше этого интерпретируемого кода, тем больше в отрыв уходит Перфолента! В приведенных примерах программ, библиотечных вызовов нет, поэтому и разрыв в производительности такой большой.
В 510 раз, много это или мало? Представьте, что программа на Перфоленте считала сутки, тогда программа на 1С будет считать примерно полтора года, программа на OneScript справится за год, а Питону хватит трёх месяцев…
Но не все так плохо для интерпретируемых языков. В обычных программах большое быстродействие необходимо редко, т.к. алгоритмы, реагирующие на действия пользователя, не очень тяжелые. И все же, иногда производительности не хватает, и в этом случае Перфолента может быть хорошим выбором для решения задачи. Тем более, что вызвать библиотеку написанную на Перфоленте можно и из OneScript, и из 1С, и даже из Питона. Из OneScript это делается совершенно естественно, т.к. он написан на той же платформе Net, что и Перфолента. А для запуска из 1С и Питона нужны специальные приемы, которые, к счастью, подробно описаны на многих ресурсах в интернете, например, на Инфостарте.
Сергей Рогаткин
К началу статьи
Предыдущая статья:
Перфолента.Net компилируемый язык со статической типизацией.
Вернуться в раздел:
Вводный раздел