File tree Expand file tree Collapse file tree 2 files changed +46
-0
lines changed Expand file tree Collapse file tree 2 files changed +46
-0
lines changed Original file line number Diff line number Diff line change @@ -31,6 +31,7 @@ export default defineConfig({
31
31
{ text : "Хвостовая рекурсия" , link : "/tailcall" } ,
32
32
{ text : "Конструкторы" , link : "/constructor" } ,
33
33
{ text : "Параметры выполнения" , link : "/runparams" } ,
34
+ { text : "Performance" , link : "/performance" } ,
34
35
] ,
35
36
} ,
36
37
{
Original file line number Diff line number Diff line change
1
+ # Performance
2
+
3
+ Стоит понимать, что оптимизирующий компилятор OCaml'а хоть и имеет под собой достаточно теории,
4
+ но всё равно не сравниться с LLVM или GCC.
5
+
6
+ > [ !NOTE] Документация
7
+ >
8
+ > - [ OCaml guide: Profiling] ( https://ocaml.org/docs/profiling )
9
+
10
+ ## Склейка строк
11
+
12
+ Если вам требуется склеить больше двух строк &mdash ; не используйте оператор ` Stdlib.(^) ` .
13
+ Заместо него используйте модули ` Format ` , ` Printf ` или подобное.
14
+
15
+ > [ !NOTE] Пример
16
+ >
17
+ > ``` ocaml
18
+ > (* Плохо! *)
19
+ > let greet name =
20
+ > (* Почему: две аллокации (по одной на каждую склейку) *)
21
+ > print_endline @@ "Привет, " ^ name ^ "!"
22
+ >
23
+ > (* Хорошо *)
24
+ > let greet name =
25
+ > (* Почему: примерно одна аллокация *)
26
+ > Printf.printf "Привет, %s!\n" name
27
+ > ```
28
+
29
+ Компилятор никак не сворачивает строковые константы, то есть склейка констант производится в рантайме!
30
+ Будьте осторожны.
31
+
32
+ :::details Микрооптимизации
33
+
34
+ Использование буфера дает явный контроль над выделением памяти.
35
+
36
+ ```ocaml
37
+ let greet name =
38
+ let buf = Buffer.create (16 + String.length name) in
39
+ Buffer.add_string buf "Привет, ";
40
+ Buffer.add_string buf name;
41
+ Buffer.add_string buf "!\n";
42
+ Buffer.output_buffer stdout buf
43
+ ```
44
+
45
+ :::
You can’t perform that action at this time.
0 commit comments