purebasic.info

PureBasic forum
Текущее время: Сб ноя 17, 2018 3:35 am

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




Начать новую тему Ответить на тему  [ Сообщений: 89 ]  На страницу 1, 2, 3, 4, 5, 6  След.
Автор Сообщение
СообщениеДобавлено: Пн ноя 15, 2010 10:11 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Есть такая программа - вычисляет на время число Пи. Чем круче компьютер, тем быстрее вычисляется это число.
Ниже предлагается код, выполняющий подобные действия. В программе предусмотрено сохранение результатов в файл и копирование их в буфер обмена. Так что запускаем, проверяем свои компы и меряемся !

Не забываем включить поддержку асм. строк!


Код:
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
 
;{ Windows
Enumeration
  #Window_0
EndEnumeration
;}
;{ Status bars
Enumeration
  #StatusBar_Window_0
EndEnumeration
;}
;{ Gadgets
Enumeration
  #Text_0
EndEnumeration
;}
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
Global TextItog$ = ""
Global Znak.i=6
;}
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 483, 35, 400, 254, "Супер ПИ PureBasic", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    If CreateStatusBar(#StatusBar_Window_0, WindowID(#Window_0))
       AddStatusBarField(#PB_Ignore)
     EndIf
     StatusBarText(0, 0, "Тест на скорость вычисления числа Пи",#PB_StatusBar_Center)
 
    ;If CreateGadgetList(WindowID(#Window_0))
      TextGadget(#Text_0, 0, 15, 400, 215, "")
      ;EndIf
     If CreateMenu(0, WindowID(0))
    MenuTitle("Тест")
      MenuItem( 1, "Начать")
      MenuItem( 2, "Сохранить результат")
      MenuItem( 3, "Заисать в буфер обмена")
      MenuBar()
      MenuItem( 4, "Выход")
   MenuTitle("?")
      MenuItem(5, "About")
 
  EndIf
 
 
     
  EndIf
EndProcedure
 
; Не забудте включить поддержку ASM вставок в свойствах компилятора!
Procedure.d GetCPUFreq(DelayTime.l=500)
  Static TimerHi.l, TimerLo.l, PriorityClass .l, Priority .l, Process.l, Thread.l
  Process = GetCurrentProcess_()
  Thread  = GetCurrentThread_()
  PriorityClass  = GetPriorityClass_(Process)
  Priority  = GetThreadPriority_(Thread)
  SetPriorityClass_(Process, #REALTIME_PRIORITY_CLASS)
  SetThreadPriority_(Thread, #THREAD_PRIORITY_TIME_CRITICAL)
  Sleep_(DelayTime)
  DW $310F
  MOV TimerLo, EAX
  MOV TimerHi, EDX
  Sleep_(DelayTime)
  DW $310F
  SUB EAX, TimerLo
  SUB EDX, TimerHi
  MOV TimerLo, EAX
  MOV TimerHi, EDX
  SetThreadPriority_(Thread,Priority)
  SetPriorityClass_ (Process,PriorityClass)
  ProcedureReturn TimerLo / (1000.0 * DelayTime)
EndProcedure
 
OpenWindow_Window_0()
F.d = GetCPUFreq()
GHz = Int(F / 1000)
MHz = F - GHz*1000
key$="HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0\"
Name$=RegGetValue(key$,"ProcessorNameString",".")
 
TextItog$="Процессор : " + Name$ + #CRLF$
TextItog$=TextItog$+"Частота процессора: "+Str(GHz)+" GHz "+Str(MHz)+" MHz" + #CRLF$
 
;{- Event loop
Repeat
  Event = WaitWindowEvent()
  Select Event
      Case #PB_Event_Menu
 
        Select EventMenu()  
          Case 1
           
            n.d=0:S1.d=0:S2.d=0
            Znak=Val(InputRequester("Супер ПИ PureBasic","Точность знаков после запятой <1-10>",Str(Znak)))
             StatusBarText(0, 0, "РАБОТАЮ! Не двигать мышкой и клавиши не нажимать!",#PB_StatusBar_Center)
            Tocnost.d=Pow(10,Znak * -1)
            Time=GetTickCount_()
                 Repeat
                     n+1
                      S1=S2+4/(2*n-1)
                     n+1
                      S2=S1-4/(2*n-1)
                 Until S1-S2 < Tocnost
                 timenew=GetTickCount_()-Time
                 StatusBarText(0, 0, "ГОТОВО! Вычислено за "+Str( timenew) + "мсек.",#PB_StatusBar_Center)
                 TextItog$=TextItog$+"Точность Пи= "+ Str(Znak)+ " зн. после запятой.Время вычисления ="+ Str( timenew) + " мсек." + #CRLF$    
                 SetGadgetText(#Text_0,TextItog$)
             MessageRequester("Супер ПИ PureBasic","Вычислено за " + Str( timenew/1000) + " сек.")
                 
           Case 2
             Pattern$ = "Text (*.txt)|*.txt"
             Pattern = 0    
             File$ = SaveFileRequester("Файл для сохранения результатов","", Pattern$, Pattern)
           If File$
               
             If CreateFile(0, File$)  
                  WriteString(0,GetGadgetText(#Text_0))
                  CloseFile(0)  
                  MessageRequester("Супер ПИ PureBasic","Сохранено!")
             Else
                   MessageRequester("Супер ПИ PureBasic","Не возможно создать файл!")
             EndIf
                 
          EndIf
               
           Case 3
             SetClipboardText(GetGadgetText(#Text_0))
             MessageRequester("Супер ПИ PureBasic","Выполнено!")
          Case 4
            End
          Case 5 ; About
            MessageRequester("О программе", "Оценивает скорость работы компьютера на  основании скорости вычисления числа Пи"+ #CRLF$+ " Вычисления проводятся по формуле Грегори", 0)
           
          Default
           
 
        EndSelect
 
    ; ///////////////////
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Text_0
      EndIf
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
;
;}
 



Мой результат c дебагером
Цитата:
Процессор : AMD Athlon(tm) 64 Processor 3500+
Частота процессора: 2 GHz 212 MHz
Точность Пи= 6 зн. после запятой.Время вычисления =219 мсек.
Точность Пи= 7 зн. после запятой.Время вычисления =2187 мсек.
Точность Пи= 8 зн. после запятой.Время вычисления =21797 мсек.


Дальнейшее увеличение знаков и рост скорости можно прогнозировать из первых 3-х проб - 9 знаков скорее всего будет вычислять в 10 раз дольше, чем 8 :(
Результат без дебагера ( скомпилировал в ехе)
Цитата:
Процессор : AMD Athlon(tm) 64 Processor 3500+
Частота процессора: 2 GHz 212 MHz
Точность Пи= 6 зн. после запятой.Время вычисления =16 мсек.
Точность Пи= 7 зн. после запятой.Время вычисления =234 мсек.
Точность Пи= 8 зн. после запятой.Время вычисления =2453 мсек.
Точность Пи= 9 зн. после запятой.Время вычисления =24516 мсек.


На моем одноядерном загрузка 100% проца. Интересно, а на 2-х и более ядерных как загружается проц? Можно ли изменить программу, что бы загрузить все ядра на 100%?
Цитата:

_________________
read-only ¯\_(ツ)_/¯


Последний раз редактировалось kvitaliy Пн ноя 15, 2010 10:45 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 15, 2010 10:29 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вс ноя 07, 2010 12:19 pm
Сообщений: 281
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy
Цитата:
Интересно, а на 2-х и более ядерных как загружается проц?

Процессорное время разделяется между потоками с соответствующим аффинитетом. Чем выше приоритет потока, тем больше времени он владеет процессором.

_________________
Materia Lucida


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 15, 2010 10:35 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Indy писал(а):
Процессорное время разделяется между потоками с соответствующим аффинитетом. Чем выше приоритет потока, тем больше времени он владеет процессором.

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

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 15, 2010 10:49 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
Ты у нас вирусы сочиняешь? :D

Изображение


kvitaliy писал(а):
Мой результат

Мой
Цитата:
Процессор : Intel(R) Celeron(R) CPU E1200 @ 1.60GHz
Частота процессора: 1 GHz 600 MHz
Точность Пи= 8 зн. после запятой.Время вычисления =10735 мсек.


kvitaliy писал(а):
Интересно, а на 2-х и более ядерных как загружается проц?
На 50%

kvitaliy писал(а):
ли изменить программу, что бы загрузить все ядра на 100%?

Использовать многопоточность. :)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн ноя 15, 2010 11:45 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн сен 07, 2009 10:00 pm
Сообщений: 1046
Откуда: Николаев
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Компилированный в ехе

Цитата:
Процессор : Intel(R) Core(TM)2 Duo CPU E6550 @ 2.33GHz
Частота процессора: 2 GHz 333 MHz
Точность Пи= 6 зн. после запятой.Время вычисления =16 мсек.
Точность Пи= 7 зн. после запятой.Время вычисления =265 мсек.
Точность Пи= 8 зн. после запятой.Время вычисления =2687 мсек.
Точность Пи= 9 зн. после запятой.Время вычисления =26734 мсек.

_________________
www.mirashic.narod.ru
Первое знакомство с PB


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 16, 2010 3:50 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2291
Откуда: Russia — Belarus
Благодарил (а): 7 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
:)
Цитата:
I?ioanni? : Genuine Intel(R) CPU 2160 @ 1.80GHz
?anoioa i?ioanni?a: 1 GHz 800 MHz
Oi?iinou Ie= 6 ci. iinea caiyoie.A?aiy au?eneaiey =374 inae.
Oi?iinou Ie= 7 ci. iinea caiyoie.A?aiy au?eneaiey =3557 inae.
Oi?iinou Ie= 8 ci. iinea caiyoie.A?aiy au?eneaiey =35412 inae.
Oi?iinou Ie= 9 ci. iinea caiyoie.A?aiy au?eneaiey =353919 inae.


Вложения:
cpu.png [5.95 KiB]
Скачиваний: 126

_________________
EnableExplicit User
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 16, 2010 6:47 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Как и ожидалось, скорость выполнения этого задания зависит в основном от частоты процессора. Т.е. в обычной не оптимизированной программе на банальное вычисление один из представителей самой современной линейки процессоров типа Core i7-980X 3,33 ГГц цуной в 1000 баксов будет работать с той же эффективностью, что и старый Пентиум 4 3000 МГц, купленный на барахолке за 500 рублей и чуть чуть разогнанный до этой скорости?

Ну а как можно распараллелить вычисления типа этих
Код:
1
2
3
4
5
6
7
Repeat
                     n+1
                      S1=S2+4/(2*n-1)
                     n+1
                      S2=S1-4/(2*n-1)
Until S1-S2 < Tocnost
 


Я что то не представляю как?

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 16, 2010 6:51 am 
Не в сети
профессор

Зарегистрирован: Сб авг 18, 2007 1:38 pm
Сообщений: 232
Благодарил (а): 1 раз.
Поблагодарили: 3 раз.
Пункты репутации: 0
Надо делать многопоточным, не менее 4 потоков, чтоб многоядерные полностью загружались. И что интересно при снятой галочке компиллятора "защищенный поток" скорость в 4 раза меньше!

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 16, 2010 3:26 pm 
Не в сети
профессор

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Цитата:
Core i7-980X 3,33 ГГц цуной в 1000 баксов будет работать с той же эффективностью, что и старый Пентиум 4 3000 МГц

Если только для вычислений ПИ :) А так при одинаковых мегагерцах новые процы будут в несколько раз дергать старые при просмотре/кодировании видео, или со всякими фильтрами в фотошопах.
Цитата:
Процессор : Intel(R) Pentium(R) 4 CPU 3.00GHz
Частота процессора: 2 GHz 1000 MHz
Точность Пи= 7 зн. после запятой.Время вычисления =297 мсек.
Точность Пи= 8 зн. после запятой.Время вычисления =2859 мсек.
Точность Пи= 9 зн. после запятой.Время вычисления =28422 мсек.
3.141592653

Mhz почему-то до 1000 округлились.

Дальше тот же код один-в-один скомпиленный на vc++:
Цитата:
Точность Пи= 9 зн. после запятой.Время вычисления =14843 мсек.
3.141592653
Можно заметить некоторую разницу в скорости :)


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

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
puremaster писал(а):
Если только для вычислений ПИ :) А так при одинаковых мегагерцах новые процы будут в несколько раз дергать старые при просмотре/кодировании видео, или со всякими фильтрами в фотошопах.
Цитата:

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

puremaster писал(а):
Можно заметить некоторую разницу в скорости :)

А вот этот факт удручает - все же таки компилятор Пурика оптимизирован слабовато...

_________________
read-only ¯\_(ツ)_/¯


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
Прога очень медлено работает? Не волнуйтесь, мы вам поможем! :D
Только сейчас, уникальное предложение - конструктор программ "Алгоритм"!
Конструктор программ "Алгоритм" - после него, будет казатся что все остальные проги просто "летают"! :)

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт ноя 16, 2010 11:30 pm 
Не в сети
профессор

Зарегистрирован: Вт янв 27, 2009 3:09 pm
Сообщений: 295
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Цитата:
компилятор Пурика оптимизирован слабовато

А не в алгоритме ли дело? SuperPi вычисляет миллион знаков за 20 секунд, а у вас 9 знаков за 40.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср ноя 17, 2010 6:43 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6397
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Old Dirty Bastard писал(а):
А не в алгоритме ли дело? SuperPi вычисляет миллион знаков за 20 секунд, а у вас 9 знаков за 40.

Да причем тут это. Мы же не число Пи вычисляем и кол-во знаков не причем. Алгоритм выбран специально, что бы процессор нагрузить вычислениями ( по формуле Грегори, это очень медленно сходящийся ряд). Вопрос в том, что puremaster говорит, что тот же код один-в-один скомпилированный на vc++ работает в ~2 раза быстрее.

Т.о. мы имеем одинаковые машины, одинаковый код, но разные компиляторы, и Пурик получается работает медленнее.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб ноя 20, 2010 8:34 pm 
Не в сети
док

Зарегистрирован: Вс май 02, 2010 4:54 pm
Сообщений: 117
Откуда: оттуда...
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy писал(а):
А вот этот факт удручает - все же таки компилятор Пурика оптимизирован слабовато...


kvitaliy писал(а):
Т.о. мы имеем одинаковые машины, одинаковый код, но разные компиляторы, и Пурик получается работает медленнее.

Это же катастрофа!!! Если будете Фредди на костре жечь, видео потом на ютуб зальёте? :lol:

Я не рискну сомневаться в утверждении puremaster'а, так как сишка действительно очень крута при вычислениях с плавающей точкой, но все-таки хотелось бы увидеть тот самый "код один-в-один скомпиленный на vc++", ну ясное дело без гуя - через printf() в консольке...
и вдогонку еще вопрос - "vc++" это, как я понимаю, вижуал студия или все же борландовский билдер?


Последний раз редактировалось Sp01LeR Сб ноя 20, 2010 10:00 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб ноя 20, 2010 9:43 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 440 раз.
Нужно отметить что был использован тип переменных Double, работающий с плавающей запятой и занимающий 8 байт в памяти компа.
А для x86 процев и операционок он не является родным и поэтому работа с ним производится программно. Вполне возможно что пурик с данным типом переменной работает не совсем оптимально, но я не думаю что разница в 2 раза это слишком страшно, это же не 20 раз!
При работе с другими типами переменных, ситуация может быть намного лучше, не стоит сразу вешать клеймо на пурик как на тормознутый компилятор!

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


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 89 ]  На страницу 1, 2, 3, 4, 5, 6  След.

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


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

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


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

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