Язык программирования Перфолента.Net - Официальный сайт

 Язык программирования Перфолента.Net - Официальный сайт.

Поиск   
Главная :: О проекте :: Контакты :: Обратная связь :: Благодарности :: ВходГость

   >   >   >   > 



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

 

 

 

 




К началу статьи


Предыдущая статья:
Перфолента.Net компилируемый язык со статической типизацией.

Вернуться в раздел:
Вводный раздел
  Поддержи проект!

Вы можете поддержать разработку Перфоленты, перечислив любую удобную сумму, которая пойдет на развитие языка и поддержку инфраструктуры сайта.

  Новости:
      04.01.2025 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.15.0_CE
      23.09.2024 Опубликована новая статья: "Конструируем класс. Делегаты."
      30.08.2024 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.14.0
      24.05.2024 Обновлён справочный раздел сайта
      01.07.2023 Новая версия 0.4.13.0 языка программирования Перфолента.Net
       Все новости