Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
6951-Efficiency-Guide-Add-more-examples-for-bin...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 6951-Efficiency-Guide-Add-more-examples-for-binaries.patch of Package erlang
From 27645040e29aef98a3bb6f4862c067146973ef87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Gustavsson?= <bjorn@erlang.org> Date: Thu, 16 Mar 2023 10:27:31 +0100 Subject: [PATCH] Efficiency Guide: Add more examples for binaries --- .../doc/efficiency_guide/binaryhandling.xml | 52 ++++++++++++++++++- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/system/doc/efficiency_guide/binaryhandling.xml b/system/doc/efficiency_guide/binaryhandling.xml index c0f7a36375..8cb7e7834b 100644 --- a/system/doc/efficiency_guide/binaryhandling.xml +++ b/system/doc/efficiency_guide/binaryhandling.xml @@ -32,7 +32,12 @@ <file>binaryhandling.xml</file> </header> - <p>Binaries can be efficiently built in the following way:</p> + <p>This section gives a few examples on how to handle binaries in an + efficient way. The sections that follow take an in-depth look at how + binaries are implemented and how to best take advantages of the + optimizations done by the compiler and runtime system.</p> + + <p>Binaries can be efficiently <em>built</em> in the following way:</p> <p><em>DO</em></p> <code type="erl"><![CDATA[ @@ -44,7 +49,50 @@ my_list_to_binary([H|T], Acc) -> my_list_to_binary([], Acc) -> Acc.]]></code> - <p>Binaries can be efficiently matched like this:</p> + <p>Appending data to a binary as in the example is efficient because + it is specially optimized by the runtime system to avoid copying the + <c>Acc</c> binary every time.</p> + + <p>Prepending data to a binary in a loop is not efficient:</p> + + <p><em>DO NOT</em></p> + <code type="erl"><![CDATA[ +rev_list_to_binary(List) -> + rev_list_to_binary(List, <<>>). + +rev_list_to_binary([H|T], Acc) -> + rev_list_to_binary(T, <<H,Acc/binary>>); +rev_list_to_binary([], Acc) -> + Acc.]]></code> + + <p>This is not efficient for long lists because the <c>Acc</c> + binary is copied every time. One way to make the function more + efficient is like this:</p> + + <p><em>DO NOT</em></p> + <code type="erl"><![CDATA[ +rev_list_to_binary(List) -> + rev_list_to_binary(lists:reverse(List), <<>>). + +rev_list_to_binary([H|T], Acc) -> + rev_list_to_binary(T, <<Acc/binary,H>>); +rev_list_to_binary([], Acc) -> + Acc.]]></code> + + <p>Another way to avoid copying the binary each time is like this:</p> + + <p><em>DO</em></p> + <code type="erl"><![CDATA[ +rev_list_to_binary([H|T]) -> + RevTail = rev_list_to_binary(T), + <<RevTail/binary,H>>; +rev_list_to_binary([]) -> + <<>>.]]></code> + + <p>Note that in each of the <em>DO</em> examples, the binary to be + appended to is always given as the first segment.</p> + + <p>Binaries can be efficiently <em>matched</em> in the following way:</p> <p><em>DO</em></p> <code type="erl"><![CDATA[ -- 2.35.3
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor