I read recently that ENIAC originally was capable of 5000 additions per second.  Naturally, I had to test my own laptop's capabilities and this became an instructive experiment in F#, which I suck at.

So, I am looking for feedback in two areas:

- What is the most concise way to write this in F#, or at least most closely aligned with the functional paradigm?

- Did I miss something for performance? Can this be done in a much more performant fashion?

<!--- --->

    module Program

    open System
    open System.Diagnostics

    [<AutoOpen>]
    module timingStuff = 
        let pickRunmode() = 
            Console.WriteLine("choose number of processes to spawn (default 1)")
            Console.ReadLine()
    
        let feedback (input : string) = 
            Console.WriteLine("you picked {0}", input)
            Console.WriteLine("now running")
    
        let quitOrContinue() = 
            Console.WriteLine("q to quit else continue with keypress")
            Console.ReadKey().KeyChar <> 'q'
    
        let rec addOne x stop = 
            let r = x + 1
            if stop() then r
            else addOne r stop
    
        let finished stopticks = (fun _ -> Stopwatch.GetTimestamp() >= stopticks)
        let secondsToTicks x = x * 1000L * 10000L
        let prettyNumbers (x : int) = String.Format("{0:#,0}", x)
    
        let printResult result start = 
            let final = (Stopwatch.GetTimestamp() - start |> TimeSpan).TotalSeconds
            let pretty = prettyNumbers result
            sprintf "performed %s operations in %f seconds" pretty final |> Console.WriteLine
    
        let op duration start = 
            duration
            |> secondsToTicks
            |> (+) start
            |> finished
            |> addOne 0
    
        let opAsync duration start procs = 
            [ for i in [ 1..procs ] -> async { return op duration start } ]
            |> Async.Parallel
            |> Async.RunSynchronously

    [<EntryPoint>]
    let main argv = 
        let loop() = 
            let input = 
                match Int32.TryParse(pickRunmode()) with
                | true, i -> i
                | _ -> 1
            input
            |> string
            |> feedback
            |> ignore
            let start = Stopwatch.GetTimestamp()
            let result = opAsync 1L start input |> Seq.sum
            printResult result start |> ignore
            quitOrContinue()
        while loop() do
            ()
        0