Tcl Source Code

View Ticket
Login
Ticket UUID: 1360413
Title: patch: speed up lsort
Type: Patch Version: None
Submitter: nobody Created on: 2005-11-18 18:41:04
Subsystem: 17. Commands I-L Assigned To: dkf
Priority: 5 Medium Severity:
Status: Closed Last Modified: 2005-11-27 19:39:02
Resolution: Out of Date Closed By: dkf
    Closed on: 2005-11-27 12:39:02
Description:
Attached is a patch for tclCmdIL.c#184 (HEAD) that 
shows a potential speed up for lsort.

My tests show upto 50% speed improvement on large 
lists when using -index, otherwise >20%.

It works by:
1. caching what's to be compared in the sortElement. 
2. using separate sorting functions for 
string/integer/real and command.

So the cost of the solution is a bigger (4 bytes on my 
machine, if you do not cache the double's) SortElement 
to hold the cached value. This potentially means that 
a list previously sortable would not now be since the 
ckalloc might now fail... this is a perfectably good 
reason for rejecting this patch. Anyhow...

Also in the patch is a testcase. Here are my results:

1. lsort test suite:

% source cmdil.test
==== cmdIL-3.4 SortCompare procedure, -index option 
FAILED
==== Contents of test case:

    list [catch {lsort -integer -index 2 "{a b c} 
\\\{"} msg] $msg

---- Result was:
1 {expected integer but got "c"}
---- Result should have been (exact matching):
1 {unmatched open brace in list}
==== cmdIL-3.4 FAILED

cmdil.test:     Total   112     Passed  107     
Skipped 4       Failed  1
Number of tests skipped for each constraint:
        2       hasIsoLocale
        2       memory


... Just one failure where it now finds an error 
earlier than previously!

2. Here's the testcase output:
1       CLEAN: 110331.4  PATCH: 39657.0  => 64 %
2       CLEAN: 131670.2  PATCH: 92018.2  => 30 %
3       CLEAN: 149079.8  PATCH: 73460.8  => 50 %
4       CLEAN: 119905.0  PATCH: 80620.8  => 32 %
5       CLEAN: 93791.4   PATCH: 73729.8  => 21 %
6       CLEAN: 117635.0  PATCH: 100158.2         => 14 
%
7       CLEAN: 114906.2  PATCH: 50793.0  => 55 %
8       CLEAN: 128672.6  PATCH: 83854.8  => 34 %
9       CLEAN: 157616.6  PATCH: 105437.4         => 33 
%
10      CLEAN: 134954.4  PATCH: 78123.2  => 42 %
11      CLEAN: 94857.4   PATCH: 64058.2  => 32 %
12      CLEAN: 123963.4  PATCH: 97011.8  => 21 %
13      CLEAN: 17.454    PATCH: 16.63    => 4 %
14      CLEAN: 5.979     PATCH: 5.482    => 8 %
15      CLEAN: 6.195     PATCH: 5.377    => 13 %
16      CLEAN: 6.273     PATCH: 4.853    => 22 %
17      CLEAN: 6.805     PATCH: 7.494    => -10 %
18      CLEAN: 6.186     PATCH: 5.685    => 8 %
19      CLEAN: 6.85      PATCH: 6.25     => 8 %
20      CLEAN: 1858129   PATCH: 1027576  => 44 %
21      CLEAN: 2134265   PATCH: 2159487  => -1 %
22      CLEAN: 2187077   PATCH: 1533322  => 29 %
23      CLEAN: 741726    PATCH: 735839   => 0 %
24      CLEAN: 5.2992    PATCH: 4.8409   => 8 %
25      CLEAN: 4.6576    PATCH: 4.1616   => 10 %
26      CLEAN: 4.4018    PATCH: 4.4732   => -1 %
27      CLEAN: 5.4154    PATCH: 4.8429   => 10 %
28      CLEAN: 3.119576  PATCH: 3.103229         => 0 %
29      CLEAN: 1646470   PATCH: 1046932  => 36 %
30      CLEAN: 1456428   PATCH: 1000617  => 31 %
31      CLEAN: 4982307   PATCH: 4436950  => 10 %
User Comments: dkf added on 2005-11-27 19:39:02:
Logged In: YES 
user_id=79902

closed at submitter request

afredd added on 2005-11-26 00:31:05:
Logged In: YES 
user_id=1386588

afredd - I'm going to raise a new patch (as a logged in 
user this time!) so that i can attach a new patch. (It 
doesn't appear possible to do so to this one)

Please close this one. Thanks.

nobody added on 2005-11-21 16:18:31:
Logged In: NO 

Thinking about this patch over the weekend, i've realised 
the extra 'repr' added to SortElement is unnecesary... the 
caching is only useful for the -index case to avoid 
repeated SelectObjFromSublist. I've some other ideas for 
speeding this up, but may not get time this week.

So don't worry about this patch for now. Cheers.

nobody added on 2005-11-19 01:41:05:

File Added - 156792: tclCmdIL.c-patch

Attachments: