Script Benchmarks
How fast should your scripts run? If you read the Lua literature or follow user groups, you'll often read about Lua's remarkable speed.. The MX Script library is designed so that most numerically intensive processing uses Mira's core library of highly optimized array functions. However, there are times when you need to do intensive numeric processing inside the script itself, as when working with large tables of data, or processing millions of values using your own script code. So you aren't left in the dark about what "fast" means, here are some benchmarks we've measured at Mirametrics. The table below gives you some idea of what you might expect from your numerically intensive scripts.
The test machine used was chosen to be representative of a typical "fast" machine in use by Mira users. This machine uses a 3.0 GHz Pentium Core-2 Duo E-6850 CPU with a 1333 MHz front-side bus and 4 GB of 800 MHz DDR-2 RAM. The operating system was Windows XP/SP3. Running screen applications included Visual Studio 2008, Calculator, Outlook, Windows Explorer, and Mira MX. To increase the significance of the timings, most procedures were repeated in a loop of 10 to 10000 cycles and the time value was divided accordingly. Each timing was then repeated 3 to 10 times and the typical value, rather than the lowest value, was adopted as the benchmark.
Task |
Time (sec) |
Speed |
Save a 1 million element Lua table to a CImage object as 64-bit real numbers. CImage:Set(table) |
0.0791 |
12.7 million elements / sec |
Save a 250,000 element Lua table to a CImage object as 64-bit real numbers. CImage:Set(table) |
0.0181 |
13.8 million elements / sec |
Save a 10,000 element Lua table to a CImage object as 64-bit real numbers. CImage:Set(table) |
0.000766 |
13.1 million elements / sec |
Set 1 million table elements t={} for k=1,1000000 do t[k]=k end |
0.220 |
4.54 million elements / sec |
Set 10 million table elements in a global table t={} for k=1,10000000 do t[k]=k end |
2.53 |
3.95 million elements / sec |
Create and set 1 million elements in a local table local t={} for k=1,10000000 do t[k]=k end |
0.096 |
10.4 million elements / sec |
Perform 10 million multiply's using local values local n=0 local m=0 for i=1,10000000 do k=n*m end |
0.314 |
31.9 million multiply's / sec |
Perform 10 million divides using local values local n=0 local m=2 for i=1,10000000 do k=n/m end |
0.323 |
31.0 million divides's / sec |
Perform 10 million adds using local values local m=2 local n=0 for i=1,10000000 do k=n+m end |
0.316 |
31.6 million adds / sec |
Perform 10 million adds using global values n=0 m=2 for i = 1,10000000 do k=n+m end |
0.898 |
11.1 million adds / sec |
Perform 10 million adds to a number using global values k=0 for i=1,10000000 do k=k+1 end |
0.809 |
12.4 million adds / sec |
Perform 10 million empty loops k=0 for k=1,100000000 do end |
0.177 |
56.5 million loops / sec |
Perform 10 million divides and save in a local table local t={} local m=3 for i=1,10000000 do t[k]=k/m end |
1.46 |
6.85 million / sec |
Least squares solution of 100 points with 4 parameters and 3 variables using a "hyperplane" basis function declared in the script |
0.042 |
24 fits / sec |
Least squares solution of 100 points with 4 parameters and 3 variables using internal "hyperplane" basis function |
0.000556 |
1,800 fits / sec |
Least squares solution of 10 points with 4 parameters and 3 variables using internal "hyperplane" basis function |
0.000055 |
18,000 fits / sec |
Least squares solution of 1000 points using a 3x2 (6 parameter) 2-D polynomial. |
0.0008 |
1,250 fits / sec |
Least squares solution using CLsqFit class to fit 10 points with a 3x2 (6 parameter) 2-D polynomial. |
0.000041 |
24,400 fits / sec |
Least squares solution using CLsqFit class to fit 1000 points with a 6-th order 1-D polynomial. |
0.0011 |
900 fits /sec |
Create 1 million uniformly distributed random numbers. |
0.243 |
4.1 million numbers / sec |
Create 1 million Gaussian distributed random numbers |
1.16 |
862,000 numbers / sec |
Histogram of 1 million real numbers using 100 bins |
0.167 |
6 million numbers / sec |
Add two 1200x800 64-bit real images |
0.00425 |
236 images / sec |
Add two 1200x800 32-bit real images |
0.00198 |
500 images / sec |
Add two 1200x800 16-bit integer images |
0.00142 |
704 images / sec |
Add two 1200x800 24-bit RGB images |
0.00414 |
242 images / sec |
Add two 1200x960 48-bit URGB images |
0.00444 |
225 images / sec |
Multiply 1200x800 32-bit real images |
0.0033 |
300 images / sec |
Multiply 1200x800 32-bit real image by a number |
0.00475 |
210 images / sec |
Divide two 1200x800 32-bit real images |
0.0094 |
106 images sec |
1200x800 16-bit image converted to 32-bit real as I[1], then I[2] = I[1] + 1000, I[3] = I[1] / I[2], and I[4] = I[1] ^ I[3]. All 4 images had 32-bit real pixel type. This process involved creation of 4 4MB images as well as the image mathematical operations between them. The last operation raised I[1] to the power of I[3], pixel by pixel (a very intensive computation). |
0.097 |
10.3 million pixels / sec |
Same as above but also display each of the resulting 32-bit real images in a new image window. This also requires computing an image histogram, transfer function, and palette mapping for each image. |
0.369 |
16 images / sec |
Load 1 Megapixel image of 16 bit pixels from hard drive, compute image histogram, autoscale transfer function using gamma=0.6, and display in a new window. |
0.125 |
8 images / sec |
If there are 2 major results to be gleaned from the table above, they are as follows:
Mira MX Script's use of Lua provides a high-performance scripting language.
Declare local values whenever possible. This has 2 advantages: speed when used many tmes in a loop, and it prevents the global namespace from being polluted by different values with conflicting names.