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

Материал из ТХАБ.РФ
Перейти к: навигация, поиск
(Новая страница: «Язык программирования Перфолента работает довольно быстро. Но почему, что в нем не так, п…»)
 
м (Ссылки)
 
(не показаны 3 промежуточные версии этого же участника)
Строка 10: Строка 10:
 
Проведем небольшое исследование.
 
Проведем небольшое исследование.
  
Возьмем простую программу с циклами, условиями и переменными на языке Перфолента:
+
==Возьмем простую программу с циклами, условиями и переменными на языке Перфолента:==
  
 
  //***************************
 
  //***************************
Строка 18: Строка 18:
 
         Перем а тип Целое;
 
         Перем а тип Целое;
 
         Перем б тип Булево;
 
         Перем б тип Булево;
 
 
         Перем т тип Число = ТекущаяУниверсальнаяДатаВМиллисекундах();
 
         Перем т тип Число = ТекущаяУниверсальнаяДатаВМиллисекундах();
 
 
         ВыводСтроки "начало..."
 
         ВыводСтроки "начало..."
 
 
         а=5;
 
         а=5;
 
         б=Истина;
 
         б=Истина;
Строка 51: Строка 48:
 
             КонецЦикла;
 
             КонецЦикла;
 
         КонецЦикла;
 
         КонецЦикла;
       
 
 
         п="Время: "+(ТекущаяУниверсальнаяДатаВМиллисекундах() - т)/1000
 
         п="Время: "+(ТекущаяУниверсальнаяДатаВМиллисекундах() - т)/1000
 
         ВыводСтроки п
 
         ВыводСтроки п
 
         ВводСтроки п
 
         ВводСтроки п
       
 
 
     КонецПроцедуры
 
     КонецПроцедуры
   
+
  КонецПрограммы
  КонецПрограммы  
+
  
И сравним скорость ее работы с аналогичной программой на языке 1С (она же работает и на [[OneScript]]):
+
== И сравним скорость ее работы с аналогичной программой на языке 1С (она же работает и на [[OneScript]]): ==
  
 
  Перем а;
 
  Перем а;
 
  Перем б;
 
  Перем б;
 
 
  т = ТекущаяУниверсальнаяДатаВМиллисекундах();
 
  т = ТекущаяУниверсальнаяДатаВМиллисекундах();
 
 
  Сообщить("начало...");
 
  Сообщить("начало...");
 
 
  а=5;
 
  а=5;
 
  б=Истина;
 
  б=Истина;
Строка 99: Строка 90:
 
Сообщить("ок...");
 
Сообщить("ок...");
 
Сообщить("Время, сек: "+(ТекущаяУниверсальнаяДатаВМиллисекундах() - т)/1000);
 
Сообщить("Время, сек: "+(ТекущаяУниверсальнаяДатаВМиллисекундах() - т)/1000);
 
 
  
 
Тексты программы на языках Перфолента и 1С (OneScript) различаются очень мало. Главное различие в том, что в языке Перфолента явно или неявно указываются типы переменных.
 
Тексты программы на языках Перфолента и 1С (OneScript) различаются очень мало. Главное различие в том, что в языке Перфолента явно или неявно указываются типы переменных.
  
Для сравнения возьмем аналогичную программу на языке Python:
+
==Для сравнения возьмем аналогичную программу на языке Python:==
  
 
  import time
 
  import time
 
 
  start_time = time.time()
 
  start_time = time.time()
 
 
  а=5;
 
  а=5;
 
 
  б=True;
 
  б=True;
 
 
  for Инд in range(1, 1000000):
 
  for Инд in range(1, 1000000):
 
 
     if б:
 
     if б:
 
 
         б=not б;
 
         б=not б;
 
 
     else:
 
     else:
 
 
         б=not б;
 
         б=not б;
 
 
     if а>Инд:
 
     if а>Инд:
 
 
         а=а-1;
 
         а=а-1;
 
 
     else:
 
     else:
 
 
         а=а+5;
 
         а=а+5;
 
 
     а2=5;
 
     а2=5;
 
 
     б2=True;
 
     б2=True;
 
 
     for Инд2 in range(1, 300):
 
     for Инд2 in range(1, 300):
 
 
         if б2:
 
         if б2:
 
 
             б2=not б2;
 
             б2=not б2;
 
 
         else:
 
         else:
 
 
             б2=not б2;
 
             б2=not б2;
 
 
         if а2>Инд2:
 
         if а2>Инд2:
 
 
             а2=а2-1;
 
             а2=а2-1;
 
 
         else:
 
         else:
 
 
             а2=а2+5;
 
             а2=а2+5;
 
 
  print(a);
 
  print(a);
 
 
  print("--- %s seconds ---" % (time.time() - start_time))
 
  print("--- %s seconds ---" % (time.time() - start_time))
  
 
В целом выглядит похоже, хотя и не привычно для глаза программиста 1С.
 
В целом выглядит похоже, хотя и не привычно для глаза программиста 1С.
  
Запустим все программы и сведем результаты в таблицу:
+
==Запустим все программы и сведем результаты в таблицу: ==
  
Язык
+
{| class="wikitable"
 
+
|-
Время работы
+
! Язык !! Время работы !! Разница в сравнении с Перфолентой
 
+
|-
Разница в сравнении с Перфолентой
+
| Перфолента || 0.6647 сек || -
 
+
|-
Перфолента
+
| || 342.2 сек || в 510 раз медленнее
 
+
|-
0.6647 сек
+
| [[OneScript]]|| 244.1 сек || в 360 раз медленнее
 
+
|-
-
+
| Python || 59.27 сек || в 90 раз медленнее
 
+
|-
+
| [[Гонец]] || не проводилось || -
 
+
|}
342.2 сек
+
 
+
в 510 раз медленнее
+
 
+
OneScript
+
 
+
244.1 сек
+
 
+
в 360 раз медленнее
+
 
+
Python
+
 
+
59.27 сек
+
 
+
в 90 раз медленнее
+
  
 
Конечно, приведенный результат вовсе не означает, что любые алгоритмы, написанные на этих языках, будут работать с таким же соотношением скорости. Чем больше в алгоритме вызовов библиотечных функций, тем меньше будет разница в скорости между Перфолентой и интерпретируемыми языками. Библиотечные функции обычно написаны на быстрых языках, вроде Си или Си++, но даже в таких алгоритмах Перфолента показывает большее быстродействие в 6-10 раз, т.к. между вызовами библиотечных функций все еще остается интерпретируемый код. И чем больше этого интерпретируемого кода, тем больше в отрыв уходит Перфолента! В приведенных примерах программ, библиотечных вызовов нет, поэтому и разрыв в производительности такой большой.
 
Конечно, приведенный результат вовсе не означает, что любые алгоритмы, написанные на этих языках, будут работать с таким же соотношением скорости. Чем больше в алгоритме вызовов библиотечных функций, тем меньше будет разница в скорости между Перфолентой и интерпретируемыми языками. Библиотечные функции обычно написаны на быстрых языках, вроде Си или Си++, но даже в таких алгоритмах Перфолента показывает большее быстродействие в 6-10 раз, т.к. между вызовами библиотечных функций все еще остается интерпретируемый код. И чем больше этого интерпретируемого кода, тем больше в отрыв уходит Перфолента! В приведенных примерах программ, библиотечных вызовов нет, поэтому и разрыв в производительности такой большой.
Строка 197: Строка 146:
  
 
Но не все так плохо для интерпретируемых языков. В обычных программах большое быстродействие необходимо редко, т.к. алгоритмы, реагирующие на действия пользователя, не очень тяжелые. И все же, иногда производительности не хватает, и в этом случае Перфолента может быть хорошим выбором для решения задачи. Тем более, что вызвать библиотеку написанную на Перфоленте можно и из OneScript, и из 1С, и даже из Питона. Из OneScript это делается совершенно естественно, т.к. он написан на той же платформе Net, что и Перфолента. А для запуска из 1С и Питона нужны специальные приемы, которые, к счастью, подробно описаны на многих ресурсах в интернете, например, на Инфостарте.
 
Но не все так плохо для интерпретируемых языков. В обычных программах большое быстродействие необходимо редко, т.к. алгоритмы, реагирующие на действия пользователя, не очень тяжелые. И все же, иногда производительности не хватает, и в этом случае Перфолента может быть хорошим выбором для решения задачи. Тем более, что вызвать библиотеку написанную на Перфоленте можно и из OneScript, и из 1С, и даже из Питона. Из OneScript это делается совершенно естественно, т.к. он написан на той же платформе Net, что и Перфолента. А для запуска из 1С и Питона нужны специальные приемы, которые, к счастью, подробно описаны на многих ресурсах в интернете, например, на Инфостарте.
 +
 +
== Ссылки ==
 +
* [http://promcod.com.ua/Article.asp?code=20190702143521033734 ПРОМОКОД - Первоисточник официальной документации по ЯП Перфолента.NET ]
 +
  
 
[[Категория:Описание языка Перфолента.NET]]
 
[[Категория:Описание языка Перфолента.NET]]

Текущая версия на 23:32, 8 июня 2020

Язык программирования Перфолента работает довольно быстро. Но почему, что в нем не так, по сравнению с языками 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С и Питона нужны специальные приемы, которые, к счастью, подробно описаны на многих ресурсах в интернете, например, на Инфостарте.

Ссылки