diff options
Diffstat (limited to 'system/doc/efficiency_guide')
-rw-r--r-- | system/doc/efficiency_guide/advanced.xml | 27 | ||||
-rw-r--r-- | system/doc/efficiency_guide/appendix.xml | 2 | ||||
-rw-r--r-- | system/doc/efficiency_guide/binaryhandling.xml | 8 | ||||
-rw-r--r-- | system/doc/efficiency_guide/commoncaveats.xml | 8 | ||||
-rw-r--r-- | system/doc/efficiency_guide/drivers.xml | 4 | ||||
-rw-r--r-- | system/doc/efficiency_guide/functions.xml | 12 | ||||
-rw-r--r-- | system/doc/efficiency_guide/myths.xml | 6 | ||||
-rw-r--r-- | system/doc/efficiency_guide/processes.xml | 10 | ||||
-rw-r--r-- | system/doc/efficiency_guide/profiling.xml | 18 | ||||
-rw-r--r-- | system/doc/efficiency_guide/tablesDatabases.xml | 8 |
10 files changed, 54 insertions, 49 deletions
diff --git a/system/doc/efficiency_guide/advanced.xml b/system/doc/efficiency_guide/advanced.xml index 0ec3afbd59..821175bb09 100644 --- a/system/doc/efficiency_guide/advanced.xml +++ b/system/doc/efficiency_guide/advanced.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2001</year><year>2009</year> + <year>2001</year><year>2011</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -13,12 +13,12 @@ compliance with the License. You should have received a copy of the Erlang Public License along with this software. If not, it can be retrieved online at http://www.erlang.org/. - + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. - + </legalnotice> <title>Advanced</title> @@ -34,7 +34,7 @@ <p>A good start when programming efficiently is to have knowledge about how much memory different data types and operations require. It is implementation-dependent how much memory the Erlang data types and - other items consume, but here are some figures for + other items consume, but here are some figures for the erts-5.2 system (OTP release R9B). (There have been no significant changes in R13.)</p> @@ -47,11 +47,13 @@ <cell align="center" valign="middle">Memory size</cell> </row> <row> - <cell align="left" valign="middle">Integer (-16#7FFFFFF < i <16#7FFFFFF)</cell> - <cell align="left" valign="middle">1 word</cell> + <cell align="left" valign="middle">Small integer</cell> + <cell align="left" valign="middle">1 word<br></br> +On 32-bit architectures: -134217729 < i < 134217728 (28 bits)<br></br> +On 64-bit architectures: -576460752303423489 < i < 576460752303423488 (60 bits)</cell> </row> <row> - <cell align="left" valign="middle">Integer (big numbers)</cell> + <cell align="left" valign="middle">Big integer</cell> <cell align="left" valign="middle">3..N words</cell> </row> <row> @@ -72,11 +74,11 @@ On 64-bit architectures: 3 words</cell> </row> <row> <cell align="left" valign="middle">List</cell> - <cell align="left" valign="middle">1 word per element + the size of each element</cell> + <cell align="left" valign="middle">1 word + 1 word per element + the size of each element</cell> </row> <row> <cell align="left" valign="middle">String (is the same as a list of integers)</cell> - <cell align="left" valign="middle">2 words per character</cell> + <cell align="left" valign="middle">1 word + 2 words per character</cell> </row> <row> <cell align="left" valign="middle">Tuple</cell> @@ -154,7 +156,8 @@ On 64-bit architectures: 4 words for a reference from the current local node, an <item>255</item> <tag><em>Atoms </em></tag> <item> <marker id="atoms"></marker> -The maximum number of atoms is 1048576. </item> + By default, the maximum number of atoms is 1048576. + This limit can be raised or lowered using the <c>+t</c> option.</item> <tag><em>Ets-tables</em></tag> <item>The default is 1400, can be changed with the environment variable <c>ERL_MAX_ETS_TABLES</c>.</item> <tag><em>Elements in a tuple</em></tag> @@ -175,7 +178,7 @@ The maximum number of atoms is 1048576. </item> <tag><em>Total amount of data allocated by an Erlang node</em></tag> <item>The Erlang runtime system can use the complete 32 (or 64) bit address space, but the operating system often limits a single process to use less than that.</item> - <tag><em>length of a node name</em></tag> + <tag><em>Length of a node name</em></tag> <item>An Erlang node name has the form host@shortname or host@longname. The node name is used as an atom within the system so the maximum size of 255 holds for the node name too.</item> <tag><em>Open ports</em></tag> @@ -197,7 +200,7 @@ The maximum number of atoms is 1048576. </item> <seealso marker="#ports">the maximum number of Erlang ports</seealso> available, and operating system specific settings and limits.</item> <tag><em>Number of arguments to a function or fun</em></tag> - <item>256</item> + <item>255</item> </taglist> </section> </chapter> diff --git a/system/doc/efficiency_guide/appendix.xml b/system/doc/efficiency_guide/appendix.xml index 631ef9bee7..6eaaeffbc4 100644 --- a/system/doc/efficiency_guide/appendix.xml +++ b/system/doc/efficiency_guide/appendix.xml @@ -5,7 +5,7 @@ <header> <copyright> <year>2002</year> - <year>2007</year> + <year>2011</year> <holder>Ericsson AB, All Rights Reserved</holder> </copyright> <legalnotice> diff --git a/system/doc/efficiency_guide/binaryhandling.xml b/system/doc/efficiency_guide/binaryhandling.xml index 8746de4b60..425d6308cf 100644 --- a/system/doc/efficiency_guide/binaryhandling.xml +++ b/system/doc/efficiency_guide/binaryhandling.xml @@ -5,7 +5,7 @@ <header> <copyright> <year>2007</year> - <year>2007</year> + <year>2011</year> <holder>Ericsson AB, All Rights Reserved</holder> </copyright> <legalnotice> @@ -114,7 +114,7 @@ my_binary_to_list(<<>>) -> [].]]></code> data. For each field that is matched out of a binary, the position in the match context will be incremented.</p> - <p>In R11B, a match context was only using during a binary matching + <p>In R11B, a match context was only used during a binary matching operation.</p> <p>In R12B, the compiler tries to avoid generating code that @@ -205,7 +205,7 @@ Bin4 = <<Bin1/binary,17>>, %% 5 !!! ProcBin for the binary. The reason is that the binary object can be moved (reallocated) during an append operation, and when that happens the pointer in the ProcBin must be updated. If there would be more than - on ProcBin pointing to the binary object, it would not be possible to + one ProcBin pointing to the binary object, it would not be possible to find and update all of them.</p> <p>Therefore, certain operations on a binary will mark it so that @@ -291,7 +291,7 @@ my_binary_to_list(<<>>) -> [].]]></code> that initializes the matching operation will basically do nothing when it sees that it was passed a match context instead of a binary.</p> - <p>When the end of the binary is reached and second clause matches, + <p>When the end of the binary is reached and the second clause matches, the match context will simply be discarded (removed in the next garbage collection, since there is no longer any reference to it).</p> diff --git a/system/doc/efficiency_guide/commoncaveats.xml b/system/doc/efficiency_guide/commoncaveats.xml index e18e5aa510..61d13636c0 100644 --- a/system/doc/efficiency_guide/commoncaveats.xml +++ b/system/doc/efficiency_guide/commoncaveats.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2001</year><year>2009</year> + <year>2001</year><year>2010</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -13,12 +13,12 @@ compliance with the License. You should have received a copy of the Erlang Public License along with this software. If not, it can be retrieved online at http://www.erlang.org/. - + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. - + </legalnotice> <title>Common Caveats</title> @@ -69,7 +69,7 @@ <p>Atoms are not garbage-collected. Once an atom is created, it will never be removed. The emulator will terminate if the limit for the number - of atoms (1048576) is reached.</p> + of atoms (1048576 by default) is reached.</p> <p>Therefore, converting arbitrary input strings to atoms could be dangerous in a system that will run continuously. diff --git a/system/doc/efficiency_guide/drivers.xml b/system/doc/efficiency_guide/drivers.xml index 9fe54fb19a..fec68ca059 100644 --- a/system/doc/efficiency_guide/drivers.xml +++ b/system/doc/efficiency_guide/drivers.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2009</year><year>2009</year> + <year>2009</year><year>2011</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -40,7 +40,7 @@ any code in a driver.</p> <p>By default, that lock will be at the driver level, meaning that - if several ports has been opened to the same driver, only code for + if several ports have been opened to the same driver, only code for one port at the same time can be running.</p> <p>A driver can be configured to instead have one lock for each port.</p> diff --git a/system/doc/efficiency_guide/functions.xml b/system/doc/efficiency_guide/functions.xml index d55b60e39c..42cc81dbae 100644 --- a/system/doc/efficiency_guide/functions.xml +++ b/system/doc/efficiency_guide/functions.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2001</year><year>2009</year> + <year>2001</year><year>2011</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -13,12 +13,12 @@ compliance with the License. You should have received a copy of the Erlang Public License along with this software. If not, it can be retrieved online at http://www.erlang.org/. - + Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the specific language governing rights and limitations under the License. - + </legalnotice> <title>Functions</title> @@ -127,7 +127,7 @@ map_pairs2(_Map, [_|_]=Xs, [] ) -> map_pairs2(Map, [X|Xs], [Y|Ys]) -> [Map(X, Y)|map_pairs2(Map, Xs, Ys)].]]></code> - <p>the compiler is free rearrange the clauses. It will generate code + <p>the compiler is free to rearrange the clauses. It will generate code similar to this</p> <p><em>DO NOT (already done by the compiler)</em></p> @@ -179,7 +179,9 @@ explicit_map_pairs(Map, Xs0, Ys0) -> A "tuple fun", <c>{Module,Function}</c>, is not a fun. The cost for calling a "tuple fun" is similar to that of <c>apply/3</c> or worse. Using "tuple funs" is <em>strongly discouraged</em>, - as they may not be supported in a future release.</p></warning> + as they may not be supported in a future release, + and because there exists a superior alternative since the R10B + release, namely the <c>fun Module:Function/Arity</c> syntax.</p></warning> <p><c>apply/3</c> must look up the code for the function to execute in a hash table. Therefore, it will always be slower than a diff --git a/system/doc/efficiency_guide/myths.xml b/system/doc/efficiency_guide/myths.xml index 76a72368bb..6fdeb5c4f9 100644 --- a/system/doc/efficiency_guide/myths.xml +++ b/system/doc/efficiency_guide/myths.xml @@ -5,7 +5,7 @@ <header> <copyright> <year>2007</year> - <year>2007</year> + <year>2011</year> <holder>Ericsson AB, All Rights Reserved</holder> </copyright> <legalnotice> @@ -168,8 +168,8 @@ vanilla_reverse([], Acc) -> <p>Actually, string handling could be slow if done improperly. In Erlang, you'll have to think a little more about how the strings are used and choose an appropriate representation and use - the <seealso marker="stdlib:re">re</seealso> instead of the obsolete - <c>regexp</c> module if you are going to use regualr expressions.</p> + the <seealso marker="stdlib:re">re</seealso> module instead of the obsolete + <c>regexp</c> module if you are going to use regular expressions.</p> </section> <section> diff --git a/system/doc/efficiency_guide/processes.xml b/system/doc/efficiency_guide/processes.xml index a25ec53370..440be2b6f8 100644 --- a/system/doc/efficiency_guide/processes.xml +++ b/system/doc/efficiency_guide/processes.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2001</year><year>2009</year> + <year>2001</year><year>2011</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -105,7 +105,7 @@ loop() -> <seealso marker="erts:erlang#spawn_opt/4">spawn_opt/4</seealso>.</p> <p>The gain is twofold: Firstly, although the garbage collector will - grow the heap, it will it grow it step by step, which will be more + grow the heap, it will grow it step by step, which will be more costly than directly establishing a larger heap when the process is spawned. Secondly, the garbage collector may also shrink the heap if it is much larger than the amount of data stored on it; @@ -172,7 +172,7 @@ days_in_month(M) -> <p>Shared sub-terms are <em>not</em> preserved when a term is sent to another process, passed as the initial process arguments in the <c>spawn</c> call, or stored in an ETS table. - That is an optimization. Most applications do not send message + That is an optimization. Most applications do not send messages with shared sub-terms.</p> <p>Here is an example of how a shared sub-term can be created:</p> @@ -237,8 +237,8 @@ true <section> <title>The SMP emulator</title> - <p>The SMP emulator (introduced in R11B) will take advantage of - multi-core or multi-CPU computer by running several Erlang schedulers + <p>The SMP emulator (introduced in R11B) will take advantage of a + multi-core or multi-CPU computer by running several Erlang scheduler threads (typically, the same as the number of cores). Each scheduler thread schedules Erlang processes in the same way as the Erlang scheduler in the non-SMP emulator.</p> diff --git a/system/doc/efficiency_guide/profiling.xml b/system/doc/efficiency_guide/profiling.xml index 65d13408bc..13165a0ede 100644 --- a/system/doc/efficiency_guide/profiling.xml +++ b/system/doc/efficiency_guide/profiling.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2001</year><year>2009</year> + <year>2001</year><year>2011</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -74,7 +74,7 @@ <title>What to look for</title> <p>When analyzing the result file from the profiling activity you should look for functions that are called many - times and have a long "own" execution time (time excluded calls + times and have a long "own" execution time (time excluding calls to other functions). Functions that just are called very many times can also be interesting, as even small things can add up to quite a bit if they are repeated often. Then you need to @@ -87,7 +87,7 @@ <item>Are there redundant tests that can be removed? </item> <item>Is there some expression calculated giving the same result each time? </item> - <item>Is there other ways of doing this that are equivalent and + <item>Are there other ways of doing this that are equivalent and more efficient?</item> <item>Can I use another internal data representation to make things more efficient? </item> @@ -138,7 +138,7 @@ <p><c>cprof</c> is something in between <c>fprof</c> and <c>cover</c> regarding features. It counts how many times each function is called when the program is run, on a per module - basis. <c>cprof</c> has a low performance degradation (versus + basis. <c>cprof</c> has a low performance degradation effect (versus <c>fprof</c> and <c>eprof</c>) and does not need to recompile any modules to profile (versus <c>cover</c>).</p> </section> @@ -231,7 +231,7 @@ consistent from run to run. The disadvantage is that the time spent in the operating system kernel (such as swapping and I/O) are not included. Therefore, measuring CPU time is misleading if - any I/O (file or sockets) are involved.</p> + any I/O (file or socket) is involved.</p> <p>It is probably a good idea to do both wall-clock measurements and CPU time measurements.</p> @@ -239,18 +239,18 @@ <p>Some additional advice:</p> <list type="bulleted"> - <item>The granularity of both types measurement could be quite + <item>The granularity of both types of measurement could be quite high so you should make sure that each individual measurement lasts for at least several seconds.</item> <item>To make the test fair, each new test run should run in its own, - newly created Erlang process. Otherwise, if all tests runs in the + newly created Erlang process. Otherwise, if all tests run in the same process, the later tests would start out with larger heap sizes - and therefore probably does less garbage collections. You could + and therefore probably do less garbage collections. You could also consider restarting the Erlang emulator between each test.</item> <item>Do not assume that the fastest implementation of a given algorithm - on computer architecture X also is the fast on computer architecture Y.</item> + on computer architecture X also is the fastest on computer architecture Y.</item> </list> </section> diff --git a/system/doc/efficiency_guide/tablesDatabases.xml b/system/doc/efficiency_guide/tablesDatabases.xml index 4b53348c4c..0c32ae2d82 100644 --- a/system/doc/efficiency_guide/tablesDatabases.xml +++ b/system/doc/efficiency_guide/tablesDatabases.xml @@ -4,7 +4,7 @@ <chapter> <header> <copyright> - <year>2001</year><year>2009</year> + <year>2001</year><year>2011</year> <holder>Ericsson AB. All Rights Reserved.</holder> </copyright> <legalnotice> @@ -280,9 +280,9 @@ lists:filter(fun(X) -> X#person.name == "Bryan" end, TabList), <p>A simple solution would be to use the <c>name</c> field as the key instead of the <c>idno</c> field, but that would cause problems if the names were not unique. A more general solution - would be create a second table with name as key and idno as - data, i.e. to index (invert) the table with regards to the - <c>name</c> field. The second table would of course have to be + would be to create a second table with <c>name</c> as key and + <c>idno</c> as data, i.e. to index (invert) the table with regards + to the <c>name</c> field. The second table would of course have to be kept consistent with the master table. Mnesia could do this for you, but a home brew index table could be very efficient compared to the overhead involved in using Mnesia.</p> |