Почему язык программирования Перфолента работает намного быстрее, чем языки 1С и OneScript — различия между версиями
Тест (обсуждение | вклад) (Новая страница: «Язык программирования Перфолента работает довольно быстро. Но почему, что в нем не так, п…») |
|||
(не показано 5 промежуточных версий 2 участников) | |||
Строка 10: | Строка 10: | ||
Проведем небольшое исследование. | Проведем небольшое исследование. | ||
− | Возьмем простую программу с циклами, условиями и переменными на языке Перфолента: | + | ==Возьмем простую программу с циклами, условиями и переменными на языке Перфолента:== |
//*************************** | //*************************** | ||
Строка 18: | Строка 18: | ||
Перем а тип Целое; | Перем а тип Целое; | ||
Перем б тип Булево; | Перем б тип Булево; | ||
− | |||
Перем т тип Число = ТекущаяУниверсальнаяДатаВМиллисекундах(); | Перем т тип Число = ТекущаяУниверсальнаяДатаВМиллисекундах(); | ||
− | |||
ВыводСтроки "начало..." | ВыводСтроки "начало..." | ||
− | |||
а=5; | а=5; | ||
б=Истина; | б=Истина; | ||
Строка 51: | Строка 48: | ||
КонецЦикла; | КонецЦикла; | ||
КонецЦикла; | КонецЦикла; | ||
− | |||
п="Время: "+(ТекущаяУниверсальнаяДатаВМиллисекундах() - т)/1000 | п="Время: "+(ТекущаяУниверсальнаяДатаВМиллисекундах() - т)/1000 | ||
ВыводСтроки п | ВыводСтроки п | ||
ВводСтроки п | ВводСтроки п | ||
− | |||
КонецПроцедуры | КонецПроцедуры | ||
− | + | КонецПрограммы | |
− | КонецПрограммы | ||
− | И сравним скорость ее работы с аналогичной программой на языке 1С (она же работает и на [[OneScript]]): | + | == И сравним скорость ее работы с аналогичной программой на языке 1С (она же работает и на [[OneScript]]): == |
Перем а; | Перем а; | ||
Перем б; | Перем б; | ||
− | |||
т = ТекущаяУниверсальнаяДатаВМиллисекундах(); | т = ТекущаяУниверсальнаяДатаВМиллисекундах(); | ||
− | |||
Сообщить("начало..."); | Сообщить("начало..."); | ||
− | |||
а=5; | а=5; | ||
б=Истина; | б=Истина; | ||
Строка 96: | Строка 87: | ||
КонецЕсли; | КонецЕсли; | ||
КонецЦикла; | КонецЦикла; | ||
− | КонецЦикла; | + | КонецЦикла; |
− | Сообщить("ок..."); | + | Сообщить("ок..."); |
− | Сообщить("Время, сек: "+(ТекущаяУниверсальнаяДатаВМиллисекундах() - т)/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С. | ||
− | Запустим все программы и сведем результаты в таблицу: | + | ==Запустим все программы и сведем результаты в таблицу: == |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | в 90 раз медленнее | + | {| class="wikitable" |
+ | |- | ||
+ | ! Язык !! Время работы !! Разница в сравнении с Перфолентой | ||
+ | |- | ||
+ | | Перфолента || 0.6647 сек || - | ||
+ | |- | ||
+ | | 1С || 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://perfolenta.net - Первоисточник официальной документации по ЯП Перфолента.NET ] | ||
+ | |||
[[Категория:Описание языка Перфолента.NET]] | [[Категория:Описание языка Перфолента.NET]] |
Текущая версия на 17:35, 15 сентября 2024
Язык программирования Перфолента работает довольно быстро. Но почему, что в нем не так, по сравнению с языками 1С, OneScript и Python? В этой статье мы проведем небольшое тестирование и измерение скорости работы программ на указанных языках программирования.
Почему Перфолента работает намного быстрее, чем 1С и OneScript?
Язык Перфолента это компилируемый язык, а не интерпретатор, как 1С, OneScript и Python. Поэтому код написанный на Перфоленте транслируется не в байт-код, как в упомянутых интерпретируемых языках, а в специальный низкоуровневый язык CIL. При запуске программа на лету (сразу вся или фрагментами по мере необходимости) компилируется в машинный код конкретного процессора специальным JIT компилятором. А машинный код работает на много быстрее, чем любой интерпретируемый байт-код, т.к. отсутствуют накладные расходы на работу интерпретатора.
Сравниваем скорость языков программирования Перфолента, 1С, OneScript и Python. Разница в скорости у разных интерпретаторов может быть весьма большой. Например, из указанных в первом абзаце интерпретаторов, самый медленный это 1С, а самый быстрый Python. OneScript находится примерно посередине между ними.
Проведем небольшое исследование.
Содержание
- 1 Возьмем простую программу с циклами, условиями и переменными на языке Перфолента:
- 2 И сравним скорость ее работы с аналогичной программой на языке 1С (она же работает и на OneScript):
- 3 Для сравнения возьмем аналогичную программу на языке Python:
- 4 Запустим все программы и сведем результаты в таблицу:
- 5 Ссылки
Возьмем простую программу с циклами, условиями и переменными на языке Перфолента:
//*************************** Программа ТестСкорости //--------------------------- Процедура Старт Перем а тип Целое; Перем б тип Булево; Перем т тип Число = ТекущаяУниверсальнаяДатаВМиллисекундах(); ВыводСтроки "начало..." а=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С и Питона нужны специальные приемы, которые, к счастью, подробно описаны на многих ресурсах в интернете, например, на Инфостарте.