Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/47: Рейтинг темы: голосов - 47, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 18.09.2017
Сообщений: 46

Замер времени выполнения функции postgres

11.01.2018, 09:55. Показов 10206. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, у меня есть функция в которой 2 цикла for и в каждом этом цикле есть еще 2 внутренних цикла. Нужно замерить каждый блок (цикл) и узнать какой тормозит. Как это сделать?

Своими силами пытался сделать через clock_timestamp() - присваивал переменной, а потом вычитал из clock_timestamp() эту переменную и выводил raise notice, но такой способ не всегда работает правильно.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.01.2018, 09:55
Ответы с готовыми решениями:

Замер времени выполнения функции на ядре
Здравствуйте! Не могу понять почему не считает время выполнения алгоритма на ядре какие бы я значения z и x не вводила бы. Каждый раз время...

Замер времени выполнения программного кода
Как замерить время выполнения этого программного кода (в секундах) и вывести его на экран? Как провести оптимизацию, чтобы время...

Наиболее точный замер времени выполнения кода
Всех приветствую! Мужики, возник вот такой вопрос. Первый код: Dim str As String For i As Integer = 0 To 9999 ...

9
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
11.01.2018, 16:34
Лучший ответ Сообщение было отмечено krazy-8 как решение

Решение

Хоть примеры приведите, чтобы можно было проверить.
Вообще clock_timestamp, пожалуй, единственная функция, которая дает время в независимости от выполняемого выражения и транзакции, как другие похоже функции.
так что вызов вы делаете верный, а почему неверный результат получаете, непонятно.
1
0 / 0 / 0
Регистрация: 18.09.2017
Сообщений: 46
12.01.2018, 09:19  [ТС]
grgdvo, У меня получается что замер времени внутреннего цикла происходит только один раз(на последнем выполнении внешнего цикла), получается нужно как-то складывать эти замеры. В конец внешнего цикла добавил этот счетчик:

SQL
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
CREATE OR REPLACE FUNCTION flc(p_report_id NUMERIC DEFAULT NULL::NUMERIC)
 RETURNS text
 LANGUAGE plpgsql
AS $function$
DECLARE
    rec                                     record;
    res                                     record;
    l_result                                text:= '';
    l_cell_coordinates                      text:= '';
    l_message_text                          text:= NULL;
  l_pg_exception_context                    text:= NULL;
  l_flc_formula                             text:= NULL;
  l_check                                   NUMERIC:= NULL;     
  l_for_day                                 TIMESTAMP:= CURRENT_TIMESTAMP;
  vrem                                      TIMESTAMP:= CURRENT_TIMESTAMP;
  vrem1                                     TIMESTAMP:= CURRENT_TIMESTAMP;
  vrem2                                     TIMESTAMP:= CURRENT_TIMESTAMP;
  vrem11                                    TIMESTAMP:= CURRENT_TIMESTAMP;
  vrem22                                    TIMESTAMP:= CURRENT_TIMESTAMP;  
BEGIN
    vrem:=clock_timestamp();
    FOR rec IN (
        SELECT  flc.sl_form_flc_id,
                        sl_form_flc_formula,
                        sl_form_flc_message
        FROM      sl_report rep
        JOIN        sl_frm_inp_per_link fpl ON fpl.sl_frm_inp_per_link_id = rep.sl_frm_inp_per_link_id
        JOIN        sl_form_flc flc ON flc.sl_form_id = fpl.sl_form_id
                                                        AND flc.sl_form_flc_type_id = 2 
                                                        AND flc.is_enabled = 1
        WHERE       rep.sl_report_id = p_report_id)
            loop
                
                l_flc_formula := rec.sl_form_flc_formula;
                vrem1:=clock_timestamp();
                FOR res IN (
                    SELECT  ffcl.sl_form_cell_id,
                                COALESCE(CAST(rd.val AS text), '0') val
                    FROM        sl_form_flc_cell_link ffcl
                LEFT JOIN   sl_report_data rd ON rd.sl_form_cell_id = ffcl.sl_form_cell_id
                                                                        AND rd.sl_report_id = p_report_id
                                                                        AND rd.active_from <= l_for_day
                                                                        AND rd.active_to > l_for_day
                WHERE       ffcl.sl_form_flc_id = rec.sl_form_flc_id)
                    loop
                    
                        l_flc_formula := REPLACE(l_flc_formula, '['||res.sl_form_cell_id||']', res.val);
    
                    END loop;
                vrem2:=clock_timestamp();
            EXECUTE 'select '||l_flc_formula INTO l_check;
            
            IF l_check = 0 THEN
            
                IF LENGTH(l_result) = 0 THEN
                    l_result := '4Ошибка предупредительного ФЛК:</br>';
                END IF;
 
                l_result := l_result||rec.sl_form_flc_message;
                
                l_cell_coordinates := '';
                vrem11:=clock_timestamp();
                FOR res IN (
                    SELECT  fcl.sl_form_row_id||','||fcl.sl_form_col_id cell_coordinates
                        FROM        sl_form_flc_cell_link ffcl
                        JOIN        sl_form_cell fcl ON fcl.sl_form_cell_id = ffcl.sl_form_cell_id
                    WHERE       ffcl.sl_form_flc_id = rec.sl_form_flc_id)
                        loop
                        
                            l_cell_coordinates := l_cell_coordinates||res.cell_coordinates||'|';
                        END loop;
                        vrem22:=clock_timestamp();
                IF LENGTH(l_cell_coordinates) <> 0 THEN
                    l_cell_coordinates := '{'||substr(l_cell_coordinates, 1, LENGTH(l_cell_coordinates)-1)||'}';
                END IF;
                        
                l_result := l_result||l_cell_coordinates||'</br>';
                
            END IF;
vrem111:=vrem2-vrem1+vrem111;
vrem222:=vrem22-vrem11+vrem222;
END loop;
            raise notice '%', '--------------------------------------------------------------------------------';
            raise notice '% проверка предупредительного флк', clock_timestamp()-vrem;
            raise notice '% проверка первого внутреннего цикла предупредительного флк', vrem11;
            raise notice '% проверка второго внутреннего цикла запретительные флк', vrem222;
            raise notice '%', '--------------------------------------------------------------------------------';
            raise notice '%', '--------------------------------------------------------------------------------';
    vrem:=clock_timestamp();
    IF LENGTH(l_result) <> 0 THEN
        RETURN l_result;
    ELSE
        RETURN '0';
    END IF;
raise notice '% проверка l_result предупредительного флк', clock_timestamp()-vrem;
END
$function$

вывел это, как теперь преобразовать дату, а то не понятно даже правильно ли вообще получилось:
00000: --------------------------------------------------------------------------------
00000: 00:00:01.664481 проверка предупредительного флк
00000: 2018-01-12 11:06:42.59514 проверка первого внутреннего цикла предупредительного флк
00000: 2018-01-12 11:06:40.946994 проверка второго внутреннего цикла запретительные флк
00000: --------------------------------------------------------------------------------
00000: --------------------------------------------------------------------------------
0
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
12.01.2018, 16:03
Лучший ответ Сообщение было отмечено krazy-8 как решение

Решение

строки 80 и 81: vrem111 и vrem222 вообще не объявлены, объявите их типом interval, вы же разницу считаете между двумя контрольными точками.
строка 80: vrem111:= (vrem2-vrem1) + vrem111; % скобки на всякий случай, чтобы результат был interval
строка 81: vrem222:= (vrem22-vrem11) + vrem222; % аналогично
строка 85: должна быть переменная vrem111, а не vrem11
строка 95: никогда не выполнится, работает return раньше при любом ветвлении

основная мысль, использовать тип данных interval для vrem111 и vrem222 для накопительной суммы времени выполнения подциклов
1
0 / 0 / 0
Регистрация: 18.09.2017
Сообщений: 46
12.01.2018, 16:26  [ТС]
grgdvo, Не понятно с этими типами данных у даты и времени, почему у разницы и суммы между ними типы разные?
0
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
12.01.2018, 16:37
Лучший ответ Сообщение было отмечено krazy-8 как решение

Решение

timestamp - timestamp = interval
interval + timestamp = timestamp

так по умолчанию
1
0 / 0 / 0
Регистрация: 18.09.2017
Сообщений: 46
12.01.2018, 16:53  [ТС]
grgdvo, все поправил, только почему то теперь у меня показывает что внутренний цикл дольше выполняется чем вешний, хотя такого быть не может :/

Добавлено через 4 минуты
Откуда целая секунда взялась?

00000: 00:00:01.680558 замер времени выполнения внешнего цикла предупредительного флк:
00000: 00:00:00.001447 замер времени формирования l_flc_formula внешнего цикла предупредительного флк
00000: 00:00:02.650421 замер времени выполнения первого внутреннего цикла предупредительного флк
00000: 00:00:00.018031 замер времени формирования execute внешнего цикла предупредительного флк
0
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
13.01.2018, 08:19
Лучший ответ Сообщение было отмечено krazy-8 как решение

Решение

покажите еще раз полный исправленный исходник. может где-то просто опечатка.
1
0 / 0 / 0
Регистрация: 18.09.2017
Сообщений: 46
13.01.2018, 09:02  [ТС]
grgdvo, Вот вся функция строки 129-142, 179

SQL
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
CREATE OR REPLACE FUNCTION prm_salary.pkg_web_salary_form_check_flc(p_report_id NUMERIC DEFAULT NULL::NUMERIC)
 RETURNS text
 LANGUAGE plpgsql
AS $function$
DECLARE
    rec                                     record;
    res                                     record;
    l_result                                text:= '';
    l_cell_coordinates                      text:= '';
    l_message_text                          text:= NULL;
  l_pg_exception_context                    text:= NULL;
  l_flc_formula                             text:= NULL;
  l_check                                   NUMERIC:= NULL;     
  l_for_day                                 TIMESTAMP:= CURRENT_TIMESTAMP;
  vrem                                      TIMESTAMP:= CURRENT_TIMESTAMP;
  vrem0                                     TIMESTAMP;
  vrem1                                     TIMESTAMP;
  vrem2                                     TIMESTAMP;
  vrem3                                     TIMESTAMP;
  vrem4                                     TIMESTAMP;
  vrem5                                     TIMESTAMP;
  vrem_res1                                 INTERVAL:= 0;
  vrem_res2                                 INTERVAL:= 0;
  vrem_l_flc_formula                        INTERVAL:= 0;
  vrem_execute                              INTERVAL:= 0;
  vrem_start                                TIMESTAMP;
  vrem_finish                               TIMESTAMP;
BEGIN
    vrem:=clock_timestamp();
    IF p_report_id IS NULL THEN
        RETURN '1Не определен идентификатор отчетной формы!';
    END IF;
    raise notice '% проверка p_report_id на null', clock_timestamp()-vrem;    
 
 
    -- выполняем запретительные флк, собираем их все через </br>    
    vrem_start:=clock_timestamp();
    FOR rec IN (
        SELECT  flc.sl_form_flc_id,
                        sl_form_flc_formula,
                        sl_form_flc_message
        FROM      sl_report rep
        JOIN        sl_frm_inp_per_link fpl ON fpl.sl_frm_inp_per_link_id = rep.sl_frm_inp_per_link_id
        JOIN        sl_form_flc flc ON flc.sl_form_id = fpl.sl_form_id
                                                        AND flc.sl_form_flc_type_id = 1 
                                                        AND flc.is_enabled = 1
        WHERE       rep.sl_report_id = p_report_id)
            loop
                vrem0:=clock_timestamp();
                l_flc_formula := rec.sl_form_flc_formula;
                vrem1:=clock_timestamp();
                FOR res IN (
                    SELECT  ffcl.sl_form_cell_id,
                                COALESCE(CAST(rd.val AS text), '0') val
                    FROM        sl_form_flc_cell_link ffcl
                LEFT JOIN   sl_report_data rd ON rd.sl_form_cell_id = ffcl.sl_form_cell_id
                                                                        AND rd.sl_report_id = p_report_id
                                                                        AND rd.active_from <= l_for_day
                                                                        AND rd.active_to > l_for_day
                WHERE       ffcl.sl_form_flc_id = rec.sl_form_flc_id)
                    loop
                        l_flc_formula := REPLACE(l_flc_formula, '['||res.sl_form_cell_id||']', res.val);
                    END loop;
                vrem2:=clock_timestamp();
            EXECUTE 'select '||l_flc_formula INTO l_check;
            vrem3:=clock_timestamp();
            IF l_check = 0 THEN
 
                IF LENGTH(l_result) = 0 THEN
                    l_result := '4Ошибка запретительного ФЛК:</br>';
                END IF;
 
                l_result := l_result||rec.sl_form_flc_message;
                
                l_cell_coordinates := '';
                vrem4:=clock_timestamp();
                FOR res IN (
                    SELECT  fcl.sl_form_row_id||','||fcl.sl_form_col_id cell_coordinates
                        FROM        sl_form_flc_cell_link ffcl
                        JOIN        sl_form_cell fcl ON fcl.sl_form_cell_id = ffcl.sl_form_cell_id
                    WHERE       ffcl.sl_form_flc_id = rec.sl_form_flc_id)
                        loop
                        
                            l_cell_coordinates := l_cell_coordinates||res.cell_coordinates||'|';
                        END loop;
                        vrem5:=clock_timestamp();
                IF LENGTH(l_cell_coordinates) <> 0 THEN
                    l_cell_coordinates := '{'||substr(l_cell_coordinates, 1, LENGTH(l_cell_coordinates)-1)||'}';
                END IF;
                        
                l_result := l_result||l_cell_coordinates||'</br>';
                
            END IF;
            vrem_res1:=(vrem2-vrem1)+vrem_res1;
            vrem_res2:=(vrem5-vrem4)+vrem_res2;
            vrem_l_flc_formula:=(vrem1-vrem0)+vrem_l_flc_formula;
            vrem_execute:=(vrem3-vrem2)+vrem_execute;
            END loop;
            vrem_finish:=clock_timestamp();
            raise notice '% замер времени выполнения внешнего цикла запретительного флк:',                   vrem_finish-vrem_start;
            raise notice '% замер времени формирования l_flc_formula внешнего цикла запретительного флк', vrem_l_flc_formula;
            raise notice '% замер времени выполнения первого внутреннего цикла запретительного флк',       vrem_res1;
            raise notice '% замер времени формирования execute внешнего цикла запретительного флк',    vrem_execute;
            raise notice '% замер времени выполнения второго внутреннего цикла запретительные флк',     vrem_res2;
    vrem:=clock_timestamp();
    IF LENGTH(l_result) <> 0 THEN
        RETURN l_result;
    END IF;
raise notice '% проверка l_result запретительного флк', clock_timestamp()-vrem;   
raise notice '%', '--------------------------------------------------------------------------------------------';
raise notice '%', '--------------------------------------------------------------------------------------------';
 
 
    -- выполняем предупредительные флк, собираем их все через </br>  
    vrem_start:=clock_timestamp();
    FOR rec IN (
        SELECT  flc.sl_form_flc_id,
                        sl_form_flc_formula,
                        sl_form_flc_message
        FROM      sl_report rep
        JOIN        sl_frm_inp_per_link fpl ON fpl.sl_frm_inp_per_link_id = rep.sl_frm_inp_per_link_id
        JOIN        sl_form_flc flc ON flc.sl_form_id = fpl.sl_form_id
                                                        AND flc.sl_form_flc_type_id = 2 
                                                        AND flc.is_enabled = 1
        WHERE       rep.sl_report_id = p_report_id)
            loop
                vrem0:=clock_timestamp();
                l_flc_formula := rec.sl_form_flc_formula;
                vrem1:=clock_timestamp();
                FOR res IN (
                    SELECT  ffcl.sl_form_cell_id,
                                COALESCE(CAST(rd.val AS text), '0') val
                    FROM        sl_form_flc_cell_link ffcl
                LEFT JOIN   sl_report_data rd ON rd.sl_form_cell_id = ffcl.sl_form_cell_id
                                                                        AND rd.sl_report_id = p_report_id
                                                                        AND rd.active_from <= l_for_day
                                                                        AND rd.active_to > l_for_day
                WHERE       ffcl.sl_form_flc_id = rec.sl_form_flc_id)
                    loop
                        l_flc_formula := REPLACE(l_flc_formula, '['||res.sl_form_cell_id||']', res.val);    
                    END loop;
            vrem2:=clock_timestamp();
            EXECUTE 'select '||l_flc_formula INTO l_check;
            vrem3:=clock_timestamp();
            IF l_check = 0 THEN
 
                IF LENGTH(l_result) = 0 THEN
                    l_result := '4Ошибка предупредительного ФЛК:</br>';
                END IF;
 
                l_result := l_result||rec.sl_form_flc_message;
                
                l_cell_coordinates := '';
                vrem4:=clock_timestamp();
                FOR res IN (
                    SELECT  fcl.sl_form_row_id||','||fcl.sl_form_col_id cell_coordinates
                        FROM        sl_form_flc_cell_link ffcl
                        JOIN        sl_form_cell fcl ON fcl.sl_form_cell_id = ffcl.sl_form_cell_id
                    WHERE       ffcl.sl_form_flc_id = rec.sl_form_flc_id)
                        loop
                            l_cell_coordinates := l_cell_coordinates||res.cell_coordinates||'|';
                        END loop;
                        vrem5:=clock_timestamp();
                IF LENGTH(l_cell_coordinates) <> 0 THEN
                    l_cell_coordinates := '{'||substr(l_cell_coordinates, 1, LENGTH(l_cell_coordinates)-1)||'}';
                END IF;
                        
                l_result := l_result||l_cell_coordinates||'</br>';
                
            END IF;
            vrem_res1:=(vrem2-vrem1)+vrem_res1;
            vrem_res2:=(vrem5-vrem4)+vrem_res2;
            vrem_l_flc_formula:=(vrem1-vrem0)+vrem_l_flc_formula;
            vrem_execute:=(vrem3-vrem2)+vrem_execute;
            END loop;
            vrem_finish:=clock_timestamp();
            raise notice '% замер времени выполнения внешнего цикла предупредительного флк:',                vrem_finish-vrem_start;
            raise notice '% замер времени формирования l_flc_formula внешнего цикла предупредительного флк', vrem_l_flc_formula;
            raise notice '% замер времени выполнения первого внутреннего цикла предупредительного флк',    vrem_res1;
            raise notice '% замер времени формирования execute внешнего цикла предупредительного флк',         vrem_execute;
            raise notice '% замер времени выполнения второго внутреннего цикла предупредительного флк',    vrem_res2;
            raise notice '%', '-----------------------------------------------------------------------------------------------';
            raise notice '%', '-----------------------------------------------------------------------------------------------';
    vrem:=clock_timestamp();
    IF LENGTH(l_result) <> 0 THEN
        RETURN l_result;
    ELSE
        RETURN '0';
    END IF;
    raise notice '% проверка l_result предупредительного флк', clock_timestamp()-vrem;
 
 
exception
  WHEN others THEN
    GET stacked diagnostics
      l_message_text = message_text,
      l_pg_exception_context := pg_exception_context;  
    RETURN '2message_text: '||l_message_text||'; pg_exception_context: '||l_pg_exception_context;
END
$function$
0
1264 / 978 / 384
Регистрация: 02.09.2012
Сообщений: 3,021
14.01.2018, 23:35
Лучший ответ Сообщение было отмечено krazy-8 как решение

Решение

Код очень большой, но сдается мне, что перед выполнение второй части процедуры нужно обнулить значения

SQL
1
2
3
4
vrem_res1:=0;
vrem_res2:=0;
vrem_l_flc_formula:= 0;
vrem_execute := 0
иначе вы продолжаете суммировать от первой части, а это неверно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.01.2018, 23:35
Помогаю со студенческими работами здесь

Замер времени(тактов процессора) выполнения процедуры
Почему то замер дает отрицательный результат (при просмотре в режиме дебаг) и на выходе 0 в итоге. clock_t start, end; start =...

Замер выполнения кода (разница времени между контрольными точками)
нагуглил my $start_time = ; # код my $delta = tv_interval($start_time); print $delta; в результате какое-то...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока кода/отдельной функции или процедуры/программы...

Замер времени работы функции через clock()
Имеется некая функция, требуется замерить время её выполнения. Накидал такой код : #include &lt;iostream&gt; #include...

Замер выполнения алгоритма!
Здравствуйте! В свете недавнего релиза Java 8 захотелось сделать сравнение производительности, нужен совет по поводу замера времени...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru