Сравнение быстродействия


Главная / ЭКВМ / Начинающим

МК-152 и дискета 8 дюймов

В сети неоднократно проводились сравнения МК-152 с различными импортными и советскими микрокалькуляторами, как по скорости выполнения операций, так и по точности вычислений. Поэтому можно подвести некоторые итоги. Здесь пойдет речь о быстродействии.

Полученные результаты можно посмотреть на страницах:

 

В целом, тесты показывают, что скорость работы МК-152 находится на уровне лучших современных калькуляторов и превосходит показатели многих популярных моделей. По разным оценкам, быстродействие ЭКВМ в 70-1300* раз выше, чем у советских ПМК Б3-34, МК-61, МК-52. Скорость вычислений больше и по сравнению с портативными микрокомпьютерами МК-85 и МК-90.

Сравнение проводилось с использованием входных языков пользовательского уровня. В основном эти языки являются интерпретируемыми, как и язык МК. Хотя во многих зарубежных калькуляторах есть возможность загружать программы, предварительно скомпилированные на компьютере, которые выполняются быстрее.

В ЭКВМ принципиально отсутствует возможность загрузки и исполнения программы, составленной на ассемблере внутренней микроЭВМ. Поскольку надежность и предсказуемость поведения для ЭКВМ важнее, чем увеличение её быстродействия. Для задач, на выполнение которых ориентирована ЭКВМ, её скорости достаточно, а играть всё равно удобнее на компьютере или специализированных приставках.

Интересно сравнить быстродействие ЭКВМ не только с калькуляторами, но и с вычислительными машинами, которые ориентированы на решение схожих задач.

Далее приведен тест для ПЭВМ, сочетающий математические действия и операции циклов и переходов с выводом текста. Текст программы приведен в [1] и [2] на языке Бейсик.

 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

Аналогичная программа на языке МК приведена ниже.

Бенчмарк

  x0 x1 x2 x3 x4 x5 x6 x7 x8 x9
0x Cx П 6 4 4 РР П 90 26 К ЭКР К ИП 6 ИП 6
1x 2 ÷ 3 × 4 + 5 - П А ПП
2x 43 5 П 0 ИП 0 П В ИП А К П В FL0 23 ИП 6
3x 1 0 0 0 - F x≥0 08 5 1 РР П
4x 90 26 С/П В/О 8Dh A0h E7h A0h ABh AEh
5x 00h 0Dh 8Ah AEh ADh A5h E6h 00h    

В статье [3] приведены итоги сравнения различных ЭВМ по быстродействию с использованием данного теста. Основная часть данных по скорости вычислений взята из [1], [2] и [4] и дополнена из различных источников. Здесь же, для сравнения, приведен результат выполнения теста на МК-152 и МК-161.

 

Таблица 1

ЭВМ и язык программирования Время, с

Компилируемые языки (Си, Паскаль)
IBM PC/AT, 12 МГц, Turbo Pascal v.6.0 0,0635
IBM PC/AT, 12 МГц, Borland C++ v.2.0 0,2378

Интерпретируемые языки (Бейсик)
IBM PC/AT, Pentium IV, 2,4 ГГц, QBasic 1.1 0,1**
IBM PC/AT, 8 МГц, BASICA 4,9
IBM PC/AT, 8 МГц, TurboBasic (в режиме интерпретатора) 5,0
IBM PC/AT, 12 МГц, GWBASIC 5,0
IBM PC/AT, 8 МГц, GWBASIC 7,5
БК-0010.01, Бейсик 24,5
IBM PC/XT, 4.77 МГц, BASICA 32,2
IBM PC 37
Apple IIe 46
Искра-226 49
Tandy Color 51
Электроника НЦ-80-20 56
"Радио-86РК", 1.77 МГц, Бейсик "Микрон" 92
Epson HX-20 101
СМ-1800 104

ЭКВМ и ПМК
Электроника МК-152 17,16
Электроника МК-161 17,24
Casio FX-702P 1200
Электроника МК-52 8400
Электроника Б3-34 9900

Если не выводить надписи "Начало" и "Конец", то время выполнения 1000 циклов на МК-152 будет ровно 17 секунд, на МК-161 около 17,1 с.

Таким образом, тестовая задача будет выполнена на МК-152 лишь в 170 раз медленнее, чем на интерпретаторе языка Бейсик на ПЭВМ с процессором Pentium IV 2,4 ГГц в однозадачной ОС.

Далее сравним МК-152 и МК-161 с теми моделями ЭВМ, на которых люди выполняли научные, технические и экономические расчеты. Иными словами, строили заводы, электростанции и космические корабли, рассчитывали реакторы и даже управляли плановой экономикой со всем множеством её показателей.

Тексты программ в [5] приведены на языках Паскаль и Фортран. Оба этих языка являются компилируемыми, в отличие от языка МК, но в данном случае это не важно. Цель теста - сравнить быстродействие ЭКВМ с ЭВМ, используемыми по своему прямому назначению.




Цитата из [5]:

Следующий пример простой тестовой программы ("бенчмарк") заимствован из [1]. Её текст был воспроизведён на Алголе-ГДР, Алголе-60, Фортране, Паскале и пропущен на нескольких машинах. Для оценки чистого времени счёта для 1000 циклов по счетчику К программа прогонялась с разными пределами для К. Полученные результаты сведены в таблицу 2.

Таблица 2

Время "чистого" счета до К=1000

ЭВМ и язык программирования Время, с
БЭСМ-6, Фортран-ГДР 0,080
БЭСМ-6, Алгол-ГДР 0,086
БЭСМ-6, Фортран-ДУБНА 0,23
БЭСМ-6, Паскаль 0,24
ЕС 1055М, СВМ, Фортран OE 0,11
ЕС 1055М, СВМ, Фортран VS 0,11
ЕС 1055М, СВМ, Фортран-77 0,22
ЕС 1055М, СВМ, Алгол-68 (стандартные режимы) 0,38
ЕС 1055М, СВМ, Алгол-68 (отключен контроль) 0,17
ЕС 1055М, СВМ, Паскаль 0,42
СМ 1420, Фортран 0,45
ДВК (процессор МС 1201.02), Фортран 0,9
ДВК (процессор МС 1201.02), Паскаль 4,8
ЕС 1840, Турбо-Паскаль 2,5
IBM PC/AT, 16 МГц, Сопроцессор, Турбо-Паскаль 0,37

Ниже приведён текст программы на Паскале и Фортране. Можно самостоятельно проверить и, быть может, уточнить результаты автора.

PROGRAM C (OUTPUT);
LABEL 1,2,3,5;
VAR L,K:INTEGER; A:REAL;
    M:ARRAY [1..5] OF REAL;
BEGIN WRITELN('НАЧАЛО'); K:=0;
1:  K:=K+1; A:=K/2*3+4-5; GOTO 2;
3:  FOR L:=1 TO 5 DO M[L]:=A;
    IF K<1000 THEN GOTO 1;
    GOTO 5;
2:  GOTO 3;
5:  WRITELN('КОНЕЦ');
END

Необходимо отметить, что переход на метку 2 и возврат от неё вверх по тексту к метке 3 есть имитация вызова подпрограммы на Бейсике. Вместе с тем обеспечено участие оператора перехода в затратах времени. Таков смысл использования GOTO 2 и GOTO 3, на первый взгляд, совершенно ненужных. Текст на Фортране в СВМ ЕС:

    REAL *4 M(5)
    PRINT 11,K
11  FORMAT ('НАЧАЛО',18)
    K=0
1   K=K+1
    A=K/2*3+4-5
    GOTO 3
2   DO 4 L=1,5
4   M(L)=A
    IF (K.LT.1000) GOTO 1
    GOTO 5
3   GOTO 2
5   PRINT 12,K
12  FORMAT ('КОНЕЦ',18)
    STOP
    END

Полученные результаты дают представление о соотношении быстродействия разных машин и эффективности систем программирования в плане затрат процессорного времени на вычислительных задачах.

Конец цитаты




Обратим внимание на характерное различие времени выполнения теста на Турбо-Паскале в таблицах 1 и 2. Получается, что IBM PC/AT с частотой 12 МГц работает чуть ли ни в 6 раз быстрее, нежели на частоте 16 МГц. С чем это может быть связано, будет сказано ниже.

Из таблицы [2] можно сделать вывод, что ЭКВМ при решении реальных задач работает приблизительно в 100-200 раз медленнее БЭСМ-6 и в 4-20 раз медленнее ДВК-3 / ДВК-4.

Оценим при помощи того же теста скорость выполнения откомпилированных программ на современных ЭВМ.

Cледует заметить, что к приведенным в таблице 3 данным есть некоторые вопросы. Первый из них - в материалах, взятых из различных источников, есть ошибка в строке с оператором K=K+1, который записан как K=K+L. Одно это уменьшает количество проходов по циклу в пять раз. Поэтому результаты для Microsoft QuickBasic v4.5; Microsoft Visual Basic v6.0 и FreeBASIC v0.15 можно взять под сомнение. Но предположим, что это ошибка возникла только при оформлении статьи и исходные программы составлены корректно.

Таблица взята из [6], в ней приведены данные для IBM PC/AT на базе процессора AMD ATHLON 64 3000+ (1800MHz, 512 k, Socket 939). Количество проходов по циклу K=90000000. Исходные тексты программ есть в статье.

Таблица 3

Компилятор Операционная система Размер EXE файла, байт Время выполнения, c
Microsoft QuickBasic v4.5 DOS \ Windows XP sp2 34488 56,13
Microsoft Visual Basic v6.0 Windows XP sp2 20480 5,12
FreeBASIC v0.15 Windows XP sp2 29184 0,578
PowerBASIC Windows Compiler 7.0 Windows XP sp2 10752 5,14
PureBasic v3.94 Windows XP sp2 5632 0,965
Blitz3D V1.83 Windows XP sp2 1241088 74,94
Microsoft Visual С++ v6.0 Windows XP sp2 192569 4,0
Delphi v7 Windows XP sp2 16896 3,33

К сожалению, автор статьи не привел данных относительно того, в каком режиме скомпилированы программы. Например, в ряде случаев, видимо, были использованы динамически подключаемые библиотеки и оценивать размер кода без их учета не вполне корректно.

Но самое печальное заключается не в этом. Автор забыл упомянуть, что современные компиляторы являются в той или иной степени оптимизирующими. Реально исполняемый код может быть весьма далек от приведенного текста программы на языке высокого уровня.

Таблица 3 показательна в качестве иллюстрации к существующему положению дел. Она свидетельствует, что вполне квалифицированный современный программист порой даже не задумывается о том, что именно он делает.

Простейшие оценки в уме уже могли бы навести на мысль, что здесь что-то не так. Возьмем данные по FreeBASIC. За 0,5 секунды процессор с частотой 1800 МГц делает 900 миллионов тактов. Значит на каждый из 90 миллионов циклов должно приходиться всего по 10 тактов процессора. В это количество, напомним, должны уместиться вычисления с плавающей точкой, внутренний цикл по элементам массива и обращение к подпрограмме. Без учета того, что программа запущена в многозадачной среде, то есть ее выполнение периодически прерывается ОС, и того, что в программе есть операторы и вне цикла. Поэтому, несмотря на распараллеливание операций, 10 тактов - это слишком мало.

Для начала составим программу, которая позволит реально оценить быстродействие современных компьютеров. Это слегка измененная программа из [3]. Выражение разбито на ряд операторов, чтобы исключить оптимизацию до 1.5*k-1.

#include <stdio.h>
void subr(void);
void main (void)
{
long k;
int l;
float a,m[5];
printf("Start\r\n");
k=0;
do {
    k=k+1;
    a=(float)k;
    a/=2;
    a*=3;
    a+=4;
    a-=5;
    subr();
    for (l=0; l<5; l++) m[l]=a;
    }
    while (k<90000000);
printf("Stop\r\n");
}
void subr(void)
{
return;
}

Программа написана на Си, хотя не имеет значения, на каком языке ее составлять, лишь бы в компиляторе можно было полностью отключить оптимизацию. Полученный откомпилированный код должен на ассемблере выглядеть приблизительно так, как указано ниже (далее приведены части программы от одного оператора печати до другого).

	...
	mov	word ptr [bp-26],0
	mov	word ptr [bp-28],0
@4:
	mov	dx,word ptr [bp-26]
	mov	ax,word ptr [bp-28]
	add	ax,1
	adc	dx,0
	mov	word ptr [bp-26],dx
	mov	word ptr [bp-28],ax
	mov	dx,word ptr [bp-26]
	mov	ax,word ptr [bp-28]
	push	dx
	push	ax
	FILD	dword ptr [bp-34]
	FWAIT	
	add	sp,4
	FSTP	dword ptr [bp-24]
	FWAIT	
	FLD	dword ptr [bp-24]
	FDIV	qword ptr DGROUP:s@+17
	FSTP	dword ptr [bp-24]
	FWAIT	
	FLD	dword ptr [bp-24]
	FMUL	qword ptr DGROUP:s@+25
	FSTP	dword ptr [bp-24]
	FWAIT	
	FLD	dword ptr [bp-24]
	FADD	qword ptr DGROUP:s@+33
	FSTP	dword ptr [bp-24]
	FWAIT	
	FLD	dword ptr [bp-24]
	FSUB	qword ptr DGROUP:s@+41
	FSTP	dword ptr [bp-24]
	FWAIT	
	call	far ptr _subr
	xor	si,si
	jmp	short @8
@7:
	mov	dx,word ptr [bp-22]
	mov	ax,word ptr [bp-24]
	mov	bx,si
	shl	bx,1
	shl	bx,1
	lea	cx,word ptr [bp-20]
	add	bx,cx
	mov	word ptr [bx+2],dx
	mov	word ptr [bx],ax
@6:
	inc	si
@8:
	cmp	si,5
	jl	@7
@5:
@2:
	cmp	word ptr [bp-26],1373
	jge	@10
	jmp	@4
@10:
	jne	@9
	cmp	word ptr [bp-28],19072
	jae	@11
	jmp	@4
@11:
@9:	...

Нетрудно заметить, что цикл от метки @4 до @11 выполняется 90000000 раз и включает все требуемые операторы, в том числе вложенный цикл от @7 до @5.

Оценки, выполненные при помощи этой программы, показывают следующее быстродействие IBM-совместимых компьютеров. Программа, часть из которой приведена выше, имеет полную длину 21760 байта и была запущена на перечисленных ЭВМ из-под различных операционных систем, совместимых с MS-DOS. Оценки времени усреднены по результатам трех запусков. Для исключения влияния многозадачности использованы однозадачные ОС.

Таблица 4

ЭВМ Операционная система Время выполнения, c
AMD K5; 75 МГц PTS-DOS 32 240,0
Pentium III; 866 МГц PTS-DOS 32 18,4
Celeron; 2,5 ГГц FreeDOS (kernel 1.1.35) 21,5
Pentium IV; 2,4 ГГц FreeDOS (kernel 1.1.35) 22,3

В результате получаем, что персональный компьютер на базе Pentium IV (2,4 ГГц) по результатам этого теста приблизительно в 320 раз быстрее БЭСМ-6, в 440 раз быстрее ЕС-1055 и в 3600 раз быстрее ДВК. То, что решалось на ДВК-3 за час, на Pentium IV займет секунду и это уже радует.

Вариант того же кода для 32-разрядных команд должен выглядеть примерно так.

	mov	 DWORD PTR _k$[ebp], 0
$L910:
	mov	 eax, DWORD PTR _k$[ebp]
	add	 eax, 1
	mov	 DWORD PTR _k$[ebp], eax
	fild	 DWORD PTR _k$[ebp]
	fst	 DWORD PTR _a$[ebp]
	fdiv	 DWORD PTR __real@4@40008000000000000000
	fst	 DWORD PTR _a$[ebp]
	fmul	 DWORD PTR __real@4@4000c000000000000000
	fst	 DWORD PTR _a$[ebp]
	fadd	 DWORD PTR __real@4@40018000000000000000
	fst	 DWORD PTR _a$[ebp]
	fsub	 DWORD PTR __real@4@4001a000000000000000
	fstp	 DWORD PTR _a$[ebp]
	mov	 DWORD PTR _l$[ebp], 0
	jmp	 SHORT $L914
$L915:
	mov	 ecx, DWORD PTR _l$[ebp]
	add	 ecx, 1
	mov	 DWORD PTR _l$[ebp], ecx
$L914:
	cmp	 DWORD PTR _l$[ebp], 5
	jge	 SHORT $L916
	mov	 edx, DWORD PTR _l$[ebp]
	mov	 eax, DWORD PTR _a$[ebp]
	mov	 DWORD PTR _m$[ebp+edx*4], eax
	jmp	 SHORT $L915
$L916:
	call	 ?subr@@YAXXZ
	cmp	 DWORD PTR _k$[ebp], 90000000 ; 055d4a80H
	jl	 SHORT $L910

Запуск на Celeron-M520 1,6 ГГц дает время работы 4,5 с (консольное приложение без оптимизации, размер программы 49152 байта). Это подтверждает оценку из таблицы 3 для Visual C++. То есть, использование 32-разрядного кода ускоряет время выполнения на процессоре класса i686 как минимум в 5 раз.

Посмотрим, как влияет оптимизация кода на скорость выполнения программы. Исходная программа была откомпилирована на компиляторе Watcom. Дизассемблированный код программы без оптимизации похож на предыдущий. После включения оптимизации код выглядит следующим образом.

	xor	edx,edx
L1:
	inc	edx
	mov	[esp][00018],edx	
	fild	[esp][00018]
	fmul	[esp][00014]
	fmul	[esp][00018]
	fadd	[esp][0001C]
	fadd	[esp][00020]
	xor	eax,eax
	fstp	[esp][00014]
	mov	ecx,[esp][00014]
L2:
	add	eax,04
	mov	[esp][eax][0FFFC],ecx
	cmp	eax,14
	jne	L2
	cmp	edx,055D4A80	

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

При запуске на Pentium IV под однозадачной ОС скорости выполнения приведенных программ составляли соответственно 12,9 и 2,1 секунды. Но последний результат уже нельзя считать полностью правильным из-за отсутствия обращения к подпрограмме. Можно считать, что минимальное время выполнения программы на ассемблере для Pentium IV 2,4 ГГц должно быть порядка 3 секунд. Время выполнения программы за счет оптимизации кода уменьшилось с 22 до 3 секунд.

Заодно посмотрим, как выглядит хорошо оптимизированный код той же программы. Откомпилируем ее для ОС GNU/Linux при помощи gcc (версия 4.0.2) с оптимизацией по умолчанию. Файл без библиотек имеет длину 4736 байт. При запуске откомпилированного ELF-файла эта программа выполняется на Pentium IV значительно меньше, чем за секунду. Что и не удивительно.

039A: 31D2		xor 	edx,edx
039C: 83C410		add	esp,10
039F: 90		nop
03A0: 42		inc	edx
03A1: B805000000	mov	eax,00000005
03A6: 89F6		mov	esi,esi
03A8: 48		dec	eax
03A9: 75FD		jne	03A8
03AB: 81FA804A5D05	cmp	edx,055D4A80
03B1: 75ED		jne	03A0
03B3: ...

Весь цикл по K состоит из инкремента счетчика по адресу 03A0 и цикла по L. Внутренний цикл по L - из декремента по адресу 03A8. Остальное было выброшено компилятором.

Таким образом, компьютер на базе Pentium IV, при полном использовании его возможностей, примерно в 2400 раз быстрее БЭСМ-6. Конечно, за последние полвека произошло существенное увеличение скорости работы ЭВМ, но вряд ли стоящее бесконечных восторгов по этому поводу.




Выводы

Если делать сравнения, ЭКВМ "Электроника МК-152" и "Электроника МК-161" занимают вполне достойное место среди программируемых калькуляторов, приблизительно в 150-200 раз медленнее современных ПЭВМ при выполнении ими программы в среде интерпретатора и сравнима по скорости выполнения операций с большими ЭВМ 60-70-х и ПЭВМ 80-90-х годов.

По результатам тестов, скорость работы портативной ЭКВМ "Электроника МК-161" приблизительно на 2,5% меньше, чем у МК-152, что вызвано наличием постоянно работающего АЦП.

При переходе от интерпретатора языка Бейсик к компилятору скорость работы ЭВМ увеличивается в 400-3500 раз. Примерно такого же увеличения скорости выполнения на МК-152 и МК-161 можно достичь, записав программу на ассемблере встроенной микроЭВМ.

Очевидно, что для задач, требующих большой вычислительной мощности, разумнее использовать современные быстродействующие компьютеры.

Пользой от знакомства с ЭКВМ для современных программистов может являться лучшее понимание, как работает компьютер на низком уровне, что позволило бы избежать появления программ, подобных описанным выше. Изучение ассемблера в этом смысле ещё более полезно, но и более трудоёмко.




Примечание

 

* Чем больше сложных математических функций в тексте программы, тем меньше различие в быстродействии между МК-152 и советскими ПМК. Увеличение скорости вычислений более заметно при операциях с памятью, циклах и переходах.

Вернуться к тексту

 

** Тест выполнялся для K=90000000, время работы интерпретатора составило 2 часа 36 минут. Значение 0,1 сек - это время, деленное на 90000, для сравнения с К=1000 в таблице.

Вернуться к тексту




Литература

  1. Черемных C.В.. Гиглавый А.В., Поляк Ю.Е. От микропроцессоров к персональным ЭВМ - М.:Радио и связь. 1988.- 288 с., илл. - С. 93.
  2. Очков В.Ф., Хмелюк В.А. От микрокалькулятора к персональному компьютеру. - М.:Издательство МЭИ. 1990. - 224 с.
  3. Жевак А.А. Оценка производительности БК, и не только //Персональный компьютер БК-0010, N1-93 - C. 125
  4. Хмелюк В.А Самый маленький и самый персональный //Вычислительная техника и ее применение, N2. - М.: Знание, 1992.
  5. Попков А.И. Введение в практическую информатику. - Томск: Радио и связь, Томское отделение, 1990. 160 с.: ил. - (Массовая радиобиблиотека. Вып. 1163) - С. 20-21.
  6. Крячко Виталий. О бедном Basic замолвите слово - http://www.vbnet.ru/articles/showarticle.aspx?id=220 - 15 июня 2006 г.

НПП "СЕМИКО" (383) 271-01-25 (многоканальный)