purebasic.info

PureBasic forum
Текущее время: Пн дек 17, 2018 6:11 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: Откровение!
СообщениеДобавлено: Сб сен 29, 2018 4:27 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Пишу в этот раздел, может оказаться не только для меня новость. :)

Пока пытался помочь newJS избавится от строковых операций получил невероятные в моём представлении результаты.
Берём код:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CntTest = 1000000
a = 0
b = 0
a_s.s = ""
 
StartTime.q = ElapsedMilliseconds()
For i = 0 To CntTest
    a = i
    b = a
Next
t1 = ElapsedMilliseconds() - StartTime
 
StartTime.q = ElapsedMilliseconds()
For i = 0 To CntTest
  a_s = Str(i)
  b   = Val(a_s)
Next
tt.f = (ElapsedMilliseconds() - StartTime) / t1
Debug StrF(tt,2)



И получаем ВСЕГО в ДВА раза замедление при необходимости преобразовывать число в строку и обратно.

Когда это случилось с современными процессорами?

Я всю жизнь, а ровно 40 лет назад не видя ещё не одного процессора готовился к сдаче зачёта по АЛГАМС(у), программируя на листочке в клеточку ))) ,
считал очень дорогими такие манипуляции и давно не публикую один проект по причине: СТЫДНО ( :mrgreen: ) не решить передачу инфы между процессами без преобразования в строки и обратно.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Сб сен 29, 2018 4:37 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Слава всевышнему, это отладчик виноват меняем debug на msg и выключаем отладчик получаем реальное число 45
СОРОК ПЯТЬ РАЗ !!! )))))))))))))
Я думал у меня крыша тю-тю ... термопасту пора менять!!!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Вт окт 16, 2018 4:59 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 278
Благодарил (а): 37 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
Продолжу тему эпичных обсэров :lol:
Итак, все (кто в компьютерной тематике достаточно давно) знают что целочисленная арифметика быстрее чем с плавающей запятой, ну то-есть когда-то так и было, а сейчас...
Ниже код демонстрирующий, что мат-сопроцессоры сильно ушли вперед, и мат операции над числами с плавающей запятой (аналогичной разрядности) быстрее целочисленных....
или показалось? :shock:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
EnableExplicit
CompilerIf #PB_Compiler_Debugger
  MessageRequester("ВНИМАНИЕ!!!","Отладчик необходимо выключить!",#MB_ICONERROR): End
CompilerEndIf
 
#TESTCOUNT = 100000000
OpenConsole()
PrintN("Start test")
 
Procedure Main()
  Protected t1.q, t2.q, et.q, j, ej = #TESTCOUNT
 
  CompilerIf SizeOf(Integer) = 4
    Protected f.f
  CompilerElse
    Protected f.d ;SizeOf(Integer) = 8
  CompilerEndIf
  Protected i.i
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej
  Next
  t2 = ElapsedMilliseconds()
  et = t2 - t1 ;Время пустого цикла
  PrintN("Time empty cicle "+Str(et))
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej ;**************************
    i = j
    i + i
    i / i
    i * i
    i - i
  Next  ;************************************
  t2 = ElapsedMilliseconds()
  PrintN("Time for First   "+Str(t2-t1-et))
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej ;**************************
    f = j
    f + f
    f / f
    f * f
    f - f    
  Next  ;************************************
  t2 = ElapsedMilliseconds()
  PrintN("Time for Last    "+Str(t2-t1-et))
 
EndProcedure
 
Main()
 
PrintN("End test")
Input()
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Вт окт 16, 2018 5:14 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
Целочисленная быстрее, но не на много. Процентов на 20 примерно.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Вт окт 16, 2018 5:21 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 278
Благодарил (а): 37 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
А у меня результат такой:Изображение
зы. Win7x64, Amd Phenom II N850 2.2Ghz, PB546x32
зызы. на PB546x64:
Цитата:
Start test
Time empty cicle 348
Time for First 3286
Time for Last 2152
End test


зызызы. помятуя о том, что АМД-шные процы мат-модулями не славились, думал на интеле будет еще круче разница...
а у вас какой проц и версия компилятора?

зызызызы. проверил на PB562x32 и x64 результат аналогичный, значит дело в ЦП.


Вложения:
digitaltest.jpg [18.61 KiB]
Скачиваний: 0
Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Вт окт 16, 2018 6:13 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Start test
Time empty cicle 267
Time for First 3296
Time for Last 3464
End test
----------------------------------
cel J1800 PB562x64 W10x64
========================
Start test
Time empty cicle 296
Time for First 3121
Time for Last 3841
End test
----------------------------------
cel J1800 PB562x86 W10x64
========================


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Вт окт 16, 2018 6:45 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11336
Благодарил (а): 4 раз.
Поблагодарили: 443 раз.
x86.
Цитата:
Start test
Time empty cicle 184
Time for First 625
Time for Last 854
End test
x64.
Цитата:
Start test
Time empty cicle 152
Time for First 1767
Time for Last 774
End test

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Вт окт 16, 2018 7:34 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 677
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
Kuzmat писал(а):
Продолжу тему эпичных обсэров :lol:
Итак, все (кто в компьютерной тематике достаточно давно) знают что целочисленная арифметика быстрее чем с плавающей запятой, ну то-есть когда-то так и было, а сейчас...
Ниже код демонстрирующий, что мат-сопроцессоры сильно ушли вперед, и мат операции над числами с плавающей запятой (аналогичной разрядности) быстрее целочисленных....
или показалось? :shock:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
EnableExplicit
CompilerIf #PB_Compiler_Debugger
  MessageRequester("ВНИМАНИЕ!!!","Отладчик необходимо выключить!",#MB_ICONERROR): End
CompilerEndIf
 
#TESTCOUNT = 100000000
OpenConsole()
PrintN("Start test")
 
Procedure Main()
  Protected t1.q, t2.q, et.q, j, ej = #TESTCOUNT
 
  CompilerIf SizeOf(Integer) = 4
    Protected f.f
  CompilerElse
    Protected f.d ;SizeOf(Integer) = 8
  CompilerEndIf
  Protected i.i
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej
  Next
  t2 = ElapsedMilliseconds()
  et = t2 - t1 ;Время пустого цикла
  PrintN("Time empty cicle "+Str(et))
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej ;**************************
    i = j
    i + i
    i / i
    i * i
    i - i
  Next  ;************************************
  t2 = ElapsedMilliseconds()
  PrintN("Time for First   "+Str(t2-t1-et))
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej ;**************************
    f = j
    f + f
    f / f
    f * f
    f - f    
  Next  ;************************************
  t2 = ElapsedMilliseconds()
  PrintN("Time for Last    "+Str(t2-t1-et))
 
EndProcedure
 
Main()
 
PrintN("End test")
Input()
 


Что бы быть точным нужно точно знать какие реальные команды будут представлены процессору(как скомпилятся пуриковские инструкции)
есть у него и умножение и деление но побольшому счёту он работает с целочисленной арифметикой
и несомненно что сопроцессор(математический процессор) работает быстрее него и скорее будет зависим от чисел ? :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
EnableExplicit
CompilerIf #PB_Compiler_Debugger
  MessageRequester("ВНИМАНИЕ!!!","Отладчик необходимо выключить!",#MB_ICONERROR): End
CompilerEndIf
 
#TESTCOUNT = 100000000
OpenConsole()
PrintN("Start test")
Procedure Main()
  Protected t1.q, t2.q, et.q, j, ej = #TESTCOUNT
 
    Protected f.f
 
  Protected i.i
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej
  Next
  t2 = ElapsedMilliseconds()
  et = t2 - t1 ;Время пустого цикла
  PrintN("Time empty cicle "+Str(et))
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej ;**************************
    i = j
    i + i
    i / i
    i * i
    i - i
  Next  ;************************************
  t2 = ElapsedMilliseconds()
  PrintN("Time for First   "+Str(t2-t1-et))
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej ;**************************
    f = j
    f + f
    f / f
    f * f
    f - f    
  Next  ;************************************
  t2 = ElapsedMilliseconds()
  PrintN("Time for Last    "+Str(t2-t1-et))
    t1 = ElapsedMilliseconds()
  For j = 1 To ej ;**************************
   !MOVss xmm0,dword[p.v_i]
   !addss xmm0,xmm0
   !divss xmm0,xmm0
   !mulss xmm0,xmm0
   !subss xmm0,xmm0  
  Next  ;************************************
  t2 = ElapsedMilliseconds()
  PrintN("Time for Last    "+Str(t2-t1-et))
EndProcedure
 
Main()
 
PrintN("End test")
Input()
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Вт окт 16, 2018 7:44 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 345
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Kuzmat писал(а):
Продолжу тему эпичных обсэров :lol:

Да нет, это ты собственно ошибся с прогой.
Ты все в кучу свалил и ждеш чуда, поясню.
Допустим одна черепаха лезет метр за час, а автомобиль за 0,1 сек, ты все суммировал и получил 3600,1 секунд и говориш что все, управился.
Что это за ... в куче, и в одном цикле, нужно было мухи и котлеты разделить бы.
i = j
i + i
i / i
i * i
i - i

Вот так должна выглядеть прога, как мне показалось, цикл по каждому отдельно.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 
CompilerIf #PB_Compiler_Debugger
  MessageRequester("ВНИМАНИЕ!!!","Отладчик необходимо выключить!",#MB_ICONERROR): End
CompilerEndIf
 
 
 
i2.f =0
 
ej=100000000;000
OpenConsole()
PrintN("Start test")
 
Input()
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej
  Next
  PrintN("Time empty cicle "+Str(ElapsedMilliseconds() - t1))
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    i.l=j
Next
PrintN("Time for =  "+Str(ElapsedMilliseconds() - t1))
 
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    i.l=j
    i.l -2
Next
PrintN("Time for '-'  "+Str(ElapsedMilliseconds() - t1))
 
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    i.l=j
    i.l +2
Next
PrintN("Time for '+'  "+Str(ElapsedMilliseconds() - t1))
 
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    i2=j
    i2.f  *0.9999
Next
PrintN("Time for '*'  "+Str(ElapsedMilliseconds() - t1))
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    i2.f=j
    i2.f / 1.0001
Next
PrintN("Time for '/ ' "+Str(ElapsedMilliseconds() - t1))
 
 
PrintN("End test")
Input()


результат теста
Start test
Time empty cicle 360
Time for = 343
Time for '-' 469
Time for '+' 625
Time for '*' 1250
Time for '/ ' 2453
End test

Start test
Time empty cicle 297
Time for = 328
Time for '-' 500
Time for '+' 515
Time for '*' 1250
Time for '/ ' 2157
End test

и для реал тайм режима
Start test
Time empty cicle 234
Time for = 313
Time for '-' 422
Time for '+' 406
Time for '*' 1109
Time for '/ ' 1922
End test


Start test

Time empty cicle 234
Time for = 297
Time for '-' 437
Time for '+' 391
Time for '*' 1110
Time for '/ ' 1922
End test

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

И с Сергейчиком соглашусь, это нужно смотреть на асме.

_________________
искатель истины


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Вт окт 16, 2018 8:46 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 677
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
ДА делит похуже
вот если ставишь тип целочисленный то обгоняет сопроцессор на +,-(но у того могут быть тоже команды другие для этого +xmm это 128 битный регистр а тип f 32 бита) :roll:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
 
CompilerIf #PB_Compiler_Debugger
  MessageRequester("ВНИМАНИЕ!!!","Отладчик необходимо выключить!",#MB_ICONERROR): End
CompilerEndIf
 
 
 
i2.f =1
i.l=1
t1.l
ej=1000000000
OpenConsole()
PrintN("Start test  "+ Str(ej))
 
 
 
  t1 = ElapsedMilliseconds()
  For j = 1 To ej
  Next
  PrintN("Time empty cicle "+Str(ElapsedMilliseconds() - t1))
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    i=j
Next
PrintN("Time for =  "+Str(ElapsedMilliseconds() - t1))
 
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    i2 -1
Next
PrintN("Time for '-'  "+Str(ElapsedMilliseconds() - t1))
 
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    i2 +1
Next
PrintN("Time for '+'  "+Str(ElapsedMilliseconds() - t1))
 
 t1 = ElapsedMilliseconds()
For j = 1 To ej
 
    i2  *1
Next
PrintN("Time for '*'  "+Str(ElapsedMilliseconds() - t1))
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    i2 / 1
Next
PrintN("Time for '/ ' "+Str(ElapsedMilliseconds() - t1))
 
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    !MOVss xmm0,dword[v_j]
Next
PrintN("Time for MOVss '='  "+Str(ElapsedMilliseconds() - t1))
 
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    !subss xmm0,xmm0
Next
PrintN("Time for subss '-'  "+Str(ElapsedMilliseconds() - t1))
 
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    !addss xmm0,xmm0
Next
PrintN("Time for addss '+'  "+Str(ElapsedMilliseconds() - t1))
 
 t1 = ElapsedMilliseconds()
For j = 1 To ej
 
   !mulss xmm0,xmm0
Next
PrintN("Time for mulss '*'  "+Str(ElapsedMilliseconds() - t1))
 
t1 = ElapsedMilliseconds()
For j = 1 To ej
    !divss xmm0,xmm0
Next
PrintN("Time for divss '/'  "+Str(ElapsedMilliseconds() - t1))
 
 
PrintN("End test")
Input()
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Ср окт 17, 2018 4:36 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 278
Благодарил (а): 37 раз.
Поблагодарили: 28 раз.
Пункты репутации: 0
Господа, обратите внимание на тип результата (Quad), иначе возникают "фокусы" :wink:
Из справки:
Код:
1
Result.q = ElapsedMilliseconds()



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Откровение!
СообщениеДобавлено: Ср окт 17, 2018 1:49 pm 
Не в сети
профессор

Зарегистрирован: Вс июл 05, 2009 5:55 pm
Сообщений: 345
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
:?: :!: :!: :!:
И , что с ней не в порядке?
Есть варианты и предложения? исключить из списков :lol:

_________________
искатель истины


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB