Speed Tests for Lists

[Home]   [Puzzles & Projects]    [Delphi Techniques]   [Math topics]   [Library]   [Utilities]

 

 

Search

Search WWW

Search DelphiForFun.org

As of October, 2016, Embarcadero is offering a free release of Delphi (Delphi 10.1 Berlin Starter Edition ).     There are a few restrictions, but it is a welcome step toward making more programmers aware of the joys of Delphi.  They do say "Offer may be withdrawn at any time", so don't delay if you want to check it out.  Please use the feedback link to let me know if the link stops working.

 

Support DFF - Shop

 If you shop at Amazon anyway,  consider using this link. 

     

We receive a few cents from each purchase.  Thanks

 


Support DFF - Donate

 If you benefit from the website,  in terms of knowledge, entertainment value, or something otherwise useful, consider making a donation via PayPal  to help defray the costs.  (No PayPal account necessary to donate via credit card.)  Transaction is secure.

Mensa® Daily Puzzlers

For over 15 years Mensa Page-A-Day calendars have provided several puzzles a year for my programming pleasure.  Coding "solvers" is most fun, but many programs also allow user solving, convenient for "fill in the blanks" type.  Below are Amazon  links to the two most recent years.

Mensa® 365 Puzzlers  Calendar 2017

Mensa® 365 Puzzlers Calendar 2018

(Hint: If you can wait, current year calendars are usually on sale in January.)

Contact

Feedback:  Send an e-mail with your comments about this program (or anything else).

Search DelphiForFun.org only

 

 

 

Problem Description

Here is a program to the list creation and retrieval speed for standard TStringList  the DFF integer equivalent, TIntList.  Speed can be compared under multiple Delphi versions using the same source code.   

Background & Techniques

Some time ago, a fellow working on a Chess solver wrote asking about finding the position (rank) in a list of possible chess piece arrangements for 3 to 6 chess pieces.  Additionally, given a rank, find the corresponding chess piece configuration. I don't believe that we ever really connected on the approach; he seemed to think that there was an algorithmic way to generate these values but it seemed to me that building enumerated lists of valid positions would be required.   In any event, the question led to thus investigation of relative building and retrieval speeds for large stringlists and whether the DFF integer lists would be faster.  They are.

This program runs timing tests for two list types: the standard TStringlist Delphi type and DFF TIntList type which has most TStringList methods but with 64 bit integer keys.

Each test builds the specified number of random records  (Nbr_Entries) of the specified length and then randomly retrieve NbrEntrie/2  records with a couple of different  strategies.  Multiple trials can be run with a single button click and results are displayed.

From my testing, I have concluded that the Delphi 7 version of this program populates an integer list 30 times faster than for a string list of the same size. It  also randomly retrieves integer records 2 or 3 time faster than string records.

When the program is compiled under Delphi XE, string lists are built 2 or 3 times faster than in Delphi 7. Integer lists have exactly the same code under XE are built at about the same speed as under D7 and are therefore "only" about 10 times faster than string lists. Random retrievals of string list records in XE are also several times faster than string list records under Delphi 7. 

From the programmer's perspective, there are several point worth mentioning:

bulletTo compile the code under Delphi XE, I changed the project name to SpeedTest_XE but left the unit name as U_Speedtest.  This avoided having to keep two versions synchronized as development proceeded.   The Delphi 7 version of the project was changed to Speedtest_Delphi7 for consistency.
bullet Along the same line, the original code was largely duplicated for the Stringlist test button and the Integer List button.  I moved the duplicated code to procedures (Serup, BuildList, SearchList, and ReportResults) and pass a Listtype parameter ( and "S" or "I" character) to last three so that operations are performed on the appropriate list type
bulletThe Now function returns the current system time in TDateTime format and is convenient in many occasions for timing operations   (StartTime:=Now; {do something} RunTimeSeconds:=SecsPerDay*(Now-StartTime);).  However the resolution of this clock is low, about 17 milliseconds as I recall.  For times of a few milliseconds, start and end times returned may be identical giving runtimes of zero. The happened for timing small integer list size tests in this program  so i switched all timing to use the system Performance Counter which typically provides microsecond resolution.  Two procedures are required to use this timer: QueryPerformanceFrequency returns the counts per second rate of the performance counter and QueryPerformanceCounter returns the current performance counter value.   The difference between two calls to the QueryPerformanceCounter divided by the counter frequency will return the time in seconds.
bulletLarge numbers are easier to read when formatted with commas (or decimal points where that is the thousands separator).  Unfortunately, the format string for this only formats floating point numbers.  The common way to format integers with thousands separators is to use  '%.0n' in the format string and use it to to display the integer  value + 0.0.  Adding 0.0 will cause Delphi to convert the integer to floating point which %.0n will then display as an integer with thousands separators.                

.  

 Running/Exploring the Program 

bulletDownload executable
bullet Download  source   (Note: the TIntList control  used in this program resides in the UIntList.pas unit our library zip file of commonly used units.  Library file DFFVLIB12 or later is required to recompile this program )
bulletDownload current library file (DFFLibV15)

Suggestions for Further Explorations

???
 
Created: October 11, 2014

Modified: May 15, 2018

 
  [Feedback]   [Newsletters (subscribe/view)] [About me]
Copyright © 2000-2018, Gary Darby    All rights reserved.