Страница Ивана Рощина > Статьи >

© Иван Рощин, Москва

ZXNet: 500:95/462.53
E-mail: bestview@mtu-net.ru
WWW: http://www.ivr.da.ru

Трансляторы Бейсика для ZX Spectrum: сравнение быстродействия

Радиомир. Ваш компьютер» 11/2001)
Дата последнего редактирования: 1.12.2002.

Введение
Участники тестирования
Тесты
Результаты тестирования
Выводы
Литература

Введение

Сначала немного теоретических сведений, возможно, вам уже известных. Программа на языке высокого уровня (в том числе на Бейсике) не может быть исполнена процессором непосредственно, а должна быть сначала переведена в машинные коды. Этот процесс осуществляется транслятором. Трансляторы делятся на два типа: интерпретаторы и компиляторы. Интерпретаторы последовательно просматривают текст программы и выполняют её покомандно. Это сильно замедляет работу программы, но зато упрощает отладку: выполняемую программу в любой момент можно остановить, отредактировать, просмотреть и изменить значения переменных и сразу же продолжить выполнение. По-другому действует компилятор. Он сразу переводит всю программу в машинные коды, после чего она будет выполняться гораздо быстрее. Но отлаживать программу в этом случае не так удобно, после каждого изменения приходится её перекомпилировать.

На ZX Spectrum имеются и интерпретаторы, и компиляторы Бейсика. Соответственно, возникает множество вопросов. Какой интерпретатор работает быстрее? Насколько ускоряется выполнение программ после компиляции? Какой компилятор эффективнее? Насколько ускоряется выполнение отдельных видов операций? Чтобы ответить на эти вопросы, я провёл специальное тестирование.

Участники тестирования

Это четыре интерпретатора и три компилятора. Ниже приведены краткие сведения о них.

  1. BASIC 48, © 1982 Sinclair Research LTD. Стандартный интерпретатор, зашитый в ПЗУ ZX Spectrum 48. С описанием его возможностей вы можете ознакомиться в [1]. С этим вариантом Бейсика в той или иной степени совместимы все рассматриваемые далее интерпретаторы и компиляторы.
  2. BASIC 128, © 1986 Sinclair Research LTD. Дополненная версия базового интерпретатора, зашитая в ПЗУ ZX Spectrum 128. Описание читайте в [2].
  3. BETA BASIC 3.11, © 1985 Betasoft. Интерпретатор с дополнительными, по сравнению со стандартным, возможностями. Добавлено около 30 новых функций. Описание — в [4], [5].
  4. YS MEGABASIC 4.21, original version (3.0) by Mike Leaman, 1985, this version by Dmitri Petras, 1992. Ещё один расширенный интерпретатор, описание которого вы найдёте в [4].
  5. SOFTEK FP 1.7, © 1983 Martin Lewis. Компилятор подмножества стандартного Бейсика (не поддерживаются функции, определённые пользователем, многомерные массивы и некоторые другие возможности). Описание — в [3].
  6. TOBOS-FP, © 1986 Torun. Компилятор, полностью совместимый со стандартным Бейсиком.
  7. SOFTEK IS 1.2, © 1983 Martin Lewis. Целочисленный компилятор. Не реализована работа с массивами и некоторые другие функции. Описание читайте в [3] (там же, где рассказывается о SOFTEK FP 1.7, — эти два компилятора рассматриваются вместе).

Тесты

Тестировались наиболее часто используемые, на мой взгляд, возможности Бейсика.

Тест 1 — целочисленные вычисления. Производится вычисление значений функции z=x2+y2–2x+3y+14 при изменении x и y от –60 до 60 с шагом 1.

      10 FOR x=-60 TO 60: FOR y=-60 TO 60
      20 LET z=x*x+y*y-2*x+3*y+14
      30 NEXT y: NEXT x

Тест 2 — вычисления с плавающей точкой. Производится вычисление значений функции y=3x2+2x+5 на промежутке от –10 до 10 с шагом 0,001.

      10 FOR x=-10 TO 10 STEP 0.001
      20 LET y=3*x*x+2*x+5
      30 NEXT x

Тест 3 — работа с одномерными массивами. Массив из 100 элементов заполняется случайными значениями, после чего производится сортировка по возрастанию методом пузырька.

      10 LET size=100: DIM a(size): RANDOMIZE
      20 FOR i=1 TO size: LET a(i)= RND : NEXT i
      30 FOR i=1 TO size-1: FOR j=1 TO size-i
      40 IF a(j) > a(j+1) THEN LET temp=a(j): LET a(j)=a(j+1):
         LET a(j+1)=temp
      50 NEXT j: NEXT i

Тест 4 — вывод текста. Производится печать текста на экране с различными значениями ink и paper.

      10 FOR i=0 TO 7: FOR j=0 TO 7: FOR k=0 TO 21
      20 PRINT INK i; PAPER j; AT k,0;
         "abcdefghijklmnopqrstuvwxyz012345"
      30 NEXT k: NEXT j: NEXT i

Примечание. Перед выполнением этого теста в YS MEGABASIC командой WINDOW 0,0,24,64 устанавливались размеры окна вывода, чтобы исключить скроллинг при печати; в BETA BASIC производился переход к стандартной процедуре печати с помощью команды CSIZE=0. Цель этих действий — поставить данные интерпретаторы в равные условия с другими участниками тестирования.

Тест 5 — вывод графики. Изображаются точки, линии и окружности.

      10 FOR x=0 TO 255 STEP 5: FOR y=0 TO 175 STEP 5: PLOT x,y:
         NEXT y: NEXT x
      20 FOR x=0 TO 255 STEP 5: FOR y=0 TO 175 STEP 5:
         PLOT 128,88: DRAW x-128,y-88: NEXT y: NEXT x
      30 FOR r=0 TO 88 STEP 5: CIRCLE 128,88,r: NEXT r

Тест 6 — работа со строками символов. Создаётся 1000-символьная строка, каждый символ которой может быть либо «A», либо «B». Затем подсчитывается, сколько раз в этой строке встретится подстрока «ABAA».

      10 LET size=1000: LET a$="": LET n=0
      20 FOR i=1 TO size
      30 IF PEEK (i)<128 THEN LET a$=a$+ "A": GO TO 50
      40 LET a$=a$+"B"
      50 NEXT i
      60 FOR i=1 TO size-3
      70 IF a$(i TO i+3)="ABAA" THEN LET n=n+1
      80 NEXT i

Тестирование проводилось на обычном «Пентагоне-128» с тактовой частотой процессора 3,5 МГц.

Результаты тестирования

Табл. 1
Тест Время выполнения (минуты:секунды)
BASIC 48 BASIC 128 BETA BASIC 3.11 MEGA BASIC 4.21 SOFTEK FP 1.7 TOBOS SOFTEK IS 1.2
Целочисленные вычисления 4:17 5:06 4:29 4:21 1:34 0:45 0:19
Вычисления с плавающей точкой 5:58 7:05 6:41 6:05 3:20 0:47
Работа с одномерными массивами 2:09 2:29 2:18 2:09 0:34 0:13
Вывод текста 0:43 0:48 0:50 0:54 0:27 0:26 0:23
Вывод графики 1:21 1:36 1:31 1:23 0:53 0:46 0:41
Работа со строками 0:49 0:57 0:47 0:49 0:20 0:22 0:13

Для большей наглядности удобно представить результаты тестирования в графической форме, приняв время выполнения каждого теста для BASIC 48 за 100%.

Диаграмма 1. Время выполнения тестов относительно BASIC 48.
  Целочисленные вычисления Вычисления с плавающей точкой Работа с одномерными массивами Вывод  текста  Вывод графики Работа со строками
BASIC 48
100%
100%
100%
100%
100%
100%
BASIC 128
119%
119%
116%
112%
119%
116%
BETA BASIC 3.11
105%
112%
107%
116%
112%
96%
MEGA BASIC 4.21
102%
102%
100%
126%
102%
100%
SOFTEK FP 1.7
37%
56%
26%
63%
65%
41%
TOBOS
18%
13%
10%
60%
57%
45%
SOFTEK IS 1.2
7%
53%
51%
27%

Усреднив данные для каждого тестируемого транслятора, получим следующую диаграмму:

Диаграмма 2. Среднее время выполнения тестов.
100%
116%
108%
105%
47%
33%
27%
BASIC 48 BASIC 128 BETA BASIC 3.11 MEGA BASIC 4.21 SOFTEK FP 1.7 TOBOS SOFTEK IS 1.2

Примечание. Возможности компилятора SOFTEK IS 1.2 ограничены и не позволяют ему выполнить тесты «Вычисления с плавающей точкой» и «Работа с одномерными массивами». Если использовать при усреднении данных для этого компилятора результаты лишь четырёх выполненных им тестов, то полученный усреднённый результат нельзя будет корректно сравнивать с другими. Он окажется больше, чем у компилятора TOBOS, — при том, что время выполнения каждого из четырёх тестов у SOFTEK IS меньше! Поэтому для корректного (насколько это возможно) сравнения я решил принять время выполнения двух невыполненных тестов таким же, как у компилятора TOBOS (он наиболее близкок по скорости), предположив, что если бы в SOFTEK IS можно было бы выполнить эти тесты, то результаты оказались бы не хуже. :)

А вот что мы получим, взяв наилучшие результаты выполнения каждого теста:

Диаграмма 3. Наилучшее время выполнения тестов.
Целочисленные вычисления Вычисления с плавающей точкой Работа с одномерными массивами Вывод текста Вывод графики Работа со строками
7%
13%
10%
53%
51%
27%
SOFTEK IS 1.2 TOBOS TOBOS SOFTEK IS 1.2 SOFTEK IS 1.2 SOFTEK IS 1.2

Выводы

Интерпретаторы. Среди них самым быстрым оказался BASIC 48 — видимо, из-за своей простоты. А вот BASIC 128 оказался медленнее в среднем на 16%. Так что теперь, если вам надо будет написать программу с длительным временем работы, пишите и отлаживайте её на BASIC 128 (это удобнее), а запускайте — в 48-м (это быстрее). Напомню, что для перехода из 128-го Бейсика в 48-й с сохранением программы достаточно подать команду «SPECTRUM».

Интерпретаторы с дополнительными возможностями — BETA BASIC и YS MEGABASIC — хороши, если вы эти возможности используете. А для «обычных» программ превосходства в скорости выполнения они, судя по результатам тестов, не обеспечивают.

Компиляторы. Как и следовало ожидать, они показали существенное (в разы!) превосходство в скорости выполнения программ по сравнению с интерпретаторами. Но для различных компиляторов это превосходство неодинаково. Как видно из диаграммы 2, в среднем SOFTEK FP 1.7 ускоряет выполнение программ вдвое, TOBOS — втрое, а SOFTEK IS 1.2 — вчетверо.

С другой стороны, эти средние данные — наподобие средней температуры по больнице. Как видно из диаграммы 1, степень ускорения очень сильно зависит от конкретной программы, от того, какие операции в ней преобладают. Так, если скорость выполнения целочисленных вычислений удаётся повысить более чем в 10 раз, то вывод текста и графики не получается ускорить хотя бы вдвое. (Это, впрочем, понятно: непосредственно вывод на экран не ускоряется, так как и в откомпилированной, и в интерпретируемой программе для этого просто вызываются соответствующие подпрограммы ПЗУ.)

В общем, о компиляторах можно сказать следующее. SOFTEK FP 1.7 не показал хороших результатов, к тому же он не полностью поддерживает возможности стандартного Бейсика, так что использовать его не рекомендуется. SOFTEK IS 1.2 — лучший выбор для компиляции тех программ, которые ему по силам, учитывая его ограничения. Ну а для компиляции остальных программ остаётся TOBOS.

Литература

  1. Бейсик ZX Spectrum. Москва, VA PRINT, 1993.
  2. Справочник пользователя ZX Spectrum 128К. Москва, VA PRINT, 1993.
  3. Справочник по системным программам для компьютера ZX Spectrum (часть 2). (Выходные данные этой книги, к сожалению, обнаружить не удалось.)
  4. ZX-Ревю 1991. Москва, «Инфорком», 1992.
  5. ZX-Ревю 1992. Москва, «Инфорком», 1993.

Другие мои статьи о Бейсике для ZX Spectrum:

Страница Ивана Рощина > Статьи >