purebasic.info

PureBasic forum
Текущее время: Пт июл 10, 2020 2:47 pm

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




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

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6650
Благодарил (а): 36 раз.
Поблагодарили: 234 раз.
Пункты репутации: 65
Sp01LeR писал(а):
через printf() в консольке

Я попытался воссоздать подобный код в MS VS 2008 ( C++). Т.е прямо скажем - этот код посчитает 10 знаков после запятой практически мгновенно. Я даже не стал мучиться с таймером. Хотя, возможно, я просто что то недомудрил с типами переменных - Си не моя стихия и он меня просто бесит своей скрупулезностью.

// NumPi.cpp: определяет точку входа для консольного приложения.
//
Код:
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
 
#include "stdafx.h"
#include <math.h>;
#include <stdio.h>;
#include <conio.h>;
 
 
int _tmain()
{
   
         float  S1 = 0.0, S2 = 0.0, z;
         long n = 0;
      z = pow( 10.0, -10.0 );
    do
{
  n++;
  S1=S2+4.0/(2.0*n-1);
  n++;
  S2=S1-4.0/(2.0*n-1);
}while ( S1-S2 > z);
  z=(S1+S2)/2;
   printf( "%6.10f\n",z);
   getch();
}
 



Кто знает, где подвох, может отписаться...

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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11707
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
Кстати, разные версии дают разный результат.
Итак.
Задание: Вычисление Пи с 8-ю знаками после запятой. Отладчик отключён.

4.02 - 15.642 секунд
4.10 - 14.448 секунд
4.20 - 16.280 секунд
4.31 - 10.592 секунд
4.41 - 5.218 секунд.
4.51 - 5.218 секунд.


puremaster, ты какую версию пурика использовал?

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


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

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6650
Благодарил (а): 36 раз.
Поблагодарили: 234 раз.
Пункты репутации: 65
Пётр писал(а):
разные версии дают разный результат.

Кстати да! У меня 8 знаков v4.1 - 6,734, а версия 4.5 - 2,469.
Так что прогресс с оптимизацией компилятора налицо!

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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11707
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
kvitaliy писал(а):
float S1 = 0.0, S2 = 0.0, z;
Виталий, это же 4-ёх байтные переменные с плавающей запятой!

Давай тогда и в пурике используем флоатные переменные.
Код:
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
;{ 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.l=0:S1.f=0:S2.f=0
            Znak=Val(InputRequester("Супер ПИ PureBasic","Точность знаков после запятой <1-10>",Str(Znak)))
             StatusBarText(0, 0, "РАБОТАЮ! Не двигать мышкой и клавиши не нажимать!",#PB_StatusBar_Center)
            Tocnost.f=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
;
;}
 



У меня для вычисления 8 знаков после запятой, потребовалось, всего 438 мс.
А на сях сколько?

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


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

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6650
Благодарил (а): 36 раз.
Поблагодарили: 234 раз.
Пункты репутации: 65
Пётр писал(а):
А на сях сколько?

Дело в том, что на контроле выясняется, что число ПИ с Float не считает.
Вставь контрольную строчку
Код:
1
2
3
4
5
StatusBarText(0, 0, "ГОТОВО! Вычислено за "+Str( timenew) + "мсек.",#PB_StatusBar_Center)
                 TextItog$=TextItog$+"Точность Пи= "+ Str(Znak)+ " зн. после запятой.Время вычисления ="+ Str( timenew) + " мсек." + #CRLF$  
                 TextItog$=TextItog$+ StrD((S1+S2)/2)+ #CRLF$
 
 



А в сях С флоат считает тоже не правильно. В общем вставил в Си double и Си сдулся - 8 знаков считал 28 секунд. :D

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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11707
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
kvitaliy писал(а):
Дело в том, что на контроле выясняется, что число ПИ с Float не считает.

Как не считает?
Вроде посчитало

Код:
1
2
3
4
5
Процессор : 
Частота процессора: 1 GHz 600 MHz
3.1415967941
Точность Пи= 8 зн. после запятой.Время вычисления =438 мсек.
 



kvitaliy писал(а):
Си сдулся - 8 знаков считал 28 секунд
То есть пурик посчитал в 10 раз быстрее? :shock:

Вот геникс "обрадуется". :D

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


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

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6650
Благодарил (а): 36 раз.
Поблагодарили: 234 раз.
Пункты репутации: 65
Пётр писал(а):
Как не считает?
Вроде посчитало

Ну если не увидел в чем подвох, то есть проще метод - выведи на печать число n ( кол-во вычислений). При Float их кол-во выражается Мах 8- мизначным числом, и больше не растет в зависимости от знаков после запятой. Т.е. условие Until S1-S2 < Tocnost выполняется преждевременно. А с Double всё работает как надо.
Пётр писал(а):
То есть пурик посчитал в 10 раз быстрее?

Примерно да. Но тут надо учитывать, что компиляторы Си++ тоже разные! И я использовал МС Студию 2008, а это как известно технология .Net, она работает медленнее своих собратьев. Потом проверю на MS VS C++ 6.0, надо только установить её.

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


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

Зарегистрирован: Вт янв 27, 2009 3:09 pm
Сообщений: 295
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
.net используется только в шарпе, cpp/cli, и во всем, где есть приставка .net. А еще у тамошнего компилятора целая гора опций про оптимизацию.
На шарпе, кстати, код выше выполнялся так долго, что я ждать не стал, но я использовал там double.


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

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Цитата:
Вроде посчитало....3.1415967941
5 цифр правильно, остальные левые.

Код:
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
#pragma comment(linker,"/ENTRY:start")
 
#include <windows.h>;
#include <stdio.h>;
#include <math.h>;
#include <conio.h>;
 
void start(){
        while(1){
                double S1;
                double S2=0;
                double Tocnost;
                int n=0;
                int Znak;
 
                scanf("%d",&Znak);
                Tocnost=pow(10.0,-Znak);
 
                int Time1=GetTickCount();
                do {
                        n++;
                        S1=S2+4.0/(2*n-1);
                        n++;
                        S2=S1-4.0/(2*n-1);
                }
                while (S1-S2>=Tocnost);
                int Time2=GetTickCount();
 
                printf("%dms \npi = %.*f\n\n",Time2-Time1,Znak,S2);
        }
}



Я подозреваю что PB заранее переводит внутренности "(2*n-1)" в double:
(2.0*n.d-1.0).


Вложения:
pi.rar [917 байт]
Скачиваний: 288
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс ноя 21, 2010 6:11 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11707
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
вычисление PI, 8 знаков после запятой.
Цитата:
Си - 5.500 секунд.
PB - 5.218 секунд

Где ранее заявленое приемущество Си?

puremaster писал(а):
Я подозреваю что PB заранее переводит внутренности "(2*n-1)" в double

Вот асм код.
Код:
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
; 
; n.d=0:S1.d=0:S2.d=0
  FLD    qword [D2]
  FSTP   qword [v_n]
  FLD    qword [D2]
  FSTP   qword [v_S1]
  FLD    qword [D2]
  FSTP   qword [v_S2]
; Znak=Val(InputRequester("Супер ПИ PureBasic","Точность знаков после запятой <1-10>",Str(Znak)))
  MOV    eax,[_PB_StringBasePosition]
  PUSH   eax
  PUSH   eax
  MOV    eax,[_PB_StringBasePosition]
  PUSH   eax
  PUSH   eax
  PUSH   dword [_PB_StringBasePosition]
  MOV    eax,dword [v_Znak]
  CDQ
  PUSH   edx
  PUSH   eax
  CALL _PB_Str@12
  INC   dword [_PB_StringBasePosition]
  PUSH   dword _S17
  PUSH   dword _S2
  MOV    edx,[PB_StringBase]
  ADD    [esp+8],edx
  CALL _PB_InputRequester@16
  MOV    edx,[PB_StringBase]
  ADD    [esp+0],edx
  CALL _PB_Val@4
  POP    dword [_PB_StringBasePosition]
  MOV    dword [v_Znak],eax
; StatusBarText(0, 0, "РАБОТАЮ! Не двигать мышкой и клавиши не нажимать!",#PB_StatusBar_Center)
  PUSH   dword 4
  PUSH   dword _S18
  PUSH   dword 0
  PUSH   dword 0
  CALL _PB_StatusBarText2@16
; Tocnost.d=Pow(10,Znak * -1)
  FILD   dword [v_Znak]
  FMUL   qword [D3]
  SUB    esp,8
  FSTP   qword [esp]
  FLD    qword [D4]
  SUB    esp,8
  FSTP   qword [esp]
  CALL _PB_Pow_DOUBLE@16
  FSTP   qword [v_Tocnost]
; Time=GetTickCount_()
  CALL _GetTickCount@0
  MOV    dword [v_Time],eax
; Repeat
_Repeat8:
; n+1
  FLD    qword [v_n]
  FADD   qword [D5]
  FSTP   qword [v_n]
; S1=S2+4/(2*n-1)
  FLD    qword [v_S2]
  FLD    qword [v_n]
  FMUL   qword [D6]
  FADD   qword [D3]
  FDIVR  qword [D7]
  FADDP  st1,st0
  FADD   qword [D2]
  FSTP   qword [v_S1]
; n+1
  FLD    qword [v_n]
  FADD   qword [D5]
  FSTP   qword [v_n]
; S2=S1-4/(2*n-1)
  FLD    qword [v_S1]
  FLD    qword [v_n]
  FMUL   qword [D6]
  FADD   qword [D3]
  FDIVR  qword [D7]
  FSUBP  st1,st0
  FADD   qword [D2]
  FSTP   qword [v_S2]
; Until S1-S2 < Tocnost
  FLD    qword [v_S1]
  FSUB   qword [v_S2]
  FADD   qword [D2]
  FLD    qword [v_Tocnost]
  FCOMPP
  FNSTSW ax
  TEST  ah,41h
  JNE   _Repeat8
_Until8:
; timenew=GetTickCount_()-Time
  CALL _GetTickCount@0
  MOV    ebx,eax
  SUB    ebx,dword [v_Time]
  MOV    dword [v_timenew],ebx


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


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

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6650
Благодарил (а): 36 раз.
Поблагодарили: 234 раз.
Пункты репутации: 65
Пётр писал(а):
Где ранее заявленое приемущество Си?

Не указано, какой компилятор Си использовался?

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


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

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Цитата:
Где ранее заявленое приемущество Си?
А я откуда знаю :) На PB ровно в 10 раз время увеличивается с каждой новой цифрой. А здесь переход с 8 на 9 всего в 5 раз.
Цитата:
6
31ms
pi = 3.141592

7
282ms
pi = 3.1415926

8
2797ms
pi = 3.14159265

9
14969ms
pi = 3.141592653


Как вам такой расклад? :)


Последний раз редактировалось puremaster Вс ноя 21, 2010 7:00 pm, всего редактировалось 1 раз.

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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11707
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
kvitaliy писал(а):
Не указано, какой компилятор Си использовался?
Не в этом дело, просто puremaster писал что код на Си работает в 2 раза быстрее, но на деле это не так.

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


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

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6650
Благодарил (а): 36 раз.
Поблагодарили: 234 раз.
Пункты репутации: 65
Пётр писал(а):
Не в этом дело, просто puremaster писал что код на Си работает в 2 раза быстрее, но на деле это не так.


Опять же может он и прав, если использовать Пурик версии 4.2, и судя по выходному exe размеру файла С++ явно не Studio 2008!
puremaster проясни заявленные компиляторы.

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


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

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11707
Благодарил (а): 4 раз.
Поблагодарили: 512 раз.
Я чего-то недоганяю.

puremaster писал(а):
9
14969ms
pi = 3.141592653


Цитата:
3.1415926536
Точность Пи= 8 зн. после запятой.Время вычисления =5250 мсек.

Получается что пурик считает не 8 а 10 знаков после запятой!

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


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

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


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

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


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

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