Быстродействие языков тест2

 
+
-
edit
 

Balancer

администратор
★★★★★
Надыбыл тут F# и захотелось его сравнить по скорости с прочими. Функцию Аккермана из предыдущего тестирования (от 3,8,8) он не потянул, так что слепил тупо 40-е число Фибоначчи. Что вышло:
SP[color=#808030; ]-[/color]Forth [color=#008c00; ]4[/color] Build [color=#008c00; ]8[/color]  [color=#008c00; ]3.[/color]7сек O'Caml [color=#008c00; ]3.07[/color]        [color=#008c00; ]4.3[/color] C[color=#808030; ]+[/color][color=#808030; ]+[/color] [color=#808030; ]([/color]VC7[color=#808030; ])[/color]          [color=#008c00; ]4.5[/color] C#                  [color=#008c00; ]5.2[/color] Java2 [color=#008c00; ]1.4[/color][color=#008c00; ].1[/color]        [color=#008c00; ]5.4[/color] F# [color=#008c00; ]0.6[/color][color=#008c00; ].4[/color][color=#008c00; ].1[/color]          [color=#008c00; ]5.[/color]5сек Haskell [color=#808030; ]([/color]ghc5[color=#008c00; ].02[/color][color=#008c00; ].3[/color][color=#808030; ])[/color] 1мин 29сек для честного рекрсивного или [color=#008c00; ]0.[/color]04сек для [color=#0000e6; ]"нечестного"[/color] приёма
Created with colorer-take5 library. Type 'text'


Нечестный приём Хаскелла связан с его ленивыми вычислениями:
fibz [color=#808030; ]=[/color] [color=#008c00; ]1[/color] [color=#808030; ]:[/color] [color=#008c00; ]1[/color] [color=#808030; ]:[/color] [color=#808030; ][[/color] x[color=#808030; ]+[/color]y [color=#808030; ]|[/color] [color=#808030; ]([/color]x[color=#008c00; ],[/color]y[color=#808030; ])[/color] [color=#808030; ]
Created with colorer-take5 library. Type 'text'


Код F# практически не отличается от O'Caml:
open System [color=#808030; ]let[/color] rec fib n [color=#808030; ]=[/color] if n[color=#808030; ]then [color=#008c00; ]1[/color] else fib[color=#808030; ]([/color]n[color=#808030; ]-[/color][color=#008c00; ]1[/color][color=#808030; ])[/color] [color=#808030; ]+[/color] fib[color=#808030; ]([/color]n[color=#808030; ]-[/color][color=#008c00; ]2[/color][color=#808030; ])[/color][color=#808030; ];[/color][color=#808030; ];[/color] [color=#808030; ]let[/color] [color=#808030; ]_[/color] [color=#808030; ]=[/color] Console[color=#008c00; ].[/color]WriteLine[color=#808030; ]([/color]fib[color=#808030; ]([/color][color=#008c00; ]40[/color][color=#808030; ])[/color][color=#808030; ])[/color][color=#808030; ];[/color]
Created with colorer-take5 library. Type 'sml'


Программы очень компактные. Скажем, эта - 2.5кб (Оно и понятно - .NET)
 
Это сообщение редактировалось 19.01.2004 в 15:19
BG Реконструктор #19.01.2004 15:23
+
-
edit
 
Кинь "нечестную" exe-шку. Чтобы была база для сравнения.
 
+
-
edit
 

Balancer

администратор
★★★★★
Лови. Правда, 130кб архив - автономный exe-шник весит 454кБ.
(Для других - это которая считает на Хаскелле все знаки 1000-го числа Фибоначчи)
Прикреплённые файлы:
 
 
BG Реконструктор #19.01.2004 15:58
+
-
edit
 
Гм, результат выдаёт, а вот время - нет.
 
+
-
edit
 

Balancer

администратор
★★★★★
Resurrector, 19.01.2004 16:58:12:
Гм, результат выдаёт, а вот время - нет.
 

А зачем? У меня в FAR Manager'е всюду стоит timer-плагин.
Пишешь в командной строке timer: команда - он показывает время её выполнения
 
BG Реконструктор #19.01.2004 16:25
+
-
edit
 
Balancer, 19.01.2004 15:11:04:
Resurrector, 19.01.2004 16:58:12 :
Гм, результат выдаёт, а вот время - нет.
 


А зачем? У меня в FAR Manager'е всюду стоит timer-плагин.
Пишешь в командной строке timer: команда - он показывает время её выполнения
 

Очень и очень грубо. Тем более, что exe-шник весит полмеги. <_> Какая-нибудь возможность связи с Win32 API?
 
+
-
edit
 

Balancer

администратор
★★★★★
Resurrector, 19.01.2004 17:25:16:
Очень и очень грубо. Тем более, что exe-шник весит полмеги. <_> Какая-нибудь возможность связи с Win32 API?
 

Ну, смотри. Делаю "ничегонеделающий" exe-шник, просто печатающий число. Время работы - 0.05 сек. Я же привожу результаты с точностью до 0.1сек. Так что - в пределах погрешности

Кстати, о бОльшей точности. Упустил я как-то - за счёт чего в виндах системный таймер разогнан до частоты выше стандартных 14.31818/12/65536 МГц = 18.2Гц? (как раз 0.055 сек на такт). Т.е. нынче в железе стоит отдельный таймер, или стандартный разогнан, а для старых приложений эмулируется?
 
BG Реконструктор #19.01.2004 16:44
+
-
edit
 
>Ну, смотри. Делаю "ничегонеделающий" exe-шник, просто печатающий число. Время работы - 0.05 сек. Я же привожу результаты с точностью до 0.1сек. Так что - в пределах погрешности

Не-а, не подходит. Хотя-бы связь с dll?

>Кстати, о бОльшей точности. Упустил я как-то - за счёт чего в виндах системный таймер разогнан до частоты выше стандартных 14.31818/12/65536 МГц = 18.2Гц? (как раз 0.055 сек на такт). Т.е. нынче в железе стоит отдельный таймер, или стандартный разогнан, а для старых приложений эмулируется?

Что-то у тебя очень старая инфа. Я помню те 18.2Гц, но аритметику их получения я так и не узнал. На сегодняшний ден даже в тупых микроконтроллерах можно можно разогнать таймер до частоты кварца.
 
+
-
edit
 

Balancer

администратор
★★★★★
Resurrector, 19.01.2004 17:44:15:
Не-а, не подходит. Хотя-бы связь с dll?
 

При чём тут DLL? Это статический exe-шник. А если ты про линковку с системными DLL - то, как я уже сказал, минимальая программа, что-то выводящая, выполняется за 0.05сек (или меньше - похоже, это минимальная точность плагина, меньше, чем 0.050 он не показывает).

>Что-то у тебя очень старая инфа. Я помню те 18.2Гц, но аритметику их получения я так и не узнал. На сегодняшний ден даже в тупых микроконтроллерах можно можно разогнать таймер до частоты кварца.

При чём тут микроконтроллеры? На XT стоял 8051-й таймер. Начиная с чипсетов он шёл уже встроенный, но всегда - отдельным встроенным модулем. Процессор на XT тактировался от кварца на 14.31818МГц. Частота с кварца делилась на 12 и подавалась на вход таймера. Там он на XT делился на максимальный коэффициент 65536 и в таком виде использовался.

Программно коэффициент можно уменьшать, но это ведёт к двум неприятным вещам. Нарушается синхронизация всего, что работает от таймера (обычно - операционка, на играх, порой, на это забивали) и растут накладные расходы на обработку прерываний таймера. Одно дело - обработать его 18 раз в секунду, другое - 10000 раз. Напомню, что прерывания и на сегодня очень ресурсоёмкая вещь. Переведи винт в режим PIO и сравни скорость системы с DMA

Вот потому и интересно. Судя по тому, что DOS на современных машинах работает как и раньше, для винды в новых чипсетах или новый таймер поставили, при чём "умный", не дёргающий систему прерываниями, а сам считающий время (CMOS RTC расширили?) или же система, всё же, стандартный перепрограммирует, а для софта старые параметры таймера эмулирует?

К сожалению, я зыбал уже команды замены коэффициента деления, чтобы с debug'ом вручную с таймером сейчас поиграть
 
RU Кирилл #20.01.2004 08:15
+
-
edit
 

Кирилл

втянувшийся

Судя по некоторым настройкам W2K - эмулирует (для ДОС программ).
- Сами понимаете, вселенная-то на моей стороне.
- Вот это мне таким вульгарным и кажется.
 

Zeus

Динамик

Balancer, 20.01.2004 00:01:12 :
При чём тут микроконтроллеры? На XT стоял 8051-й таймер. Начиная с чипсетов он шёл уже встроенный, но всегда - отдельным встроенным модулем. Процессор на XT тактировался от кварца на 14.31818МГц. Частота с кварца делилась на 12 и подавалась на вход таймера. Там он на XT делился на максимальный коэффициент 65536 и в таком виде использовался.

Программно коэффициент можно уменьшать, но это ведёт к двум неприятным вещам. Нарушается синхронизация всего, что работает от таймера (обычно - операционка, на играх, порой, на это забивали) и растут накладные расходы на обработку прерываний таймера. Одно дело - обработать его 18 раз в секунду, другое - 10000 раз. Напомню, что прерывания и на сегодня очень ресурсоёмкая вещь. Переведи винт в режим PIO и сравни скорость системы с DMA

Вот потому и интересно. Судя по тому, что DOS на современных машинах работает как и раньше, для винды в новых чипсетах или новый таймер поставили, при чём "умный", не дёргающий систему прерываниями, а сам считающий время (CMOS RTC расширили?) или же система, всё же, стандартный перепрограммирует, а для софта старые параметры таймера эмулирует?

К сожалению, я зыбал уже команды замены коэффициента деления, чтобы с debug'ом вручную с таймером сейчас поиграть :)
 


Ох я в свое время этим наигрался! :ph34r: Когда системы реального времени на РС пытался делать...

1. Сигнал на 1.19 МГц как был, так и есть. Но! На Р4/i850 (по крайней мере) его, вроде бы, увеличили где-то до 4 Мгц. Сейчас нет под рукой Р4, чтобы проверить, но почти уверен.

2. Этот сигнал накручивает 8-байтовый аппаратный (по всей видимости) счетчик. Прочитать его можно командой API QueryPerformanceCounter (а узнать частоту - QueryPerformanceFrequency). Именно этой штукой лучше всего измерять производительность.

3. Двухбайтовый делитель, который по умолчанию 0 (он же 65536) тоже работает и существует аппаратно. Но самое интересное, действительно, что при попытке изменить его из ДОС-сессии (из Виндовса никто его изменить не даст) изменение работает! И работа Вин не нарушается! И это верно как для Вин9х, так и для NT. Хотя поведение самой ДОС-программы, насколько помню, различное; вроде бы, в 9х прерывания идут неравномерно... Или даже не меняются... Блин, уже забыл! В общем, с 9х я много не возился, все равно там все плохо было В ДОС-сессии NT вроде даже время нарушается, как положено.

4. Как это реализуется - без понятия. Но есть еще одно наблюдение. Самый обычный таймер в виндовсе, по которому многие и ориентируются, т.е. получаемый по GetTickCount и который считает якобы милисекунды, приводится в основном от того же 18.2 Гц таймера. "В основном" - потому что он использует всякое внешнее событие для обновления, например, движение мыши или нажатие на клавиатуру. Но если ничего не происходит, обновляться он будет лишь с частотой 18.2 Гц. Впрочем, в милисекунды он пересчитывает правильно. На этот таймер нередко вешают всякие события, условия завершения потоков и т.п., что порой оканчивается плачевно, если нужна хоть мало-мальская точность...
И животноводство!  

Zeus

Динамик

Balancer, 20.01.2004 01:01:12:
К сожалению, я зыбал уже команды замены коэффициента деления, чтобы с debug'ом вручную с таймером сейчас поиграть
 

Попалась мне под руку старая программа с таймером. Значится, коэф. деления задается так:

1. в порт 43h пишем 36h
2. в порт 40h пишем младший байт делителя
3. сразу же в тот же порт 40h пишем старший байт делителя. (По умолчанию оба байта 0, т.е. делитель равен 65536)

Обработчик можно повесить на 8-е прерывание. А можно просто по системным часам смотреть
И животноводство!  
+
-
edit
 

Balancer

администратор
★★★★★
Результат обескураживающий.

Запустил две дос-сессии.
В одной ускорил время раза в четыре (записал 4040 вместо (1)0000). Во второй, чуть позже - 2020 (практически - в 8 раз быстрее). В результате часы в DOS-сессиях идут примерно в положенное число раз быстрее, а системные виндовые часы (время в трее) идут на глаз раза в полтора быстрее, но если сверить с внешним источником времени - то точно. Такое впечатление, что каждые 5 сек. часы "притормаживают". Возможно, считывается время из RTC. Т.е. 4 секунды проскакивают быстро, а пятая - всё тормозит

Анимация GIF'оа ускорилась

Бред какой-то

Пока писал, часы в DOS убежали вперёд от виндовых на полчаса
 

Zeus

Динамик

Почему обескураживающий? Этого и следовало ожидать
И животноводство!  

TEvg

аксакал

админ. бан
Надо ребята RDTSC пользоваться. Много раз проще и точнее.
 

Zeus

Динамик

TEvg, 29.01.2004 19:18:09:
Надо ребята RDTSC пользоваться. Много раз проще и точнее.
 

Это только для измерения, события по нему запустишь. Да и работает только с Pentium. А мне вот приходилось и на 486 делать (вся машина и была связкой между сетью и оборудованием).
И животноводство!  
+
-
edit
 

Balancer

администратор
★★★★★
Zeus, 29.01.2004 07:54:39:
Почему обескураживающий? Этого и следовало ожидать
 

Следовало ожидать, что или вся система будет работать в одном времени, или каждая задача в своём, а система - пофиг (это если эмуляция). Наблюдается же, что ДОС-сессии работают каждая в своём времени, но и учёт времени в системе тоже наружен

И тогда там более встаёт остро вопрос миллисекундных единиц измерения времени
 
+
-
edit
 

trainer

втянувшийся

Упустил я как-то - за счёт чего в виндах системный таймер разогнан до частоты выше стандартных 14.31818/12/65536 МГц = 18.2Гц? (как раз 0.055 сек на такт). Т.е. нынче в железе стоит отдельный таймер, или стандартный разогнан, а для старых приложений эмулируется?
 
Там и надо то, что другое значение инициализации в PIT загнать.
На XT стоял 8051-й таймер
 
8051 - это микроконтроллер. PIT(программируемый интервальный таймер) - это 8253.
Судя по тому, что DOS на современных машинах работает как и раньше, для винды в новых чипсетах или новый таймер поставили, при чём "умный", не дёргающий систему прерываниями, а сам считающий время (CMOS RTC расширили?)
 
PIT - это одно, а RTC - это другое.
Сигнал на 1.19 МГц как был, так и есть. Но! На Р4/i850 (по крайней мере) его, вроде бы, увеличили где-то до 4 Мгц. Сейчас нет под рукой Р4, чтобы проверить, но почти уверен
 
Под Win9x вроде 1.19 МГц, под WinNT - вроде в 4 раза больше(4.77 МГц)
Во имя Ctrl, Alt и святаго Del. Enter!
 
Это сообщение редактировалось 13.02.2004 в 20:45
+
-
edit
 

varban

администратор
★★★★
Рома> И тогда там более встаёт остро вопрос миллисекундных единиц измерения времени

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

Вында хороша в качестве вычислителя, визуализатора и в качестве пульта управления.

Управление системы реального времени возложили микроконтроллеру, чуть умнее программатора стиральной машинки Вятка-автомат 12

И еще один, побочный (но важный!) эффект: компьютер не подлежит метрологической поверки (не есть средство измерения), а таймер - очень даже.
Метрологи счастливы, а мы довольны, что меряем правильно.
 
BG Реконструктор #15.02.2004 02:11
+
-
edit
 
Zeus, 20.01.2004 08:57:56:
4. Как это реализуется - без понятия. Но есть еще одно наблюдение. Самый обычный таймер в виндовсе, по которому многие и ориентируются, т.е. получаемый по GetTickCount и который считает якобы милисекунды, приводится в основном от того же 18.2 Гц таймера. "В основном" - потому что он использует всякое внешнее событие для обновления, например, движение мыши или нажатие на клавиатуру. Но если ничего не происходит, обновляться он будет лишь с частотой 18.2 Гц. Впрочем, в милисекунды он пересчитывает правильно. На этот таймер нередко вешают всякие события, условия завершения потоков и т.п., что порой оканчивается плачевно, если нужна хоть мало-мальская точность...
 

Считает он сотые доли секунды. Рекомендую посмотреть на результат такой вот программы:

#include [color=#0000e6; ]"stdafx.h"[/color] #include [color=#808030; ]<[/color]windows[color=#008c00; ].[/color]h[color=#808030; ]>[/color] int main[color=#808030; ]([/color]int argc[color=#808030; ],[/color] char[color=#808030; ]*[/color] argv[color=#808030; ][[/color][color=#808030; ]][/color][color=#808030; ])[/color] [color=#808030; ]{[/color]     for[color=#808030; ]([/color]long i[color=#808030; ]=[/color][color=#008c00; ]0[/color][color=#808030; ];[/color] i[color=#808030; ]<[/color][color=#008c00; ]100[/color][color=#808030; ];[/color] i[color=#808030; ]+[/color][color=#808030; ]+[/color][color=#808030; ])[/color]     [color=#808030; ]{[/color]         printf[color=#808030; ]([/color][color=#0000e6; ]"%d\n"[/color][color=#808030; ],[/color] GetTickCount[color=#808030; ]([/color][color=#808030; ])[/color][color=#808030; ])[/color][color=#808030; ];[/color]         Sleep[color=#808030; ]([/color][color=#008c00; ]1[/color][color=#808030; ])[/color][color=#808030; ];[/color]     [color=#808030; ]}[/color]     return [color=#008c00; ]0[/color][color=#808030; ];[/color] [color=#808030; ]}[/color]
Created with colorer-take5 library. Type 'text'
 
+
-
edit
 

Balancer

администратор
★★★★★
Resurrector, 15.02.2004 02:11:23:
Рекомендую посмотреть на результат такой вот программы:
 

main.cpp(1) : fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory

 
+
-
edit
 

trainer

втянувшийся

Balancer, 15.02.2004 02:14:14:
main.cpp(1) : fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory

 

Нормальный результат. Как и было задумано.

Его надо выкинуть, а добавить еще stdio.h
Во имя Ctrl, Alt и святаго Del. Enter!
 
+
-
edit
 

Balancer

администратор
★★★★★
trainer, 15.02.2004 13:45:18:
Его надо выкинуть, а добавить еще stdio.h
 

[color=#008c00; ]235910401[/color] [color=#008c00; ]235910401[/color] [color=#008c00; ]235910401[/color] [color=#008c00; ]235910401[/color] [color=#008c00; ]235910401[/color] [color=#008c00; ]235910401[/color] [color=#008c00; ]235910401[/color] [color=#008c00; ]235910401[/color] [color=#008c00; ]235910401[/color] [color=#008c00; ]235910401[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910411[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910421[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910431[/color] [color=#008c00; ]235910441[/color] [color=#808030; ].[/color][color=#808030; ].[/color][color=#808030; ].[/color]
Created with colorer-take5 library. Type 'text'
 
BG Реконструктор #16.02.2004 13:26
+
-
edit
 
Совершенно очевидно - счетчик увеличивается на 10 каждые 10 миллисекунд. :)
 
BG Реконструктор #16.02.2004 13:31
+
-
edit
 
Совершенно очевидно - счетчик увеличивается на 10 каждые 10 миллисекунд. :)
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru