Age | Commit message (Collapse) | Author |
|
Improve the performance of orddict:from_list/1 by reimplementing it using
the lists module in a way that preserves backward compatibility.
The QuickCheck programs linked below were used to verify backward
compatibility:
* https://gist.github.com/vinoski/3bd216efa421c581174a
* https://gist.github.com/vinoski/c6db70e8dc725083843d
Both tests, which were run on R16B03, require the original orddict module
to be renamed to olddict, and that code:unstick_mod/1 be applied to orddict
in order to allow it to be replaced with the revised orddict.
The first QuickCheck test first generates a list of pairs of terms, then
uses the list to create both an original and revised orddict using
from_list/1, then verifies that the results of the operation are the same
for both instances. The second QuickCheck test is similar except that it
first creates an instance of the original and revised orddicts and then
folds over a randomly-generated list of orddict functions, applying each
function to each orddict instance and verifying that the results match.
The revised orddict:from_list/1 function was also tested to assess
performance against the original orddict implementation. The test program
used is available here:
* https://gist.github.com/vinoski/61772a052f3501e1e128
Since an orddict instance is implemented as a list, the test program
creates ordicts of length 1, 10, 100, and 1000 and uses them to assess
performance at each length. Performance was measured using timer:tc/3 to
time a number of iterations of various tests against the original orddict
and against the revised orddict. To test from_list/1, orddicts of lengths
1, 10, 100, and 1000 are created from a list of random pairs with integer
keys. For lengths greater than 1, two different tests are performed: one
passing a list of pairs in sorted key order, and the other passing a list
of pairs in reverse sorted key order. Since orddicts are ordered, these
orderings effect worst-case and best-case behavior of the original
orddict:from_list/2 implementation respectively.
These tests were performed against R16B02 on a Macbook Pro with an Intel
Core i7 processor running at 2.7GHz and 16GB of RAM running OS X 10.8.5,
and on a Dell system with a 3.4GHz Intel Core i7 and 16GB of RAM running
Ubuntu Linux 12.04.
The tables below show results for OS X and Linux respectively. Each table
lists the name of each test followed by two numbers, each a time in
microseconds of the average of 10 runs of the test. The first number is the
result for the original orddict, the second for the revised orddict.
As the numbers for both platforms show, the revised from_list/1 function is
always faster than the original version, in some cases quite a bit faster.
Results from OS X:
------------------
from_list length 1: 1.789 0.116
from_list length 10 ordered: 10.082 3.040
from_list length 10 reverse ordered: 4.853 3.604
from_list length 100 ordered: 397.213 20.134
from_list length 100 reverse ordered: 25.473 20.745
from_list length 1000 ordered: 37490.26 251.46
from_list length 1000 reverse ordered: 307.94 215.96
Results from Linux:
-------------------
from_list length 1: 0.146 0.025
from_list length 10 ordered: 4.729 0.815
from_list length 10 reverse ordered: 1.687 0.956
from_list length 100 ordered: 144.467 5.896
from_list length 100 reverse ordered: 6.694 5.816
from_list length 1000 ordered: 13755.19 79.413
from_list length 1000 reverse ordered: 91.54 64.308
|
|
|
|
* siri/test-bugfix-upgrade-emulator:
[sasl] Test bugfix in branch 'schlagert/fix_emulator_upgrades'
|
|
OTP-11529
|
|
|
|
|
|
|
|
|
|
* schlagert/fix_emulator_upgrades:
Fix boot file generation for intermediate releases.
|
|
* hans/inets/ftpc_test_fail:
inets: Restore ftp test files for the inets_{,sup_}SUITE to not fail
|
|
|
|
* ia/inets/cuddle-with-tests:
inets: Add crypto start check to ssl test cases
|
|
* peppe/common_test/r16b03_docs_updated:
Update event handling documentation
OTP-11524
|
|
|
|
* peppe/common_test/r16b03_docs:
Update documentation
OTP-10631
OTP-11305
OTP-11523
OTP-11524
|
|
* anders/diameter/doc/OTP-11519:
Assorted doc fixes/tweaks
|
|
|
|
|
|
* hans/ssh/cli_delays:
ssh: Fix long cli delays. (Part of OTP-11339, OTP-10953)
|
|
* hans/ftp/dialyzer_warning:
ftp: fix sockname dialyzer warning including ftp:sockname/1 bug
|
|
|
|
A step in fixing the tickets.
|
|
* sverk/crypto-no_answer_from_tc_supervisor:
crypto: Add more lazy_eval to avoid no_answer_from_tc_supervisor
|
|
A previous refactoring messed up the paths used in the start.boot
file used in intermediate releases generated for emulator upgrades.
|
|
* egil/fix-darwin-64-configure-default/OTP-11521:
erts: Let cc determine default wordsize for darwin build
|
|
* peppe/common_test/hook_skip_failure:
Fix CT hook pre_end_per_group causing crash when returning {skip,Reason}
OTP-11409
|
|
|
|
* sverk/test-cuddle:
erts: Reduce wasted execution time for match_spec_SUITE:otp_9422
|
|
* rickard/alloc-info/OTP-11520:
Fix observer retrieval of alloc info
|
|
This commit only bump the runtime_tools version. The actual fix
is in commit 6cd261deb5fec413eb196b620a4618cfa0781458 (merged to
maint branch), but should have been part of this commit.
|
|
|
|
* rickard/supercarrier-fix/OTP-11149:
Documentation fix
|
|
|
|
* nox/crypto-uninitialized-vars:
Fix some uninitialized pointers in crypto
OTP-11510
|
|
* nox/fix-clang-warnings:
Silence warnings about socklen_t pointers sign in erl_memory
Compile in_heapfrag() only in debug mode
Silence two warnings about tests being always true
Conditionally compile my_gethostbyname_r and my_gethostbyaddr_r
Silence a mismatching type pointer warning in ei_resolve
Silence warnings about different buffer types in erl_memory
erts: Remove unused file winsock_func.h
Silence warnings about unused return values in ic
Silence a warning in erl_poll about an empty loop body
Fix erts_check_off_heap2 assertion
Properly mark erl_assert_error as non-returning
Remove uninitialized use of new_crr in erl_alloc_util
OTP-11517
|
|
* nox/diameter-make-fixes:
diameter: Fix silent make rule
OTP-11514
|
|
* nox/wx-make-fixes:
wx: Fix silent make rules
OTP-11515
|
|
* nox/eunit-make-fix:
eunit: Fix silent make rule
OTP-11516
|
|
|
|
|
|
|
|
Amendment to f1ebf482e1460d6146d55aa6cab00ab3e11f1741
|
|
erl_memory.c:947:7: warning: passing 'int *' to parameter of type 'socklen_t *' (aka 'unsigned int *') converts between pointers to integer types with different sign [-Wpointer-sign]
&saddr_size) != 0)
^~~~~~~~~~~
/usr/include/sys/socket.h:616:74: note: passing argument to parameter here
int getsockname(int, struct sockaddr * __restrict, socklen_t * __restrict)
^
erl_memory.c:2613:57: warning: passing 'int *' to parameter of type 'socklen_t *' (aka 'unsigned int *') converts between pointers to integer types with different sign [-Wpointer-sign]
sock = accept(lsock, (struct sockaddr *) &oth_addr, &oth_addr_len);
^~~~~~~~~~~~~
/usr/include/sys/socket.h:610:69: note: passing argument to parameter here
int accept(int, struct sockaddr * __restrict, socklen_t * __restrict)
^
|
|
|
|
encode/encode_ulonglong.c:55:25: warning: comparison of unsigned expression >= 0 is always true [-Wtautological-compare]
if ((p < 256) && (p >= 0)) {
~ ^ ~
legacy/erl_marshal.c:293:24: warning: comparison of unsigned expression >= 0 is always true [-Wtautological-compare]
if ((ul < 256) && (ul >= 0)) {
~~ ^ ~
|
|
These are not needed when not on VXWORKS or without _REENTRANT.
connect/ei_resolve.c:302:24: warning: unused function 'my_gethostbyname_r' [-Wunused-function]
static struct hostent *my_gethostbyname_r(const char *name,
^
connect/ei_resolve.c:360:24: warning: unused function 'my_gethostbyaddr_r' [-Wunused-function]
static struct hostent *my_gethostbyaddr_r(const char *addr,
^
|
|
Why we are assigning a pointer to pointer to char to a pointer to char
baffles me. The warning is:
connect/ei_resolve.c:229:11: warning: incompatible pointer types assigning to 'char *' from 'char **'; dereference
with * [-Wincompatible-pointer-types]
*pptr = src_aliases;
^ ~~~~~~~~~~~
*
|
|
erl_memory.c:861:19: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->size);
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:863:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p,
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:869:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->no);
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:871:20: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p,
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:878:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p,
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:900:19: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->max_ever_size);
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:902:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p, "%*s %*s ", fw, "", fw, "");
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:904:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p, "%*" USGND_INT_MAX_FSTR " ", fw, mi->max_ever_no);
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:906:20: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p, "%*s %*s ", fw, "", fw, "");
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:909:16: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
*p += sprintf(*p, "%*s %*s %*s ", fw, "", fw, "", fw, "");
^~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:986:25: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
area.size = sprintf(area.ptr, format, carg);
^~~~~~~~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1103:25: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
area.size = sprintf(area.ptr,
^~~~~~~~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1109:23: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
area.size += sprintf(area.ptr + area.size,
^~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1120:26: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
area.size += sprintf(area.ptr + area.size,
^~~~~~~~~~~~~~~~~~~~
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1190:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
p += sprintf(p, "> %-*s", EM_TIME_FIELD_WIDTH - 2, "Maximum:");
^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1223:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
p += sprintf(p, "\n");
^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1227:15: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
p += sprintf(p, "%s", stop_str);
^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1230:15: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
p += sprintf(p, exit_str, state->info.exit_status);
^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1236:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
p += sprintf(p, format, tsz, bw);
^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1286:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
p += sprintf(p, "%*" USGND_INT_32_FSTR " ", EM_TIME_FIELD_WIDTH - 1, secs);
^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:1311:18: warning: passing 'usgnd_int_8 *' (aka 'unsigned char *') to parameter of type 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
p += sprintf(p, "\n");
^
/usr/include/secure/_stdio.h:49:28: note: expanded from macro 'sprintf'
__builtin___sprintf_chk (str, 0, __darwin_obsz(str), __VA_ARGS__)
^
erl_memory.c:2231:32: warning: passing 'char *' to parameter of type 'usgnd_int_8 *' (aka 'unsigned char *') converts between pointers to integer types with different sign [-Wpointer-sign]
size = write_header(state, state->output.header, 1);
^~~~~~~~~~~~~~~~~~~~
erl_memory.c:736:44: note: passing argument to parameter 'ptr' here
write_header(em_state *state, usgnd_int_8 *ptr, int trunc)
^
|
|
|
|
The warnings are:
oe_ei_encode_string.c:26:3: warning: expression result unused [-Wunused-value]
(int) ei_encode_string(0,&size,p);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
oe_ei_encode_port.c:26:3: warning: expression result unused [-Wunused-value]
(int) ei_encode_port(NULL, &size, p);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
oe_ei_encode_atom.c:26:3: warning: expression result unused [-Wunused-value]
(int) ei_encode_atom(0,&size,p);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~
oe_ei_encode_pid.c:26::3: warning: expression result unused [-Wunused-value]
(int) ei_encode_pid(NULL, &size, p);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
oe_ei_encode_ref.c:26:3: warning: expression result unused [-Wunused-value]
(int) ei_encode_ref(NULL, &size, p);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
oe_ei_encode_term.c:26:3: warning: expression result unused [-Wunused-value]
(int) ei_encode_term(NULL, &size, t);
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|