Skip to content

Commit 189833a

Browse files
committed
Добавлена инфа про перфоманс склейки строк
1 parent 9a0af69 commit 189833a

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

docs/.vitepress/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export default defineConfig({
3131
{ text: "Хвостовая рекурсия", link: "/tailcall" },
3232
{ text: "Конструкторы", link: "/constructor" },
3333
{ text: "Параметры выполнения", link: "/runparams" },
34+
{ text: "Performance", link: "/performance" },
3435
],
3536
},
3637
{

docs/recipes/performance.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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+
Если вам требуется склеить больше двух строк — не используйте оператор `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+
:::

0 commit comments

Comments
 (0)