С Новым годом! Форум программистов, компьютерный форум, киберфорум
Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.66/65: Рейтинг темы: голосов - 65, средняя оценка - 4.66
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4

Тест быстроты сгенерированного кода

10.05.2021, 18:45. Показов 14820. Ответов 100

Студворк — интернет-сервис помощи студентам
Синтетический тест быстроты сгенерированного кода разных компиляторов на основе алгоритма быстрой сортировки.

## Требования

1. Алгоритм быстрой сортировки (сортировка Хоара с разбиением по Хоару).
2. Сортировка по возрастанию: от маленького значения к большему.
3. Посторонние библиотеки для сортировки не использовать.
4. Сортировка в одном потоке.

### Измерения

1. Измеряется время сортировки массива.
2. Десять циклов измерений времени, выводится среднее.

### Данные

1. Длина массива 50000000 (пятьдесят миллионов).
2. Тип данных массива: структура из двух полей типа Double: {LowPart, HighPart}.
3. На каждом цикле массив заполняется случайными значениями в интервале `[0, 1)`.
4. Генератор случайных чисел инициализируется заново перед каждым заполнением массива.
5. Количество рекурсивных вызовов функции сотировки должно быть одинаковым на одном и том же наборе данных.
6. Затравка для генератора случайных чисел равна нулю.
7. Функция сравнения переменных a и b (возможна оптимизация):

```
(a.HighPart < b.HighPart) Or ((a.HighPart = b.HighPart) And (a.LowPart < b.LowPart))
```

### Вывод

1. Время выполнения сортировки по каждому циклу.
2. Количество рекурсивных вызовов сортировки (должно быть одинаковым).
3. Среднее время.


Для компиляции этой программы необходим gcc (для "-gen gcc" на x86) и mingw (для утилиты mingw32-make). Необходимые пути к компилятору и утилитам указаны в пакетных файлах.

В результате:

FreeBASIC с задником GCC 5.2.0: среднее время 12080 миллисекунд.
FreeBASIC с задником GCC 8.1.0: среднее время 12445 миллисекунд.
FreeBASIC с задником GCC 10.2.0: среднее время 10993 миллисекунд.

Забавно, что звучащая фоном музыка может замедлять задачу на 1000 миллисекунд.

Приглашаю вступить в игру пропагандистам других диалектов бесика.
Миниатюры
Тест быстроты сгенерированного кода  
Вложения
Тип файла: zip QuickSort.zip (71.0 Кб, 48 просмотров)
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.05.2021, 18:45
Ответы с готовыми решениями:

Ошибки сгенерированного кода
Всем здрасти! Решил сделать свой первый шаг в интерфейсо-строении и столкнулся со следующей проблемой: Создаю новый пустой проект...

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

Чтение сгенерированного кода в Visual Studio
такая проблема. в одной теме здесь нашел, как преобразовать файл Word в код C# по статье сделал все, но не понимаю, как вывести...

100
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,376
Записей в блоге: 7
11.05.2021, 15:41
Цитата Сообщение от Замабувараев Посмотреть сообщение
1. Алгоритм быстрой сортировки (сортировка Хоара с разбиением по Хоару).
Где код на который ориентироваться? Иначе из-за отличий могут исказиться результаты. Про архив можете не писать, нет желания копаться в десятках файлов.

Цитата Сообщение от Замабувараев Посмотреть сообщение
3. Посторонние библиотеки для сортировки не использовать.
Посторонние это какие? Стандартные библиотеки ЯП разрешены?

Цитата Сообщение от Замабувараев Посмотреть сообщение
### Данные
Чем сложнее тестируемый код, тем меньше участников будет.
Вы все слишком усложнили. Это не нужно для данной задачи.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
11.05.2021, 16:30  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Вы все слишком усложнили.
Просто формализовал массив количеством 50 миллионов элементов с одинаковыми данными на каждом цикле сортировки.
«Количество рекурсивных вызовов функции сортировки» — это нужно чтобы показать, что алгоритм работает одинаково на одном и том же наборе данных.
Цитата Сообщение от locm Посмотреть сообщение
Посторонние это какие? Стандартные библиотеки ЯП разрешены?
А вот проверьте скорость работы самостоятельной реализации и библиотечной.
Цитата Сообщение от locm Посмотреть сообщение
Где код на который ориентироваться?
Код сортировки на фрибесике:
PureBasic
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
Type LARGE_DOUBLE
    LowPart AS Double
    HighPart AS Double
End Type
 
Function QuickSort( _
        ByVal pVector As LARGE_DOUBLE Ptr, _
        ByVal LeftBound As Integer, _
        ByVal RightBound As Integer _
    )As Integer
    
    Dim Size As Integer = RightBound - LeftBound + 1
    
    If Size < 2 Then
        Return 0
    End If
    
    Dim PivotIndex As Integer = LeftBound + Size \ 2
    Dim PivotValue As LARGE_DOUBLE = pVector[PivotIndex]
    
    Dim LocalLeftBound As Integer = LeftBound
    Dim LocalRightBound As Integer = RightBound
    
    Do
        Do While pVector[LocalLeftBound] < PivotValue
            LocalLeftBound += 1
        Loop
        
        Do While PivotValue < pVector[LocalRightBound]
            LocalRightBound -= 1
        Loop
        
        If LocalLeftBound <= LocalRightBound Then
            Dim tmp As LARGE_DOUBLE = pVector[LocalLeftBound]
            pVector[LocalLeftBound] = pVector[LocalRightBound]
            pVector[LocalRightBound] = tmp
            
            LocalLeftBound += 1
            LocalRightBound -= 1
        End If
        
    Loop While LocalLeftBound <= LocalRightBound
    
    Dim QuickSortCount As Integer = 1
    
    If LeftBound < LocalRightBound Then
        QuickSortCount += QuickSort(pVector, LeftBound, LocalRightBound)
    End If
    
    If LocalLeftBound < RightBound Then
        QuickSortCount += QuickSort(pVector, LocalLeftBound, RightBound)
    End If
    
    Return QuickSortCount
    
End Function
 
' Сравнение
Operator < (ByRef lhs As LARGE_DOUBLE, ByRef rhs As LARGE_DOUBLE)As Boolean
    
    If lhs.HighPart < rhs.HighPart Then
        Return True
    End If
    
    If lhs.HighPart = rhs.HighPart Then
        If lhs.LowPart < rhs.LowPart Then
            Return True
        End If
    End If
    
    Return False
    
End Operator
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
11.05.2021, 18:00
Цитата Сообщение от Замабувараев Посмотреть сообщение
LARGE_DOUBLE
Для чего? А стандартный тип DOUBLE чем не угодил?
Я хотел сделать на Пурик, но потом вспомнил, что Пуриковский RND генерирует целые числа, а тут от 0 до 1.
Ну и лень мне стало изобретать велосипед.

Другое удивило. Скомпилировал код что в архиве в обычном FreeBasic_Build_1.05 х86 из под fbedit в режиме консольного приложения, стандартная поставка, без танцев с бубном.
Время сортировки: 19658
Ваша версия из архива :
QuickSort_Console_GCC-08.1.0_FBC-1.07.3_WoPTWoRtWoCrWoMingwW - время 8930
Один и тот же код, в моём случае работает почти 20 секунд, а в вашем всего 9 секунд?
И размер тоже разный очень, у меня почти 30 кб, у вас около 6 кб. Что за магия?
Мой файл, если что:
Вложения
Тип файла: zip sort.zip (12.5 Кб, 12 просмотров)
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
11.05.2021, 18:42  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
RND генерирует целые числа, а тут от 0 до 1.
Тогда разделите 1.0 на полученное от RND число, получится число от 0 до 1.

Цитата Сообщение от Pro_grammer Посмотреть сообщение
QuickSort_Console_GCC-08.1.0_FBC-1.07.3_WoPTWoRtWoCrWoMingwW - время 8930
Сам по себе FreeBASIC — это не оптимизирующий компилятор, всю оптимизацию делают за него бекенд в виде GCC или Шланга.
По умолчанию на x86 FreeBASIC генерирует код для задника (бекенда) GAS, на x64 — для GCC 5.2.0. Можно дополнительно установить задник GCC 8.1.0, он лучше оптимизирует код, получается быстрее.

Цитата Сообщение от Pro_grammer Посмотреть сообщение
И размер тоже разный очень, у меня почти 30 кб, у вас около 6 кб. Что за магия?
Рантайм удалён.

Добавлено через 5 минут
Вот так можно заполнить массив числами с плавающей точкой, если ваш генератор выдаёт только целые числа:
PureBasic
1
2
3
4
5
6
7
8
9
10
11
Sub FillVector( _
        ByVal pVector As LARGE_DOUBLE Ptr, _
        ByVal Length As Integer _
    )
    
    For i As Integer = 0 To Length - 1
        pVector[i].HighPart = 1.0 - 1.0 / CDbl(rand())
        pVector[i].LowPart = 1.0 - 1.0 / CDbl(rand())
    Next
    
End Sub
rand() — выдаёт случайное целое число.

Добавлено через 5 минут
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Для чего? А стандартный тип DOUBLE чем не угодил?
Просто Double обсчитывается на раз, а вот с LARGE_DOUBLE придётся постараться. Мы смотрим насколько компилятор подкован в таких вопросах.
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,376
Записей в блоге: 7
11.05.2021, 19:43
Цитата Сообщение от Замабувараев Посмотреть сообщение
Сам по себе FreeBASIC — это не оптимизирующий компилятор, всю оптимизацию делают за него бекенд в виде GCC или Шланга.
Тогда в чем смысл сравнивать скорость если она в конечном итоге зависит не от компилятора бейсика, а от Си? И так понятно что у компилятора GCC и подобных команда разработчиков, больше и квалифицированнее. Я думаю что нужно узнать скорость компилятора FreeBASIC отключив все оптимизации у Си-компилятора.

Цитата Сообщение от Замабувараев Посмотреть сообщение
По умолчанию на x86 FreeBASIC генерирует код для задника (бекенда) GAS
Вот это будет более корректное сравнение, т. к. компилятор асма не выполняет оптимизацию.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Рантайм удалён.
Смысл? Он влияет на производительность?
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
12.05.2021, 03:22  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Тогда в чем смысл сравнивать скорость если она в конечном итоге зависит не от компилятора бейсика, а от Си?
Нет ничего плохого в том, чтобы процесс создания программ делегировать разным утилитам. Так, ассемблированием занимается асемблер, линковкой — компоновщик, а за оптимизацию ГЦЦ. Сам Си, Си++ и Шланг тоже так делают.

Цитата Сообщение от locm Посмотреть сообщение
Вот это будет более корректное сравнение, т. к. компилятор асма не выполняет оптимизацию.
А на x64 только через GCC и компилируется, ГЦЦ неотделим.

Цитата Сообщение от locm Посмотреть сообщение
Смысл? Он влияет на производительность?
Я его не использовал, поэтому нет смысла добавлять в исполняемый файл мёртвый код.
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,376
Записей в блоге: 7
12.05.2021, 10:03
Цитата Сообщение от Замабувараев Посмотреть сообщение
за оптимизацию ГЦЦ
Тогда за скорость выполнения кода отвечает GCC, а не FreeBASIC, а значит сравнение будет некорректным если другие бейсики не используют GCC или другой компилятор Си выполняющий оптимизацию.
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
12.05.2021, 12:33  [ТС]
Странное решение запрещать оптимизацию только потому, что другие бейсики не умеют оптимизировать код или не отправляют абстрактное синтаксическое дерево в оптимизирующие утилиты.
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,376
Записей в блоге: 7
12.05.2021, 13:43
Цитата Сообщение от Замабувараев Посмотреть сообщение
Странное решение запрещать оптимизацию только потому, что другие бейсики не умеют оптимизировать
Минуточку, это не вы писали?
Цитата Сообщение от Замабувараев Посмотреть сообщение
Сам по себе FreeBASIC — это не оптимизирующий компилятор, всю оптимизацию делают за него бекенд в виде GCC
По сути будет сравнение скорости не FreeBASIC, а Си компилятора.
Или в сравнении участвуют все компиляторы, а не только бейсики?
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
12.05.2021, 14:36  [ТС]
Вы непременно необходимо чтобы оптимизатор сидел в том же исполняемом файле, что и компилятор?

Что делать при компиляции в LLVM? Вся архитектура LLVM построена на генерации передником псевдокода «как есть» без удаления программистского Lorem Ipsum, и отдаче его заднику LLVM, где оптимизацию выполняет набор утилит заднего двора.

Вы считаете, что если отдали заднику любой страшный код любого компилятора, то после применения оптимизирующих операций на выходе код будет одинаково причёсанным и одинаково быстрым?

Есть ли смысл в 21 веке разрабатывать собственный оптимизатор или проще воспользоваться уже готовыми, разрабатываемыми такими могущественными транснациональными корпорациями, как APPPLE и GUGLE, капитализация которых вдесятеро превышает годовой бюджет Российской Федерации?
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,376
Записей в блоге: 7
12.05.2021, 17:18
Я уже отвечал на эти вопросы Тест быстроты сгенерированного кода
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
13.05.2021, 07:44  [ТС]
Получить программу с -O 3 без оптимизации от GCC нетривиально. Придётся вмешиваться в процесс трансляции, вручную запускать задник с O0, самостоятельно линковать объектные файлы, добавлять main и инициализировать библиотеки времени выполнения.

Без оптимизации на моём компьютере 64‐битная программа выполняется за 26 секунд, 32‐битная — за 30 секунд.
Вложения
Тип файла: zip Release.zip (23.0 Кб, 5 просмотров)
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
13.05.2021, 09:56  [ТС]
Смотрю на ассемблерный код функции QuickSort после оптимизатора:

* функция сравнения встроена внутрь сортировки
* широко используются регистры
* практически нет push и pop
* адресация к локальным переменным идёт сразу по rsp
* какие‐то выравнивания, видимо процессор быстрее обсчитывает выровненные данные
* всего лишь один вызов сортировки QuickSort, в исходном коде два.

Добавлено через 33 минуты
locm, как в PureBasic принято измерять производительность участка кода с высокой точностью?
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,376
Записей в блоге: 7
13.05.2021, 11:33
Цитата Сообщение от Замабувараев Посмотреть сообщение
как в PureBasic принято измерять производительность участка кода с высокой точностью?
Можно использовать этот кроссплатформенный модуль. Разрешающая способность 1 мкс.
PureBasic
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : HighResTimer - Module
; File Name : HighResTimer - Module.pb
; File version: 1.0.0
; Programming : OK
; Programmed by : StarBootics
; Date : 06-08-2016
; Last Update : 06-08-2016
; PureBasic code : V5.50
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; This code was originally created by Guimauve to have a High Resolution 
; Timer. See : http://www.purebasic.fr/english/viewtopic.php?f=15&t=49365
;
; I deserve credit only to convert the original code into a Module.
;
; This code is free to be use where ever you like but you use it at your 
; own risk.
;
; The author can in no way be held responsible for data loss, damage or 
; other annoying situations that may occur.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 
DeclareModule HighResTimer
  
  Declare Initialize()
  Declare Reset()
  Declare Start()
  Declare Stop()
  Declare.q Consult()
  
EndDeclareModule
 
Module HighResTimer
  
  CompilerSelect #PB_Compiler_OS
      
    CompilerCase #PB_OS_Linux
      
      #CLOCK_MONOTONIC = 1
      
      Structure TimeSpec Align #PB_Structure_AlignC 
        Second.i
        NanoSecond.l
      EndStructure
      
      ImportC "-lrt"
        clock_gettime(ClockID.l, *TimeSpecA.TimeSpec)
      EndImport
      
    CompilerCase #PB_OS_MacOS
      
      Structure TimeBase Align #PB_Structure_AlignC 
        Numerator.l
        Denominator.l
      EndStructure
      
      ImportC ""
        mach_absolute_time.q()
        mach_timebase_info(*TimeBaseA.TimeBase)
      EndImport
      
  CompilerEndSelect
  
  Structure Instance Align #PB_Structure_AlignC 
    
    Stopped.b
    StartMicroSec.q
    StopMicroSec.q
    
    CompilerSelect #PB_Compiler_OS
        
      CompilerCase #PB_OS_Windows 
        Frequency.q
        StartCount.q
        EndCount.q
        
      CompilerCase #PB_OS_Linux
        StartCount.TimeSpec
        EndCount.TimeSpec
        
      CompilerCase #PB_OS_MacOS
        MicroSecConversion.d
        TimeBase.TimeBase
        StartCount.q
        EndCount.q
        
    CompilerEndSelect
    
  EndStructure
  
  Global Instance.Instance
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The New Operator <<<<<
  
  Procedure Initialize()
    
    Instance\Stopped = #True
    Instance\StartMicroSec = 0
    Instance\StopMicroSec = 0 
    
    CompilerSelect #PB_Compiler_OS
        
      CompilerCase #PB_OS_Windows 
        QueryPerformanceFrequency_(@Instance\Frequency)
        Instance\StartCount = 0
        Instance\EndCount = 0
        
      CompilerCase #PB_OS_Linux
        Instance\StartCount\Second = 0
        Instance\StartCount\NanoSecond = 0
        Instance\EndCount\Second = 0
        Instance\EndCount\NanoSecond = 0
        
      CompilerCase #PB_OS_MacOS
        mach_timebase_info(@Instance\TimeBase)
        Instance\MicroSecConversion = 1e-3 * Instance\TimeBase\Numerator / Instance\TimeBase\Denominator
        Instance\StartCount = 0
        Instance\EndCount = 0
        
    CompilerEndSelect
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Reset Operator <<<<<
  
  Procedure Reset()
    
    Instance\Stopped = 0
    Instance\StartMicroSec = 0
    Instance\StopMicroSec = 0 
    
    CompilerSelect #PB_Compiler_OS
        
      CompilerCase #PB_OS_Windows 
        Instance\Frequency = 0
        Instance\StartCount = 0
        Instance\EndCount = 0
        
      CompilerCase #PB_OS_Linux
        Instance\StartCount\Second = 0
        Instance\StartCount\NanoSecond = 0
        Instance\EndCount\Second = 0
        Instance\EndCount\NanoSecond = 0
        
      CompilerCase #PB_OS_MacOS
        Instance\MicroSecConversion = 0.0
        Instance\TimeBase\Numerator = 0
        Instance\TimeBase\Denominator = 0
        Instance\StartCount = 0
        Instance\EndCount = 0
        
    CompilerEndSelect
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Start operator <<<<<
  
  Procedure Start()
    
    Instance\Stopped = #False
    
    CompilerSelect #PB_Compiler_OS
        
      CompilerCase #PB_OS_Windows 
        QueryPerformanceCounter_(@Instance\StartCount)
        
      CompilerCase #PB_OS_Linux
        clock_gettime(#CLOCK_MONOTONIC, @Instance\StartCount)
        
      CompilerCase #PB_OS_MacOS
        Instance\StartCount = mach_absolute_time() * Instance\MicroSecConversion
        
    CompilerEndSelect
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Stop operator <<<<<
  
  Procedure Stop()
    
    Instance\Stopped = #True
    
    CompilerSelect #PB_Compiler_OS
        
      CompilerCase #PB_OS_Windows 
        QueryPerformanceCounter_(@Instance\EndCount)
        
      CompilerCase #PB_OS_Linux
        clock_gettime(#CLOCK_MONOTONIC, @Instance\EndCount)
        
      CompilerCase #PB_OS_MacOS
        Instance\EndCount = mach_absolute_time() * Instance\MicroSecConversion
        
    CompilerEndSelect
    
  EndProcedure
  
  ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  ; <<<<< The Consult Operator <<<<<
  
  Procedure.q Consult()
    
    CompilerSelect #PB_Compiler_OS
        
      CompilerCase #PB_OS_Windows 
        
        If Instance\Stopped = #False
          QueryPerformanceCounter_(@Instance\EndCount)
        EndIf
        
        Instance\StartMicroSec = Instance\StartCount * (1000000.0 / Instance\Frequency)
        Instance\StopMicroSec = Instance\EndCount * (1000000.0 / Instance\Frequency) 
        
      CompilerCase #PB_OS_Linux
        
        If Instance\Stopped = #False
          clock_gettime(#CLOCK_MONOTONIC, @Instance\EndCount)
        EndIf
        
        Instance\StartMicroSec = Instance\StartCount\Second * 1000000 + Instance\StartCount\NanoSecond / 1000
        Instance\StopMicroSec = Instance\EndCount\Second * 1000000 + Instance\EndCount\NanoSecond / 1000
        
      CompilerCase #PB_OS_MacOS
        
        If Instance\Stopped = #False
          Instance\EndCount = mach_absolute_time() * Instance\MicroSecConversion
        EndIf
        
        Instance\StartMicroSec = Instance\StartCount
        Instance\StopMicroSec = Instance\EndCount
        
    CompilerEndSelect
    
    ProcedureReturn Instance\StopMicroSec - Instance\StartMicroSec
  EndProcedure
  
EndModule
 
CompilerIf #PB_Compiler_IsMainFile
  
  HighResTimer::Initialize() ; <-- Mandatory to Initialize the timer before using it
  HighResTimer::Start()
  
  Delay(1)
  Debug HighResTimer::Consult()
  
  Delay(5)
  Debug HighResTimer::Consult()
  
  Delay(499)
  Debug HighResTimer::Consult()
  
  Delay(500)
  Debug HighResTimer::Consult()
  
  Delay(1499)
  Debug HighResTimer::Consult()
  
  Delay(1501)
  Debug HighResTimer::Consult()
  
  HighResTimer::Stop()
  HighResTimer::Reset()
  
CompilerEndIf
 
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<
Пример использования
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
UseModule HighResTimer
Initialize() ; Инициализация. Вызывается при старте программы.
 
Start()
Delay(2)
Debug Consult()
Stop()
 
Start()
Delay(18)
Debug Consult()
Stop()

Если достаточно разрешающей способности 1 мс. можно использовать функцию из библиотеки.
PureBasic
1
2
3
Time = ElapsedMilliseconds()
Delay(1000)
Debug ElapsedMilliseconds()-Time
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
20.05.2021, 08:05
Цитата Сообщение от Замабувараев Посмотреть сообщение
Странное решение запрещать оптимизацию только потому, что другие бейсики не умеют оптимизировать код или не отправляют абстрактное синтаксическое дерево в оптимизирующие утилиты.
Процесс пошёл. Фред решил таки расширить возможности PureBasic, делается поддержка всех типов процессоров путём подключения С компилятора. Ранние тесты в блоге пр PB:
А как насчет скорости компиляции? Мы используем GCC 8.1.0 без оптимизации (-O0) в Windows 10 x64 на Core i7 первого поколения для выполнения тестов. Мы компилируем программу DocMaker на 13000 строк с включенным отладчиком:

Бэкэнд GCC: около 3 секунд для создания исполняемого файла
Бэкэнд FASM: около 1 секунды для создания исполняемого файла
Так что это примерно в 3 раза медленнее, но все же хорошее время для разработки. Следующий тест - это большая программа PureBasic IDE с примерно 125 000 строк кода с включенным отладчиком. Мы также включаем в тесты Microsoft VisualC ++ 2015:

Бэкэнд GCC: около 24 секунд на создание исполняемого файла
Бэкэнд VC ++: около 9 секунд для создания исполняемого файла
Бэкэнд FASM: около 4 секунд на создание исполняемого файла
GCC намного медленнее, примерно в 6 раз, чем текущий бэкэнд FASM. Бэкэнд VC ++ примерно в 2 раза медленнее, что намного лучше, но не так уж и хорошо. В общем, бэкэнд FASM по-прежнему будет лучше использовать для быстрого цикла разработки. Имейте в виду, что это очень ранние тесты, и, как мы только что видели, простое переключение компилятора C может значительно увеличить время компиляции. На этом пока все, в следующий раз мы сосредоточимся на производительности во время выполнения между бэкэндами C и FASM!
Тест производительности 3D rendering (through OGRE) показал, что:
PureBasic x64 – C Back-end with optimizer enabled (-02) : 298 FPS
PureBasic x64 – assembly back-end : 192 FPS
Т.О. простое переключение компилятора на С даёт прирост почти на половину
Еще один интересный момент - скорость исполняемого файла бэкэнд C без оптимизации (-O0) также составляла 192 кадра в секунду, как и у сборочной бэкэнд PureBasic. Неплохо для компилятора небольшой команды!

Сегодня вышла для теста новая версия PureBasic 6.00 Alpha 1 x64, которую реально можно пощупать руками, потестить, сравнить скорость, оптимизацию, размер и т.п.
1
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
20.05.2021, 08:55  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Бэкэнд GCC: около 3 секунд для создания исполняемого файла
Странное сравнение, ведь в цепочке сгенерированных файлов появляется дополнительный уровень замедления:
GCC = *.c → *.asm → *.o → *.exe
FASM = *.asm → *.o → *.exe

Четыре всегда больше чем три, как ни крути.


Почему GCC, а не LLVM? У LLVM есть достоинства:
* поддерживается могущественными транснациональными корпорациями типа Apple и GUGLE
* развивается быстрее
* промежуточное представление (ll‐код) — это не язык Си, отпадает нужда представлять данные и код в стиле Си
* лучше оптимизирует код
Говорили ли разработчики причины почему они выбрали GCC, а не LLVM?
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,376
Записей в блоге: 7
20.05.2021, 10:09
Цитата Сообщение от Замабувараев Посмотреть сообщение
GCC = *.c → *.asm → *.o → *.exe
Думаю что GCC = *.c → *.o → *.exe потому что нет смысла транслировать в асм, если логичнее сразу в машинные коды.

Цитата Сообщение от Замабувараев Посмотреть сообщение
Почему GCC, а не LLVM?
Чуть выше написано что в тестах также использовался VC++. Про LLVM есть ответ в блоге https://www.purebasic.fr/blog/?p=480
Когда Apple объявила, что их новые компьютеры будут работать на ARM, мы знали, что нам нужно изменить способ работы с новой архитектурой процессоров, и мы решили использовать уже проделанную работу над SpiderBasic и перенести ее обратно на PureBasic. Мы довольно долго экспериментировали с LLVM, но найти его на всех архитектурах - головная боль. Кроме того, это своего рода смесь ассемблерного кода и языка высокого уровня, поэтому он не подходил ни для PureBasic, ни для внутренней архитектуры SpiderBasic. В течение последних 8 месяцев мы решили сосредоточиться на новом высокоуровневом back-end для PureBasic языке C.
Небольшой тест с вычислением числа PI с 20 тысяч знаков после запятой. Трансляция в Си дает двукратное увеличение производительности.
Вложения
Тип файла: zip PI.zip (15.3 Кб, 16 просмотров)
0
Эксперт по электронике
6524 / 3153 / 332
Регистрация: 28.10.2011
Сообщений: 12,376
Записей в блоге: 7
20.05.2021, 12:28
Цитата Сообщение от locm Посмотреть сообщение
Тогда в чем смысл сравнивать скорость если она в конечном итоге зависит не от компилятора бейсика, а от Си?
Я был прав. PB с трансляцией в Си выдал аналогичный результат что и FB.
Вложения
Тип файла: zip Sort.zip (8.7 Кб, 36 просмотров)
0
COM‐пропагандист
 Аватар для Замабувараев
936 / 785 / 149
Регистрация: 18.12.2014
Сообщений: 2,256
Записей в блоге: 4
20.05.2021, 13:48  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Думаю что GCC = *.c → *.o → *.exe потому что нет смысла транслировать в асм, если логичнее сразу в машинные коды.
Нет. Компилятор GCC не создаёт объектные файлы напрямую, он создаёт ассемблерный код.
Я только что переименовал as.exe в _as.exe, и gcc.exe выдал такоэ:

Code
1
2
gcc.exe: fatal error: cannot execute 'as': CreateProcess: No such file or directory
compilation terminated.
Цитата Сообщение от locm Посмотреть сообщение
это своего рода смесь ассемблерного кода и языка высокого уровня, поэтому он не подходил ни для PureBasic, ни для внутренней архитектуры SpiderBasic
Такие разные по своей природе языки как ActionScript, Ада, C#, Common Lisp, Crystal, CUDA, D, Delphi, Dylan, Fortran, Graphical G Programming Language, Halide, Haskell, Java (байткод), JavaScript, Julia, Kotlin, Lua, Objective-C, OpenGL Shading Language, Ruby, Rust, Scala, Swift, Xojo могут быть представлены через код промежуточного представления LLVM
Слышать, что PureBasic не может — это очень странное заявление.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.05.2021, 13:48
Помогаю со студенческими работами здесь

Как сравнить эффективность сгенерированного кода Си VS2003 VS Pelles C ver.7
Как сравнить эффективность сгенерированного кода Си VS2003 VS Pelles C ver.7 ? Насколько быстрый код и у кого?

Как преобразовать класс из динамически сгенерированного кода в локальный класс?
Исходные данные: Форма, на ней кнопка, по нажатию на которую компилируется программа, совершает расчёты, возвращает результат. ...

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

Подкрашивание ячеек для быстроты отбора данных
Подскажите юному познавателю Excel)) Поставлено на работе такое задание, а именно условное форматирование на листе в столбце доза СЗР так...

Какие сервисы можно преспокойно выключить для быстроты загрузки?
В литературе Колисниченко не все сервисы описаны, и к тому же на английском. Я могу только Блутуз выключить, не пропаду ) И проверка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru