On Sat, 21 Apr 2012 19:24:56 -0400, Jay Norwood <j...@prismnet.com> wrote:

While playing with sorting the unzip archive entries I tried use of the last example in http://dlang.org/phobos/std_algorithm.html#sort

std.algorithm.sort!("toLower(a.name) < toLower(b.name)",std.algorithm.SwapStrategy.stable)(entries);

It was terribly slow for sorting the 34k entries in my test case. I'd guess it is doing the toLower call on both strings for every compare.

It was much, much faster to add an entries.lowerCaseName = std.string.toLower(entries.name) foreach entry prior to the sort execution and then use

std.algorithm.sort!("a.lowerCaseName < b.lowerCaseName ",std.algorithm.SwapStrategy.stable)(entries);

The difference was on the order of 10 secs vs no noticeable delay when executing the sort operation in the debugger.

I'll point out what I haven't seen yet:

the issue is not so much toLower being called on every comparison, but more that toLower allocates (and then throws away!).

I think using std.string.icmp is the best solution. I would expect it to outperform even schwartz sort.

Note, to answer your question elsewhere, the comment is accurate, std.uni.toLower(a) is a function that accepts a dchar, not a string. What the comment is saying is that for the "ranges" (i.e. strings) given, it runs the given comparison on the std.uni.toLower() result for each element (i.e. dchar).

-Steve

Reply via email to