Виталий Крячко. 15.06.06 г.
" О бедном Basic замолвите слово!"
Сравнительный анализ производительности современных компиляторов Бейсика между собой, а так же их краткие характеристики.
Статью Дейва Джюэла "Бейсик повзрослел!" я прочитал в прошлом веке, где то в начале 90-х годов. В тот момент казалось, что утверждение о серьёзности программирования на Бейсике, в нижеприведенной цитате, мягко говоря несколько преувеличено.
<<< Готов поспорить, что без языка Бейсик фирма Microsoft никогда не достигла бы тех вершин, на которых она сейчас находится. Президент фирмы Билл Гейтс начал свою профессиональную карьеру в программировании, создав интерпретатор Бейсика для одного из самых первых персональных компьютеров, и уже не смог остановиться. Есть люди, которые все еще считают, что слово "профессиональный" серьезно не может быть применено к какой-либо системе программирования на Бейсике. Вот ведь и название его расшифровывается как Универсальный Символьный Код для Начинающих (Beginners All purpose Symbolic Instruction Code). Мне кажется, что этот взгляд несколько устарел, хотя бы в свете широкого диапазона средств, предлагаемых новым компилятором. Выпустив недавно седьмую версию системы Microsoft Basic Professional, фирма Microsoft хочет показать, что Бейсик по-преж нему остается серьезным претендентом на звание "профессионального" языка программирования. >>>
Но время шло, оперативные системы сменяли одну за другой, рождались и умирали языки программирования, менялись и корректировались диалекты старых языков, подстраиваясь под ритм и внешний вид новых "Окошек". И Бейсик действительно взрослел, вбирая в себя все лучшие качества от собратьев, однако оставаясь доступным для понимания миллионов людей различных профессий и интересов. Благодаря тесной интеграции с таким популярным пакетом программ как Microsoft Office (VBA), а так же поддержка современными ОС семейства Microsoft Windows языка сценариев (VBS), теперь и профессиональные программисты вряд ли могут считаться таковыми, не обладая достаточными навыками в работе с Бейсиком. Из отечественных разработчиков широко известна фирма "1С" своими программами в области бухгалтерского учёта, внутренний язык которых ни что иное как Бейсик (причём даже в русифицированном варианте).
Бейсик критиковали практически во все времена - вначале, что это интерпретатор, а не компилятор, то подвергался нападкам оператор безусловного перехода GOTO (и почему это ни кого не раздражает JMP в ассемблере ?), то за возможность предварительно не объявлять переменные. От этих недостатков Бейсик избавился ещё при ОС DOS, причём, не потеряв достоинств. Обзаведясь полноценным компилятором, однако в среде разработке всё еще использует интерпретатор, который на стадии ввода кода программы с лёгкостью выявляет синтаксические ошибки. К стати, этого не умели делать IDE "профессиональных " языков вплоть до новой платформы ,NET. Бейсик пробрался и на эту платформу, хотя прежний BASIC в нём уже не узнать, а по сему речь сегодня не о нём.
Все эквиваленты ключевых слов языка Си "switch", "while" и "do", трансформировались в SELECT CASE, WHILE, WEND и DO LOOP но и про GOTO не забыли - вдруг пригодиться, для совместимости со старыми версиями. Теперь во многих реализациях языка компилятор следит за переменными - просто набери Option Explicit и объявляй переменные на здоровье! Следующий недостаток - отсутствие единой сертификации на язык, множество диалектов. Да, тут время и темпы развития сыграли не добрую шутку - действительно, сейчас можно насчитать не менее 2-х десятков различных рабочих компиляторов Бейсика, а сколько версий в пределах одного компилятора? Так вот, горькая правда в том, что если попытаться откомпилировать один и тот же код в десятке различных компиляторов, то можно с уверенностью сказать, удастся это только в одном случае - там, для какого компилятора мы этот код писали. В остальных случаях скорее всего не получиться, ну конечно, если код серьёзный и содержит операторы ввода-вывода к примеру. Но с другой стороны, время на отладку потребуется минимальное, особенно если она будет происходить в интеллектуальной IDE. В прочем, особенно зацикливаться на этой проблеме не стоит - даже такой строгий в этом отношении Паскаль и то имеет этот грех - попробуйте откомпилировать проект в разных версиях Паскаля или Дельфи. А вот с СИ поступили круче - просто расширили язык до С++ - вроде основы те, а концепция уже другая...
Пожалуй одна из самых главных претензий к Бейсику - его медлительность скомпилированных файлов. Видимо, это утверждение целиком и полностью было справедливо для интерпретаторов. Истину в этом вопросе можно установить, испытав несколько компиляторов различных версий Бейсика.
Тесты.
В связи с тестами мне вспомнилась ещё одна книга из прошлого века которая называлась " От микрокалькулятора к персональному компьютеру" , издания 1990 г. У неё два автора В.Ф. Очков и В.А. Хмелюк. В конце первой части, которую написал Хмелюк, есть пример программы "Бенчмарк", написанный на Бейсике. Вот его исходный вариант:
10 REM БЕНЧМАРК 20 PRINT "НАЧАЛО" 30 K=0 40 Dim M(5) 50 K=K+l 60 A=K/2*3+4-5 70 G0SUB 140 80 For L=1 To 5 90 M(L)=A 100 Next L 110 If K<1000 THEN 50 120 PRINT "КОНЕЦ" 130 End 140 Return
|
По данным из этой же книги интерпретатор Бейсика СМ-1800 отрабатывает эту программу за 104 сек. Но как говориться, с той поры много времени утекло, компьютеры стали быстрее, а Бейсик, как мы выяснили, повзрослел. Но было очень интересно проверить быстродействие компиляторов именно при помощи этого теста, изменив его с учетом вышеизложенного. Путем нескольких пробных вариантов приемлемое время выполнения программы установлено при изменении 110 строки к виду If K<90000000 THEN 50. В тестах использовался компьютер на базе процессора AMD ATHLON 64 3000+(1800MHz, 512 k, Socket 939).
В тестах использовались следующие компиляторы языка Бейсик:
-
Microsoft QuickBasic v4.5
-
Microsoft Visual Basic v6.0
-
FreeBASIC v0.15
-
PowerBASIC Windows Compiler 7.0
-
PureBasic v3.94
-
Blitz3D V1.83
Исключительно для сравнительного анализа текст этого бенчмарка был перенесён еще на два популярных компилятора - Microsoft Visual С++ v6.0 и Delphi v7, причем максимально приближённо к Бейсику, на сколько это было возможно для синтаксиса этих языков.
Microsoft QuickBasic v4.5
Эта версия компилятора, единственная в моём обзоре, среда разработки и исполняемый exe код которой предназначалась для DOS. Код бенчмарка можно было не менять вообще - QuickBasic поддерживает работу с номерами строк. Единственное изменение в коде, которое не влияет на скорость работы, это замер времени выполнения бенчмарка. Возможно Бейсик в СМ -1800 не работал с таймером, а возможно по другим причинам, скорость работы программы измеряли по наручным часам.
REM БЕНЧМАРК PRINT "НАЧАЛО" start = TIMER K = 0 DIM M(5) t50: K = K + L A = K / 2 * 3 + 4 - 5 GOSUB g140 FOR L = 1 TO 5 M(L) = A NEXT L IF K < 90000000 THEN GOTO t50 finis = TIMER - start PRINT "КОНЕЦ - " + STR$(finis) INPUT ; q END g140: RETURN
|
Оператор INPUT служит только для того, что бы окошко DOS программы не закрывалось самостоятельно в среде Windows. Следует отметить, что этот бенчмарк под управлением DOS работает примерно на 15% быстрее. Время работы программы составило 56 сек. По сравнению с СМ -1800 не плохо, если ещё учесть, что задача усложнилась в 90 тысяч раз!
Microsoft Visual Basic v6.0
Пожалуй, это самый популярный из современных Бейсиков. Дружественная среда разработки позволяет очень быстро писать программы с современным интерфейсом. В виду того, что консольное приложение не является основным для VB6, и для его создания пришлось бы использовать Win API, пришлось создать обыкновенное оконное.
Rem БЕНЧМАРК Dim K As Long, L As Long, A As Long Dim M(5) As Long Private Sub Command1_Click() Print "Start" start = Timer K = 0 50 K = K + L A = K / 2 * 3 + 4 - 5 GoSub 140 For L = 1 To 5 M(L) = A Next L If K < 90000000 Then GoTo 50 finis = Timer - start Print "End - " + Str$(finis) Exit Sub 140 Return End Sub
|
Как видно из листинга программы код практически не изменился. Для запуска бенчмарка на форме нарисована кнопка Command1. Я добавил описание переменных, хотя этого можно было и не делать, но скорее всего, время работы программы несколько увеличилось бы, тип переменных по умолчанию variant самый медленный. Интересно, что вместо меток для переходов я просто оставил нумерацию строк, и VB6 понял, что я имел в виду... Время работы программы зависит от занятости системы и колеблется около 5 сек. (+- 0.3 сек). Размер исполняемого файла 20.48 Кб. И если бы не огромная библиотека(MSVBVM60.DLL ок 1.2Мб), без которой этот файл работать не может, то всё было бы просто хорошо. Хотя наличие такой библиотеки это всё таки благо - во всех современных ОС она встроена изначально, а где её нет, можно установить один раз. К примеру Delphi "таскает" всё нужное с собой в каждом исполняемом файле (с Win GUI), а по этому их размер 300-400 Кб!
PowerBASIC Windows Compiler 7.0
Компилятор, создающий "полноценный" 32-битный код, не требующий ни каких внешних DLL. Может использоваться для создания DLL. Есть дополнительное приложение PowerForms, которое позволяет создавать окна , диалоги, меню и т.п. почти так же просто как и VB6.
REM bencm #COMPILE EXE #DIM ALL #INCLUDE "Win32API.inc" FUNCTION PBMAIN () AS LONG LOCAL K AS LONG LOCAL A AS LONG LOCAL L AS LONG LOCAL TimeGO AS LONG LOCAL timeEnd AS LONG MSGBOX ("Начать?") timeGo=GetTickCount() K=0 DIM M(5) AS LONG g50: K=K+1 A=K/2*3+4-5 GOSUB proc1 FOR L=1 TO 5 M(L)=A NEXT L IF K<90000000 THEN g50 timeEnd=GetTickCount() - timeGO MSGBOX ("Конец - "+ STR$(timeEnd)+" ms") proc1: RETURN END FUNCTION
|
"Чистота" exe кода файла достигается по истине Паскалевской скорпулёзностью. Подключаемые внешние библиотеки, обязательное декларирование переменных, наличие основной функции (PBMAIN), даже стыдливо спрятан оператор GOTO ! Куда катится наш старый добрый Бейсик ? Но зато посмотрите как просто используются Win API. Что бы использовать GetTickCount() в VB6 нужно писать достаточно длинную декларацию, а тут просто оптом подключил библиотеку Win32API и всё. К стати, этот компилятор нередко используют для написания DLL для VB, якобы для ускорения кода, но в моём исследовании работают программы примерно одинаково, те же 5 сек( +- трамвайная остановка), хотя размер exe значительно меньше, даже без учёта MSVBVM60.DLL , всего 10.752 Кб.
Blitz3D V1.83
Позиционируется как необычайно лёгкий в использовании язык для написания 2D и 3D игр. Множественные примеры, присутствующие в комплекте, это подтверждают - игры, написанные на этом языке работают, особенно понравилась демка с птичками в каньоне - даже голова закружилась от скорости!. Но коварный бенчмарк развеял хорошее впечатление от Blitz3D буквально за 75 секунд... Именно столько выполнялся вот этот код:
Print "Start" Newtimer=MilliSecs() k = 0 Dim M(5) .g50 k=k + 1 a=k/2*3+4-5 Gosub s140 For l=1 To 5 M(l)=a Next If k<90000000 Then Goto g50 Lasttimer=MilliSecs() - Newtimer Print "End " + Lasttimer q= Input("Press Enter") End .s140 Return
|
Код почти стандартный, единственное отличие - используется своя функция подсчета миллисекунд. При выполнении программы нет как такового консольного окна, а его графическая эмуляция. Ну и конечно, размер в 1.2 Мб это очень много! Хотя для игрушек этот параметр не критичен. Но для простых вычислительных задач я бы вам этот компилятор не советовал...
PureBasic v3.94
Этот компилятор собственно не компилятор как таковой - он не делает непосредственно байт-код, а транслирует бейсик коды в коды ассемблера, и компилируются все эти коды в Fasm подобном компиляторе. Такой подход позволяет создавать очень эффективные приложения которые по скорости работы и размерам сопоставимы с программами на Fasm, TASM, NASM. Создание программ просто, как нажатие на кнопку. Высокая скорость компилирования - 300000 строк кода в минуту на Pentium 200. Это современный, постоянно развивающийся язык. Новая версия V4 выпушена буквально весной 2006г. Поддерживаются указатели, структуры, процедуры, динамически связанные списки, при желании можно реализовать ООП, и т.п. современные атрибуты профессионального языка программирования высокого уровня. Прибавьте к этому OGRE OpenSource 3D движок, визуальный редактор и вы получите почти идеальный инструмент.
;БЕНЧМАРК OpenConsole() PrintN ("Nacalo") timeGo=GetTickCount_() K=0 Dim M(5) g50: K=K+l A=K/2*3+4-5 Gosub r140 For L=1 To 5 M(L)=A Next L If K<90000000: Goto g50:EndIf timeEnd=GetTickCount_()-timeGO PrintN ("End - " + Str(timeEnd) + " ms") Input() CloseConsole() End r140: Return
|
Внешние библиотеки полностью написаны в ручную на ассемблере, в результате этого некоторые функции выполняются быстрее, чем эквивалентные на С или С++. Что самое приятное, все библиотеки, как пользовательские, так и стандартной поставки подключаются автоматически, на стадии загрузки среды программирования, но в выходной exe файл будут скомпилированы только те, которые реально используются. Время выполнения бенчмарка 0.965 секунды, размер файла 5.632Кб ! Это уже можно назвать отличным результатом.
FreeBASIC v0.15
FreeBASIC - это единственный в моём обзоре полностью свободный (бесплатный) 32-разрядный компилятор языка программирования Бейсик с поддержкой синтаксиса MS-QuickBASIC. В качестве проекта FreeBASIC появился в 2004 году. Основал его Andre Victor, который и является ведущим разработчиком FreeBASIC. К особенностям этого языка относятся поддержка указателей, расширенный набор встроенных типов, пользовательские типы, перегрузка функций, о поддержка инструкций на языке ассемблера (X86) и т.п., что делает FreeBASIC полноценным средством разработки программ. Приложения могут разрабатываться для 32-разрядных операционных систем: MS DOS, Windows, Linux.
#include once "windows.bi" REM БЕНЧМАРК rem start = TIMER start = GetTickCount() PRINT "Start" K = 0 DIM M(5) 50 K = K + L A = K / 2 * 3 + 4 - 5 GOSUB 140 FOR L = 1 TO 5 M(L) = A NEXT L IF K < 90000000 THEN GOTO 50 finis = GetTickCount() - start PRINT "End - " + STR$(finis) INPUT "?", q END 140 RETURN
|
Как видно из листинга, код практически не отличается от исходного. Подключив библиотеку windows.bi можно полноценно использовать WIN32API, и оконный интерфейс. Размер скомпилированного файла 29.184 Кб, но размер консольного приложения не превысит и 10 Кб, если не подключать вышеуказанную библиотеку. Время работы программы всего 0.578 сек. это абсолютный лидер моего обзора. Теперь наверное понятно, почему тест был усложнён мною в 90 тысяч раз - при меньших значениях он исполняется просто мгновенно.
Выводы
Осталось только распечатать сводную таблицу результатов. Я не хочу здесь делать ни каких выводов, хвалить одни языки, или ругать другие - универсального инструмента не существует, искусство программирования заключается в том, что бы в зависимости от ситуации, воспользоваться наиболее подходящим. В общем, если вдруг вам понадобиться срочно написать очень быструю программу, выбирайте Бейсик!
Компиляторы
|
Операционная система
|
Размер EXE файла ,(Kb)
|
Время выполнения,(cек)
|
Microsoft QuickBasic v4.5
|
DOS Windows XP sp2
|
34.488
|
56.13
|
Microsoft Visual Basic v6.0
|
Windows XP sp2
|
20.480
|
5.12
|
FreeBASIC v0.15
|
Windows XP sp2
|
29.184
|
0.578
|
PowerBASIC Windows Compiler 7.0
|
Windows XP sp2
|
10.752
|
5.14
|
PureBasic v3.94
|
Windows XP sp2
|
5.632
|
0.965
|
Blitz3D V1.83
|
Windows XP sp2
|
1 241.088
|
74.94
|
Microsoft Visual С++ v6.0
|
Windows XP sp2
|
192.569
|
4.0
|
Delphi v7
|
Windows XP sp2
|
16.896
|
3.33
| 90000000>90000000>90000000>1000>
Достарыңызбен бөлісу: |