|
Message-ID: <20130107191908.GB20849@openwall.com> Date: Mon, 7 Jan 2013 23:19:08 +0400 From: Solar Designer <solar@...nwall.com> To: john-dev@...ts.openwall.com Subject: Re: mask-mode speed On Mon, Jan 07, 2013 at 09:48:27AM -0500, jfoug@....net wrote: > Here is an extern run. This extern (listed at the end of the post), is probably about as fast as it can be done externally. Actually, we can do a bit faster. > void generate() > { > pos = 9; > ++word[pos]; > while (word[pos] == ':') { > word[pos] = '0'; > --pos; > if (pos == -1) { word = 0; return; } > ++word[pos]; > } > } Here's a possible replacement for the above: void generate() { if (++word[9] <= '9') return; word[9] = '0'; pos = 8; while (++word[pos] > '9') { if (pos) { word[pos--] = '0'; } else { word = 0; return; } } } The hard-coded 9 and 8 can be avoided with no performance impact by putting them in variables in init(). The external mode compiler is (mostly) not optimizing - e.g., it does not detect common subexpressions (and even if it would, quickly reusing them in the stack-based VM would not always be possible without some additional rearrangement to keep them on top of stack at the right times). So e.g. "++word[pos = 9]" is quicker than "pos = 9; ++word[pos];" Similarly, directly using this expression as a conditional in an "if" or "while" statement is quicker than repeating "word[pos]" in there separately. Alexander
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.