Почему язык программирования Перфолента работает намного быстрее, чем языки 1С и OneScript

Материал из ТХАБ.РФ
Перейти к: навигация, поиск

Язык программирования Перфолента работает довольно быстро. Но почему, что в нем не так, по сравнению с языками 1С, OneScript и Python? В этой статье мы проведем небольшое тестирование и измерение скорости работы программ на указанных языках программирования.

Почему Перфолента работает намного быстрее, чем 1С и OneScript?

Язык Перфолента это компилируемый язык, а не интерпретатор, как 1С, OneScript и Python. Поэтому код написанный на Перфоленте транслируется не в байт-код, как в упомянутых интерпретируемых языках, а в специальный низкоуровневый язык CIL. При запуске программа на лету (сразу вся или фрагментами по мере необходимости) компилируется в машинный код конкретного процессора специальным JIT компилятором. А машинный код работает на много быстрее, чем любой интерпретируемый байт-код, т.к. отсутствуют накладные расходы на работу интерпретатора.

Сравниваем скорость языков программирования Перфолента, 1С, OneScript и Python. Разница в скорости у разных интерпретаторов может быть весьма большой. Например, из указанных в первом абзаце интерпретаторов, самый медленный это 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 сек

-

342.2 сек

в 510 раз медленнее

OneScript

244.1 сек

в 360 раз медленнее

Python

59.27 сек

в 90 раз медленнее

Конечно, приведенный результат вовсе не означает, что любые алгоритмы, написанные на этих языках, будут работать с таким же соотношением скорости. Чем больше в алгоритме вызовов библиотечных функций, тем меньше будет разница в скорости между Перфолентой и интерпретируемыми языками. Библиотечные функции обычно написаны на быстрых языках, вроде Си или Си++, но даже в таких алгоритмах Перфолента показывает большее быстродействие в 6-10 раз, т.к. между вызовами библиотечных функций все еще остается интерпретируемый код. И чем больше этого интерпретируемого кода, тем больше в отрыв уходит Перфолента! В приведенных примерах программ, библиотечных вызовов нет, поэтому и разрыв в производительности такой большой.

В 510 раз, много это или мало? Представьте, что программа на Перфоленте считала сутки, тогда программа на 1С будет считать примерно полтора года, программа на OneScript справится за год, а Питону хватит трёх месяцев…

Но не все так плохо для интерпретируемых языков. В обычных программах большое быстродействие необходимо редко, т.к. алгоритмы, реагирующие на действия пользователя, не очень тяжелые. И все же, иногда производительности не хватает, и в этом случае Перфолента может быть хорошим выбором для решения задачи. Тем более, что вызвать библиотеку написанную на Перфоленте можно и из OneScript, и из 1С, и даже из Питона. Из OneScript это делается совершенно естественно, т.к. он написан на той же платформе Net, что и Перфолента. А для запуска из 1С и Питона нужны специальные приемы, которые, к счастью, подробно описаны на многих ресурсах в интернете, например, на Инфостарте.