Сравнение быстродействия |
Главная / ЭКВМ / Начинающим |
Полученные результаты можно посмотреть на страницах:
В целом, тесты показывают, что скорость работы МК-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 Аналогичная программа на языке МК приведена ниже. Бенчмарк
В статье [3] приведены итоги сравнения различных ЭВМ по быстродействию с использованием данного теста. Основная часть данных по скорости вычислений взята из [1], [2] и [4] и дополнена из различных источников. Здесь же, для сравнения, приведен результат выполнения теста на МК-152 и МК-161. Таблица 1
Если не выводить надписи "Начало" и "Конец", то время выполнения 1000 циклов на МК-152 будет ровно 17 секунд, на МК-161 около 17,1 с. Таким образом, тестовая задача будет выполнена на МК-152 лишь в 170 раз медленнее, чем на интерпретаторе языка Бейсик на ПЭВМ с процессором Pentium IV 2,4 ГГц в однозадачной ОС. Далее сравним МК-152 и МК-161 с теми моделями ЭВМ, на которых люди выполняли научные, технические и экономические расчеты. Иными словами, строили заводы, электростанции и космические корабли, рассчитывали реакторы и даже управляли плановой экономикой со всем множеством её показателей. Тексты программ в [5] приведены на языках Паскаль и Фортран. Оба этих языка являются компилируемыми, в отличие от языка МК, но в данном случае это не важно. Цель теста - сравнить быстродействие ЭКВМ с ЭВМ, используемыми по своему прямому назначению. Цитата из [5]: Следующий пример простой тестовой программы ("бенчмарк") заимствован из [1]. Её текст был воспроизведён на Алголе-ГДР, Алголе-60, Фортране, Паскале и пропущен на нескольких машинах. Для оценки чистого времени счёта для 1000 циклов по счетчику К программа прогонялась с разными пределами для К. Полученные результаты сведены в таблицу 2. Таблица 2 Время "чистого" счета до К=1000
Ниже приведён текст программы на Паскале и Фортране. Можно самостоятельно проверить и, быть может, уточнить результаты автора. 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
К сожалению, автор статьи не привел данных относительно того, в каком режиме скомпилированы программы. Например, в ряде случаев, видимо, были использованы динамически подключаемые библиотеки и оценивать размер кода без их учета не вполне корректно. Но самое печальное заключается не в этом. Автор забыл упомянуть, что современные компиляторы являются в той или иной степени оптимизирующими. Реально исполняемый код может быть весьма далек от приведенного текста программы на языке высокого уровня. Таблица 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
В результате получаем, что персональный компьютер на базе 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 в таблице. Литература
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |