Что нового

Производительность Autoit вс другие ЯП

Olorin

Новичок
Сообщения
28
Репутация
0
Навеяно темой http://habrahabr.ru/blogs/programming/66562/

Код:
$r = 0
for $i = 0 to  10000
    for $j = 0 to 10000
        $r = ($r + ($i * $j) / 100) / 47
    Next
Next

Не совсем понял что за % деление идет в других ЯП, по этому сравнивая с php оставил просто /.

Такой цикл на компе с Celeron S478 2Ghz выполняется где то полчаса, а на пхп меньше минуты, из-за чего такая дискриминация ?
И сравнив результаты вычислений они почему то отличаются :scratch:

Но потом пришля мылся извращнуться и разбить этот цикл на несколько маленьких (1 от 0 до 2000, 2 от 2000 до 4000 и так до 10000) быстрота выполнения возросла в разы.

На Феноме 2 цикла расчитались за 70 секунд, 10 циклов за 30.
Почему нельзя обойтись 1м циклом.
И почему ответы в php и autoit Разные?? ))

OffTopic:
Ну можно и дальше извращнуться и раскидать это по всем ядрам и пхп будет нервно курить в сторонке
 
Автор
O

Olorin

Новичок
Сообщения
28
Репутация
0
Многопоточность нет, но ничто не мешает запустить отдельный процесс, на каждое ядро по процессу и все будет :ok:

Код:
AutoIt3.exe [/ErrorStdOut] [/AutoIt3ExecuteScript] file [params ...]
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
Запустил у себя, по результатам отпишусь :smile:


Добавлено:
Сообщение автоматически объединено:

Такой код:
Код:
$t = TimerInit()
$r = 0
for $i = 0 to  10000
    for $j = 0 to 10000
        $r = ($r + ($i * $j) / 100) / 47
    Next
Next

MsgBox(0,0,TimerDiff($t)/1000&@CR&$r)

Результат:
$t = 141.328037796302
$r = 21739.0831758034



Добавлено:
Сообщение автоматически объединено:

Core i7 Q720 @ 160GHz
4гб ОЗУ
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 596
Репутация
938
У меня воляется старенький 4 ядерный 3.3 GHz проц, вот бы на нем потестить, да материнки нету подходящей :(
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Olorin [?]
Не совсем понял что за % деление идет в других ЯП, по этому сравнивая с php оставил просто /.
modulo - деление с остатком, возвращается остаток
Код:
$a = 11
$b = 3
;Делим 11 на 3
ConsoleWrite(Int($a/$b) & @LF) ;3 целых
ConsoleWrite(Mod($a, $b) & @LF) ;2 в остатке ( 11 % 3 )
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
А зачем тестировать, оформите в виде .dll и запускайте из AutoIt.

Код:
ProcedureDLL.f Calc()
	r.f = 0
	For i = 0 To 10000
		For j = 0 To 10000
			r = (r + (i * j) / 100) / 47
		Next
	Next
	ProcedureReturn r
EndProcedure
Код:
$Timer = TimerInit()
$Result = DllCall('calc.dll', 'float', 'Calc')
MsgBox(0, '', 'Время: ' & StringFormat('%.3f сек', TimerDiff($Timer) / 1000) & @CR & 'Результат: ' & $Result[0])


1.336 сек
 

Arei

Скриптер
Сообщения
938
Репутация
115
204.196535098891
21739.0831758034


Система
--------------------------------------------------------------------------------

Производитель ECS
Модель IC780M-A
Суммарный объем системной памяти 2,00 ГБ ОЗУ
Тип системы 32-разрядная операционная система
Число ядер процессора 2
64-разрядная поддержка Да

Хранилище
--------------------------------------------------------------------------------

Суммарный объем жестких дисков 1313 ГБ
Раздел диска (C:smile: 79 ГБ свободно (133 ГБ всего)
Раздел диска (D:smile: 53 ГБ свободно (100 ГБ всего)
Раздел диска (E:smile: 1 ГБ свободно (149 ГБ всего)
Диск носителя (F:smile: Компакт-диск/DVD
Диск носителя (G:smile: Компакт-диск/DVD
Раздел диска (K:smile: 872 ГБ свободно (932 ГБ всего)

Графика
--------------------------------------------------------------------------------

Тип видеоадаптера NVIDIA GeForce 9600 GT
Общий размер доступной памяти видеоадаптера 1791 МБ
Используемая видеопамять 1024 МБ
Используемая системная память 0 МБ
Общая системная память 767 МБ
Версия драйвера видеоадаптера 8.17.12.8538
Разрешение основного монитора 1920x1080
Версия DirectX DirectX 10
 
Автор
O

Olorin

Новичок
Сообщения
28
Репутация
0
Код:
$t = TimerInit()
$r = 0
for $i = 0 to  10000
    for $j = 0 to 10000
		$z = Mod(($i * $j), 100)
        $r = Mod(($r + $z), 47)
    Next
Next

MsgBox(0,0,TimerDiff($t)/1000&@CR&$r)


Переделал код для деления с остатком, спасибо dwerf!

Ответ совпал с ответом в пхп, 39 и время выполнения 426 секунд на проце Phenom 920.

I7-860
А на стареньком Целероне 900 мегагерц - 525 секунд
Фигасе как i7 быстрее Phenom.
Чето этот старенький целерон пыхтит как мой новенький феник. Да и Celeron 2Ghz не выдавал таких результатов. Что-то странно как то.

Видимо из-за разных вещественных типов.
Ну везде же вроде integer используется.

А зачем тестировать, оформите в виде .dll и запускайте из AutoIt.
Это код ПуреБасика? Ну мы же тестируем просто язык, а не связки.

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

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 713
Olorin сказал(а):
Почему у меня так долго выполняется данный код, и если разбить этот цикл на несколько маленьких то он выполниться в разы быстрее.
Видимо вы ошиблись при разбивке цикла. Вот пример:

Код:
For $n = 1 To 8
	$i = 10 ^ $n
	$Timer = TimerInit()
	For $j = 1 To $i

	Next
	ConsoleWrite(StringFormat('%9s - %.6f', $i, TimerDiff($Timer) / 1000) & @CR)
Next


Код:
       10 - 0.000007
      100 - 0.000010
     1000 - 0.000050
    10000 - 0.000464
   100000 - 0.004679
  1000000 - 0.046696
 10000000 - 0.463711
100000000 - 4.653243
Как видно, зависимость вполне линейная. Поэтому разбивка большого цикла на несколько поменьше никакого выигрыша не принесет, скорее наоборот.
 
Верх