Forums before death by AOL, social media and spammers... "We can't have nice things"
|    comp.lang.asm.x86    |    Ahh, the lost art of x86 assembly    |    4,675 messages    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
|    Message 3,519 of 4,675    |
|    Robert Prins to All    |
|    Speeding up code - am I missing somethin    |
|    15 Aug 18 21:37:41    |
      XPost: comp.lang.pl1, comp.lang.pascal.borland, comp.lang.pascal.misc       From: robert@nospicedham.prino.org              Hi all,              Not really specific x86, Virtual Pascal, or PL/I, but as I've got the same code       written in all three languages, I'll give it a try here:              I have an array (actually three, but that's not very relevant for the issue) of       pointers to items in a linked list. The array is sorted into a specific order,       and after the sort, I use it to print Top-N tables. For the main Top-50 table       (x       3) that's easy enough, the first 50 items are selected.              However, at this time the linked list also contains 5 sub-lists, each       containing       additional sub-lists for a total of 390 (yes, three-hunderd-and-ninety)       sub-lists for which I want to print Top-10 tables (or if a sub-list contains       just 4 items, a Top-4 table). Because I don't really want to sort the main       array       six (x 3) times, I just scan the array from the top, and pick out the items for       each sub-list, until I have 10 (or the 4 mentioned before) items. To speed up       the process a little, I make an initial pass over the array to find the first       item for each sub-list, but that doesn't really improve things a great deal.              So given that "this" is the list, sorted on its main key, with the second and       third columns identifying additional sub-lists,              100, 'a', '1'       099, 'b', '9'       098, 'c', '1'       097, 'b', '8'       096, 'd', '3'       095, 'a', '2'       094, 'c', '8'       093, 'c', '1'       092, 'a', '3'       091, 'f', '4'       090, 'a', '2'              the "Top-50" would contain the above.              For sub-list 'a', I would scan the array, and the resulting "Top-10" would be              100, 'a', '1'       095, 'a', '2'       092, 'a', '3'       090, 'a', '2'              Likewise, for sub-list 'b', I would scan the array, and the resulting "Top-10"       would be, and the initial fill-the-cache scan would have set the starting index       for the 'b' sub-list to the cell containing 099, saving me one superfluous       compare.              099, 'b', '9'       097, 'b', '8'              etc, and the same would happen for the sub-lists defined by column 3, the first       being              100, 'a', '1'       098, 'c', '1'       093, 'c', '1'              As I wrote, I make an initial pass over the data to cache the first item for       each sub-list, some of them consist of a single item and are nearly at the end       of the sorted full array, and this saves some time, the count of executed       statements is reduced by around 10%, but if anyone can think of a way to speed       up things a bit more, without having to sort the array(s) five more times (in       an       additional 10,000,000 executed statements, see below), please share it with me.              Some numbers:              - the caching code executes around 120,000 PL/I statements       - sorting the three arrays executes around in 2,000,000 PL/I statements (using       a       Heapsort)       - printing the 390 top-n tables executes around 7,600,000 PL/I statements, and       the "IF" statement that selects the data to be printed has a hit-percentage of       just 0.5%:              IF STY_TCN = 'Tr' & STY = LIST.TR | /* 208 type 1 */ 1,841,754 executed IF's        STY_TCN = 'Na' & TCN = LIST.NA | /* 93 type 2 */        STY_TCN = 'Yr' & STY = LIST.YR | /* 37 type 3 */        STY_TCN = 'Co' & TCN = LIST.CO | /* 33 type 4 */        STY_TCN = 'Ty' & TCN = LIST.TY | /* 19 type 5 */        STY_TCN = '**' THEN /* 1 main */        DO;        #T = #T + 1; 9,594 - the actual       number of Top-N lines printed              Robert       --       Robert AH Prins       robert(a)prino(d)org              --- SoupGate-Win32 v1.05        * Origin: you cannot sedate... all the things you hate (1:229/2)    |
[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]
(c) 1994, bbs@darkrealms.ca