I remember math class… in fourth grade. It was the year we learned multiplication. Day after day, for so many consecutive days, we’d have to write our “times tables.” Zero though 10, over and over again. Good thing, I suppose, as I still know them today. The combination of knowing PowerShell and my daughter learning her “times tables” now, got me thinking: How quickly could I “write” my “times tables” today? It turns out it takes around 5 milliseconds.
If you’ve been reading along recently you may have seen what we’ll do today, done before. We need multiple loops. One loop, our outer loop, will cycle through the numbers 0 through 10. For each of those, we’ll have an inner loop multiply 0 through 10 to the current outer loop number. You know, we’ll do zero, so zero times zero, zero times one, and so on, until we hit 10, at which point we’ll move on from zero to one (one times zero, one times one, one times two, etc.). Let’s begin with the outer loop.
foreach ($outernumber in 0..10) { $outernumber } 0 1 2 3 4 5 6 7 8 9 10
Now, let’s do the inner loop. Again, this is going to repeat zero through 10 inside each inner loop, for each outer loop. If this is hard to follow, be sure to take a look at the soon-to-be upcoming example where we’ll highlight both outer and inner loops.
foreach ($outernumber in 0..10) { foreach ($innernumber in 0..10) { $innernumber } } 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10
This is the same example as we saw above; however, we’ve included the value of the outer loop in our output. Each outer loop value has two dashes (--
) in front of it.
foreach ($outernumber in 0..10) { "-- $outernumber" foreach ($innernumber in 0..10) { $innernumber } } -- 0 0 1 2 3 4 5 6 7 8 9 10 -- 1 0 1 2 3 4 5 6 7 8 9 10 -- 2 0 1 2 3 4 5 6 7 8 9 10 -- 3 0 1 2 3 4 5 6 7 8 9 10 -- 4 0 1 2 3 4 5 6 7 8 9 10 -- 5 0 1 2 3 4 5 6 7 8 9 10 -- 6 0 1 2 3 4 5 6 7 8 9 10 -- 7 0 1 2 3 4 5 6 7 8 9 10 -- 8 0 1 2 3 4 5 6 7 8 9 10 -- 9 0 1 2 3 4 5 6 7 8 9 10 -- 10 0 1 2 3 4 5 6 7 8 9 10
And since this post is lengthy in long examples, let’s add another before we actually get to the results we came for. Our outer loop number is on the left side of the multiplication symbol, and our inner loop number is on the right side.
foreach ($outernumber in 0..10) { foreach ($innernumber in 0..10) { "$outernumber x $innernumber =" } } 0 x 0 = 0 x 1 = 0 x 2 = 0 x 3 = 0 x 4 = 0 x 5 = 0 x 6 = 0 x 7 = 0 x 8 = 0 x 9 = 0 x 10 = 1 x 0 = 1 x 1 = 1 x 2 = 1 x 3 = 1 x 4 = 1 x 5 = 1 x 6 = 1 x 7 = 1 x 8 = 1 x 9 = 1 x 10 = 2 x 0 = 2 x 1 = 2 x 2 = 2 x 3 = 2 x 4 = 2 x 5 = 2 x 6 = 2 x 7 = 2 x 8 = 2 x 9 = 2 x 10 = 3 x 0 = 3 x 1 = 3 x 2 = 3 x 3 = 3 x 4 = 3 x 5 = 3 x 6 = 3 x 7 = 3 x 8 = 3 x 9 = 3 x 10 = 4 x 0 = 4 x 1 = 4 x 2 = 4 x 3 = 4 x 4 = 4 x 5 = 4 x 6 = 4 x 7 = 4 x 8 = 4 x 9 = 4 x 10 = 5 x 0 = 5 x 1 = 5 x 2 = 5 x 3 = 5 x 4 = 5 x 5 = 5 x 6 = 5 x 7 = 5 x 8 = 5 x 9 = 5 x 10 = 6 x 0 = 6 x 1 = 6 x 2 = 6 x 3 = 6 x 4 = 6 x 5 = 6 x 6 = 6 x 7 = 6 x 8 = 6 x 9 = 6 x 10 = 7 x 0 = 7 x 1 = 7 x 2 = 7 x 3 = 7 x 4 = 7 x 5 = 7 x 6 = 7 x 7 = 7 x 8 = 7 x 9 = 7 x 10 = 8 x 0 = 8 x 1 = 8 x 2 = 8 x 3 = 8 x 4 = 8 x 5 = 8 x 6 = 8 x 7 = 8 x 8 = 8 x 9 = 8 x 10 = 9 x 0 = 9 x 1 = 9 x 2 = 9 x 3 = 9 x 4 = 9 x 5 = 9 x 6 = 9 x 7 = 9 x 8 = 9 x 9 = 9 x 10 = 10 x 0 = 10 x 1 = 10 x 2 = 10 x 3 = 10 x 4 = 10 x 5 = 10 x 6 = 10 x 7 = 10 x 8 = 10 x 9 = 10 x 10 =
In this example, we’re going to add the multiplication problem to our output. Notice that we are making use of the subexpression operator ($()
) in order to embed the results of each expression — or multiplication problem — within our string.
foreach ($outernumber in 0..10) { foreach ($innernumber in 0..10) { "$outernumber x $innernumber = $($outernumber * $innernumber)" } } 0 x 0 = 0 0 x 1 = 0 0 x 2 = 0 0 x 3 = 0 0 x 4 = 0 0 x 5 = 0 0 x 6 = 0 0 x 7 = 0 0 x 8 = 0 0 x 9 = 0 0 x 10 = 0 1 x 0 = 0 1 x 1 = 1 1 x 2 = 2 1 x 3 = 3 1 x 4 = 4 1 x 5 = 5 1 x 6 = 6 1 x 7 = 7 1 x 8 = 8 1 x 9 = 9 1 x 10 = 10 2 x 0 = 0 2 x 1 = 2 2 x 2 = 4 2 x 3 = 6 2 x 4 = 8 2 x 5 = 10 2 x 6 = 12 2 x 7 = 14 2 x 8 = 16 2 x 9 = 18 2 x 10 = 20 3 x 0 = 0 3 x 1 = 3 3 x 2 = 6 3 x 3 = 9 3 x 4 = 12 3 x 5 = 15 3 x 6 = 18 3 x 7 = 21 3 x 8 = 24 3 x 9 = 27 3 x 10 = 30 4 x 0 = 0 4 x 1 = 4 4 x 2 = 8 4 x 3 = 12 4 x 4 = 16 4 x 5 = 20 4 x 6 = 24 4 x 7 = 28 4 x 8 = 32 4 x 9 = 36 4 x 10 = 40 5 x 0 = 0 5 x 1 = 5 5 x 2 = 10 5 x 3 = 15 5 x 4 = 20 5 x 5 = 25 5 x 6 = 30 5 x 7 = 35 5 x 8 = 40 5 x 9 = 45 5 x 10 = 50 6 x 0 = 0 6 x 1 = 6 6 x 2 = 12 6 x 3 = 18 6 x 4 = 24 6 x 5 = 30 6 x 6 = 36 6 x 7 = 42 6 x 8 = 48 6 x 9 = 54 6 x 10 = 60 7 x 0 = 0 7 x 1 = 7 7 x 2 = 14 7 x 3 = 21 7 x 4 = 28 7 x 5 = 35 7 x 6 = 42 7 x 7 = 49 7 x 8 = 56 7 x 9 = 63 7 x 10 = 70 8 x 0 = 0 8 x 1 = 8 8 x 2 = 16 8 x 3 = 24 8 x 4 = 32 8 x 5 = 40 8 x 6 = 48 8 x 7 = 56 8 x 8 = 64 8 x 9 = 72 8 x 10 = 80 9 x 0 = 0 9 x 1 = 9 9 x 2 = 18 9 x 3 = 27 9 x 4 = 36 9 x 5 = 45 9 x 6 = 54 9 x 7 = 63 9 x 8 = 72 9 x 9 = 81 9 x 10 = 90 10 x 0 = 0 10 x 1 = 10 10 x 2 = 20 10 x 3 = 30 10 x 4 = 40 10 x 5 = 50 10 x 6 = 60 10 x 7 = 70 10 x 8 = 80 10 x 9 = 90 10 x 10 = 100
That was it. Well, there is one thing. Let’s get back to seeing how long this command takes to run.
Measure-Command -Expression { foreach ($outernumber in 0..10) { foreach ($innernumber in 0..10) { "$outernumber x $innernumber = $($outernumber * $innernumber)" } } } | Select-Object -Property Milliseconds Milliseconds ------------ 5
We could put this entire command in a loop too, and test it across ten iterations. This example includes ticks, as well as milliseconds because when this command is run back-to-back, the speed per iteration drastically increases. Have a look. So it has been said, there are 10,000 ticks per millisecond and 1,000 milliseconds per second.
1..10 | ForEach-Object { Measure-Command -Expression { foreach ($outernumber in 0..10) { foreach ($innernumber in 0..10) { "$outernumber x $innernumber = $($outernumber * $innernumber)" } } } | Select-Object -Property Milliseconds,Ticks } Milliseconds Ticks ------------ ----- 3 39181 0 7081 1 14917 1 10313 0 2318 0 2289 0 2235 0 2149 0 2099 0 2083