Skip to content

SIMD vectorization of Array.sum<int>, etc #18509

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: main
Choose a base branch
from

Conversation

Thorium
Copy link
Contributor

@Thorium Thorium commented Apr 26, 2025

Description

Specific overloads (float, float32, int, int64) of Seq.sum, Seq.average, Array.sum and Array.average to take advantage of vectorization in System.Linq.Enumerable module.

This is potentially a naive first try to solve #16230 by the spirit of @T-Gro comment #16230 (comment)

Checklist

  • Test cases added
  • Performance benchmarks added in case of performance changes
  • Release notes entry updated:

    Please make sure to add an entry with short succinct description of the change as well as link to this pull request to the respective release notes file, if applicable.

…ge, Array.sum and Array.average to take advantage of vectorization in System.Linq.Enumerable module.
Copy link
Contributor

github-actions bot commented Apr 26, 2025

❗ Release notes required


✅ Found changes and release notes in following paths:

Change path Release notes path Description
src/FSharp.Core docs/release-notes/.FSharp.Core/9.0.300.md

Comment on lines 1591 to 1605
[<CompiledName("Sum")>]
let inline sumFloat (array: float array) : float =
System.Linq.Enumerable.Sum array

[<CompiledName("Sum")>]
let inline sumFloat32 (array: float32 array) : float32 =
System.Linq.Enumerable.Sum array

[<CompiledName("Sum")>]
let inline sumInt (array: int array) : int =
System.Linq.Enumerable.Sum array

[<CompiledName("Sum")>]
let inline sumInt64 (array: int64 array) : int64 =
System.Linq.Enumerable.Sum array
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would think that this would be a reasonable place to use static optimization syntax to specify which types should delegate to the LINQ method and which to the existing code, e.g.,

let inline sum (array: ^T array) : ^T =
    existingSumCode array
    when ^T : int   = System.Linq.Enumerable.Sum array
    when ^T : int64 = System.Linq.Enumerable.Sum array
    …

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure. I expect "static optimization conditionals" are a compile-time thing and not runtime? Because I can't check easily with sharplab.io, it says "error FS0817: Static optimization conditionals are only for use within the F# library"

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, the appropriate implementation would be chosen at compile-time once the type parameter was resolved.

You could add some IL tests under https://github.com/dotnet/fsharp/tree/main/tests/FSharp.Compiler.ComponentTests/EmittedIL if you wanted.

@T-Gro
Copy link
Member

T-Gro commented Apr 26, 2025

It looks like the error case is now different for average over an empty collection.
If it is the same exception type, and only a different message, we could justify the break.

(we should not evaluate a seq before calling into Average, since this would be breaking in a different way)

@Thorium
Copy link
Contributor Author

Thorium commented Apr 26, 2025

I did some initial tests to see if this makes sense at all or not. I used the current benchmarks\CompiledCodeBenchmarks\MicroPerf\MicroPerf.fsproj with adding following tests:

    [<Benchmark>]
    member x.ArraySum() = // Array sum
        array
        |> Array.sum 
        |> ignore

    [<Benchmark>]
    member x.ArrayAverage() = // There has an extra map, because average needs float
        array
        |> Array.map float
        |> Array.average 
        |> ignore

    [<Benchmark>]
    member x.ArraySeqSum() = // Seq sum by using array as base data
        array
        |> Seq.sum 
        |> ignore

    [<Benchmark>]
    member x.ListSeqSum() = // Seq sum by using list as base data
        list
        |> Seq.sum 
        |> ignore

And here are the results with current main:


BenchmarkDotNet v0.13.10, Windows 11 (10.0.26100.3915)
13th Gen Intel Core i9-13900H, 1 CPU, 20 logical and 14 physical cores
.NET SDK 9.0.203
  [Host]     : .NET 9.0.4 (9.0.425.16305), X64 RyuJIT AVX2 DEBUG
  Job-ZVNJYC : .NET 9.0.4 (9.0.425.16305), X64 RyuJIT AVX2
  Job-NFLFBL : .NET 9.0.4 (9.0.425.16305), X64 RyuJIT AVX2
  Job-ABSOZP : .NET 9.0.4 (9.0.425.16305), X64 RyuJIT AVX2

Server=True  

Method Job Arguments IterationCount LaunchCount WarmupCount Length Mean Error StdDev Ratio RatioSD Gen0 Allocated Alloc Ratio
ArraySum Job-ZVNJYC /p:BUILDING_USING_DOTNET=true Default Default Default 1000 206.4 ns 1.13 ns 1.06 ns 1.00 0.00 - - NA
ArraySum Job-NFLFBL /p:BUILDING_USING_DOTNET=true Default Default Default 1000 205.9 ns 0.50 ns 0.39 ns 1.00 0.01 - - NA
ArraySum Job-ABSOZP Default 2 2 1 1000 207.8 ns 9.28 ns 1.44 ns 1.01 0.01 - - NA
ArrayAverage Job-ZVNJYC /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,538.6 ns 35.62 ns 105.04 ns 1.00 0.00 0.1736 8024 B 1.00
ArrayAverage Job-NFLFBL /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,471.2 ns 29.23 ns 53.45 ns 0.94 0.07 0.1736 8024 B 1.00
ArrayAverage Job-ABSOZP Default 2 2 1 1000 1,495.0 ns 759.33 ns 117.51 ns 0.92 0.07 0.1736 8024 B 1.00
ArraySeqSum Job-ZVNJYC /p:BUILDING_USING_DOTNET=true Default Default Default 1000 500.6 ns 3.69 ns 3.46 ns 1.00 0.00 - 32 B 1.00
ArraySeqSum Job-NFLFBL /p:BUILDING_USING_DOTNET=true Default Default Default 1000 496.4 ns 1.80 ns 1.40 ns 0.99 0.01 - 32 B 1.00
ArraySeqSum Job-ABSOZP Default 2 2 1 1000 498.9 ns 34.99 ns 5.41 ns 1.00 0.01 - 32 B 1.00
ListSeqSum Job-ZVNJYC /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,234.6 ns 3.12 ns 2.91 ns 1.00 0.00 - 40 B 1.00
ListSeqSum Job-NFLFBL /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,243.7 ns 19.42 ns 17.21 ns 1.01 0.01 - 40 B 1.00
ListSeqSum Job-ABSOZP Default 2 2 1 1000 1,251.6 ns 55.34 ns 8.56 ns 1.01 0.01 0.0019 40 B 1.00
ArraySum Job-ZVNJYC /p:BUILDING_USING_DOTNET=true Default Default Default 10000 1,949.4 ns 8.32 ns 6.95 ns 1.00 0.00 - - NA
ArraySum Job-NFLFBL /p:BUILDING_USING_DOTNET=true Default Default Default 10000 1,956.5 ns 24.32 ns 22.75 ns 1.00 0.01 - - NA
ArraySum Job-ABSOZP Default 2 2 1 10000 1,966.3 ns 128.42 ns 19.87 ns 1.01 0.01 - - NA
ArrayAverage Job-ZVNJYC /p:BUILDING_USING_DOTNET=true Default Default Default 10000 13,892.3 ns 415.41 ns 1,211.78 ns 1.00 0.00 1.8616 80024 B 1.00
ArrayAverage Job-NFLFBL /p:BUILDING_USING_DOTNET=true Default Default Default 10000 15,129.6 ns 242.87 ns 227.18 ns 1.09 0.13 1.9379 80024 B 1.00
ArrayAverage Job-ABSOZP Default 2 2 1 10000 12,991.8 ns 8,355.23 ns 1,292.98 ns 1.00 0.26 1.8616 80024 B 1.00
ArraySeqSum Job-ZVNJYC /p:BUILDING_USING_DOTNET=true Default Default Default 10000 4,889.1 ns 48.55 ns 43.04 ns 1.00 0.00 - 32 B 1.00
ArraySeqSum Job-NFLFBL /p:BUILDING_USING_DOTNET=true Default Default Default 10000 4,828.3 ns 45.71 ns 38.17 ns 0.99 0.01 - 32 B 1.00
ArraySeqSum Job-ABSOZP Default 2 2 1 10000 4,833.0 ns 122.61 ns 18.97 ns 0.98 0.00 - 32 B 1.00
ListSeqSum Job-ZVNJYC /p:BUILDING_USING_DOTNET=true Default Default Default 10000 14,042.3 ns 280.58 ns 483.98 ns 1.00 0.00 - 40 B 1.00
ListSeqSum Job-NFLFBL /p:BUILDING_USING_DOTNET=true Default Default Default 10000 13,767.9 ns 240.03 ns 420.40 ns 0.98 0.04 - 40 B 1.00
ListSeqSum Job-ABSOZP Default 2 2 1 10000 13,537.7 ns 4,046.83 ns 626.25 ns 0.95 0.07 - 40 B 1.00

Here are the results with this PR:

Method Job Arguments IterationCount LaunchCount WarmupCount Length Mean Error StdDev Median Ratio RatioSD Gen0 Allocated Alloc Ratio
ArraySum Job-WQFBJH /p:BUILDING_USING_DOTNET=true Default Default Default 1000 60.66 ns 0.489 ns 0.434 ns 60.59 ns 1.00 0.00 - - NA
ArraySum Job-ZZOCDZ /p:BUILDING_USING_DOTNET=true Default Default Default 1000 207.89 ns 3.431 ns 3.209 ns 206.96 ns 3.43 0.05 - - NA
ArraySum Job-BMQAWT Default 2 2 1 1000 60.18 ns 3.505 ns 0.542 ns 60.19 ns 0.99 0.02 - - NA
ArrayAverage Job-WQFBJH /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,693.99 ns 29.205 ns 28.683 ns 1,694.44 ns 1.00 0.00 0.1736 8024 B 1.00
ArrayAverage Job-ZZOCDZ /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,443.74 ns 47.701 ns 140.649 ns 1,446.84 ns 0.87 0.04 0.1736 8024 B 1.00
ArrayAverage Job-BMQAWT Default 2 2 1 1000 1,486.78 ns 226.790 ns 35.096 ns 1,493.10 ns 0.89 0.02 0.1736 8024 B 1.00
ArraySeqSum Job-WQFBJH /p:BUILDING_USING_DOTNET=true Default Default Default 1000 60.23 ns 0.426 ns 0.378 ns 60.11 ns 1.00 0.00 - - NA
ArraySeqSum Job-ZZOCDZ /p:BUILDING_USING_DOTNET=true Default Default Default 1000 497.31 ns 4.195 ns 3.719 ns 496.69 ns 8.26 0.09 - 32 B NA
ArraySeqSum Job-BMQAWT Default 2 2 1 1000 61.30 ns 1.343 ns 0.208 ns 61.31 ns 1.02 0.00 - - NA
ListSeqSum Job-WQFBJH /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,154.49 ns 9.687 ns 9.061 ns 1,155.70 ns 1.00 0.00 - 40 B 1.00
ListSeqSum Job-ZZOCDZ /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,228.62 ns 5.630 ns 4.395 ns 1,228.27 ns 1.06 0.01 - 40 B 1.00
ListSeqSum Job-BMQAWT Default 2 2 1 1000 1,164.41 ns 66.398 ns 10.275 ns 1,159.92 ns 1.01 0.02 0.0019 40 B 1.00
ArraySum Job-WQFBJH /p:BUILDING_USING_DOTNET=true Default Default Default 10000 546.81 ns 1.656 ns 1.549 ns 547.20 ns 1.00 0.00 - - NA
ArraySum Job-ZZOCDZ /p:BUILDING_USING_DOTNET=true Default Default Default 10000 1,961.44 ns 25.704 ns 24.044 ns 1,961.63 ns 3.59 0.05 - - NA
ArraySum Job-BMQAWT Default 2 2 1 10000 541.97 ns 33.331 ns 5.158 ns 541.34 ns 0.99 0.01 - - NA
ArrayAverage Job-WQFBJH /p:BUILDING_USING_DOTNET=true Default Default Default 10000 16,012.49 ns 316.673 ns 721.226 ns 16,238.87 ns 1.00 0.00 1.8463 80024 B 1.00
ArrayAverage Job-ZZOCDZ /p:BUILDING_USING_DOTNET=true Default Default Default 10000 13,651.54 ns 310.627 ns 865.903 ns 13,843.05 ns 0.84 0.08 1.8768 80024 B 1.00
ArrayAverage Job-BMQAWT Default 2 2 1 10000 17,271.21 ns 3,620.263 ns 560.240 ns 17,365.04 ns 1.10 0.04 1.8921 80024 B 1.00
ArraySeqSum Job-WQFBJH /p:BUILDING_USING_DOTNET=true Default Default Default 10000 554.40 ns 3.815 ns 3.569 ns 554.73 ns 1.00 0.00 - - NA
ArraySeqSum Job-ZZOCDZ /p:BUILDING_USING_DOTNET=true Default Default Default 10000 4,813.90 ns 39.532 ns 33.011 ns 4,801.26 ns 8.69 0.09 - 32 B NA
ArraySeqSum Job-BMQAWT Default 2 2 1 10000 551.93 ns 12.280 ns 1.900 ns 552.36 ns 1.00 0.00 - - NA
ListSeqSum Job-WQFBJH /p:BUILDING_USING_DOTNET=true Default Default Default 10000 14,523.24 ns 768.122 ns 2,240.648 ns 13,893.55 ns 1.00 0.00 - 40 B 1.00
ListSeqSum Job-ZZOCDZ /p:BUILDING_USING_DOTNET=true Default Default Default 10000 15,181.03 ns 458.748 ns 1,338.189 ns 14,985.06 ns 1.07 0.18 - 40 B 1.00
ListSeqSum Job-BMQAWT Default 2 2 1 10000 13,985.62 ns 10,680.237 ns 1,652.779 ns 13,530.39 ns 1.00 0.17 - 40 B 1.00

Edit: I used Net 9 but the FSharp.Core.dll netstandard2.0 version in both, which was probably a mistake because Spans are truely efficient on netstandard2.1 only (?)

@Thorium
Copy link
Contributor Author

Thorium commented Apr 27, 2025

The IL for Enumerable is very complicated, and is heavily relying on the JIT to simplify it. In Release mode, I observe Enumerable to take half the time; in Debug mode Enumerable takes about 4x the time.

Hmm, I'm thinking if default FSI is compiled with debug mode and people use F# as a scripting language, then performance optimizations like this could be marked as #if !DEBUG. However, it would be even weirder if an error message were different between debug and release.

I did run the same performance tests with FSharp.Core.dll netstandard2.1 version

Main branch:

Method Job Arguments IterationCount LaunchCount WarmupCount Length Mean Error StdDev Ratio RatioSD Gen0 Allocated Alloc Ratio
ArraySum Job-WCJSKA /p:BUILDING_USING_DOTNET=true Default Default Default 1000 207.2 ns 2.34 ns 2.19 ns 1.00 0.00 - - NA
ArraySum Job-ZZTGPQ /p:BUILDING_USING_DOTNET=true Default Default Default 1000 204.2 ns 3.47 ns 2.90 ns 0.99 0.02 - - NA
ArraySum Job-EYKYAG Default 2 2 1 1000 206.8 ns 22.17 ns 3.43 ns 1.01 0.02 - - NA
ArrayAverage Job-WCJSKA /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,503.2 ns 19.56 ns 16.33 ns 1.00 0.00 0.1736 8024 B 1.00
ArrayAverage Job-ZZTGPQ /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,498.6 ns 20.87 ns 19.52 ns 1.00 0.02 0.1736 8024 B 1.00
ArrayAverage Job-EYKYAG Default 2 2 1 1000 1,514.8 ns 164.72 ns 25.49 ns 1.01 0.01 0.1736 8024 B 1.00
ArraySeqSum Job-WCJSKA /p:BUILDING_USING_DOTNET=true Default Default Default 1000 490.6 ns 2.15 ns 1.80 ns 1.00 0.00 - 32 B 1.00
ArraySeqSum Job-ZZTGPQ /p:BUILDING_USING_DOTNET=true Default Default Default 1000 486.8 ns 2.41 ns 2.13 ns 0.99 0.01 - 32 B 1.00
ArraySeqSum Job-EYKYAG Default 2 2 1 1000 488.8 ns 74.19 ns 11.48 ns 1.00 0.02 - 32 B 1.00
ListSeqSum Job-WCJSKA /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,214.5 ns 2.83 ns 2.51 ns 1.00 0.00 - 40 B 1.00
ListSeqSum Job-ZZTGPQ /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,241.1 ns 19.15 ns 17.91 ns 1.02 0.01 - 40 B 1.00
ListSeqSum Job-EYKYAG Default 2 2 1 1000 1,216.6 ns 34.26 ns 5.30 ns 1.00 0.00 0.0019 40 B 1.00
ArraySum Job-WCJSKA /p:BUILDING_USING_DOTNET=true Default Default Default 10000 1,905.3 ns 8.41 ns 7.02 ns 1.00 0.00 - - NA
ArraySum Job-ZZTGPQ /p:BUILDING_USING_DOTNET=true Default Default Default 10000 1,924.9 ns 12.14 ns 11.36 ns 1.01 0.01 - - NA
ArraySum Job-EYKYAG Default 2 2 1 10000 1,933.3 ns 95.32 ns 14.75 ns 1.01 0.01 - - NA
ArrayAverage Job-WCJSKA /p:BUILDING_USING_DOTNET=true Default Default Default 10000 13,970.7 ns 474.45 ns 1,398.93 ns 1.00 0.00 1.8463 80024 B 1.00
ArrayAverage Job-ZZTGPQ /p:BUILDING_USING_DOTNET=true Default Default Default 10000 13,967.8 ns 334.64 ns 986.68 ns 1.01 0.12 1.8311 80024 B 1.00
ArrayAverage Job-EYKYAG Default 2 2 1 10000 12,963.1 ns 7,565.88 ns 1,170.83 ns 0.85 0.07 1.8768 80024 B 1.00
ArraySeqSum Job-WCJSKA /p:BUILDING_USING_DOTNET=true Default Default Default 10000 4,710.8 ns 18.93 ns 15.80 ns 1.00 0.00 - 32 B 1.00
ArraySeqSum Job-ZZTGPQ /p:BUILDING_USING_DOTNET=true Default Default Default 10000 4,760.8 ns 17.52 ns 15.53 ns 1.01 0.00 - 32 B 1.00
ArraySeqSum Job-EYKYAG Default 2 2 1 10000 4,776.5 ns 345.62 ns 53.49 ns 1.01 0.01 - 32 B 1.00
ListSeqSum Job-WCJSKA /p:BUILDING_USING_DOTNET=true Default Default Default 10000 14,616.1 ns 355.10 ns 1,030.22 ns 1.00 0.00 - 40 B 1.00
ListSeqSum Job-ZZTGPQ /p:BUILDING_USING_DOTNET=true Default Default Default 10000 13,809.1 ns 270.69 ns 300.87 ns 0.94 0.08 - 40 B 1.00
ListSeqSum Job-EYKYAG Default 2 2 1 10000 15,396.3 ns 3,747.35 ns 579.91 ns 1.05 0.14 - 40 B 1.00

This PR

Method Job Arguments IterationCount LaunchCount WarmupCount Length Mean Error StdDev Median Ratio RatioSD Gen0 Allocated Alloc Ratio
ArraySum Job-YRWBVV /p:BUILDING_USING_DOTNET=true Default Default Default 1000 59.19 ns 0.550 ns 0.514 ns 59.01 ns 1.00 0.00 - - NA
ArraySum Job-YQEOCP /p:BUILDING_USING_DOTNET=true Default Default Default 1000 206.10 ns 0.720 ns 0.674 ns 206.08 ns 3.48 0.03 - - NA
ArraySum Job-SEOIAS Default 2 2 1 1000 59.65 ns 4.451 ns 0.689 ns 59.64 ns 1.01 0.02 - - NA
ArrayAverage Job-YRWBVV /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,729.86 ns 34.440 ns 72.645 ns 1,750.76 ns 1.00 0.00 0.1736 8024 B 1.00
ArrayAverage Job-YQEOCP /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,521.22 ns 27.082 ns 22.615 ns 1,522.65 ns 0.94 0.05 0.1736 8024 B 1.00
ArrayAverage Job-SEOIAS Default 2 2 1 1000 1,658.32 ns 130.915 ns 20.259 ns 1,666.57 ns 0.98 0.02 0.1736 8024 B 1.00
ArraySeqSum Job-YRWBVV /p:BUILDING_USING_DOTNET=true Default Default Default 1000 59.88 ns 0.326 ns 0.305 ns 59.84 ns 1.00 0.00 - - NA
ArraySeqSum Job-YQEOCP /p:BUILDING_USING_DOTNET=true Default Default Default 1000 496.87 ns 6.676 ns 6.245 ns 493.92 ns 8.30 0.10 - 32 B NA
ArraySeqSum Job-SEOIAS Default 2 2 1 1000 60.61 ns 3.319 ns 0.514 ns 60.63 ns 1.01 0.01 - - NA
ListSeqSum Job-YRWBVV /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,163.60 ns 18.969 ns 17.743 ns 1,162.85 ns 1.00 0.00 - 40 B 1.00
ListSeqSum Job-YQEOCP /p:BUILDING_USING_DOTNET=true Default Default Default 1000 1,230.86 ns 6.546 ns 6.123 ns 1,233.38 ns 1.06 0.02 - 40 B 1.00
ListSeqSum Job-SEOIAS Default 2 2 1 1000 1,156.84 ns 66.957 ns 10.362 ns 1,153.00 ns 0.99 0.02 0.0019 40 B 1.00
ArraySum Job-YRWBVV /p:BUILDING_USING_DOTNET=true Default Default Default 10000 553.52 ns 6.542 ns 6.119 ns 554.30 ns 1.00 0.00 - - NA
ArraySum Job-YQEOCP /p:BUILDING_USING_DOTNET=true Default Default Default 10000 1,944.70 ns 16.488 ns 15.423 ns 1,944.27 ns 3.51 0.05 - - NA
ArraySum Job-SEOIAS Default 2 2 1 10000 547.22 ns 53.119 ns 8.220 ns 543.16 ns 1.00 0.02 - - NA
ArrayAverage Job-YRWBVV /p:BUILDING_USING_DOTNET=true Default Default Default 10000 16,386.69 ns 261.673 ns 244.769 ns 16,295.85 ns 1.00 0.00 1.8768 80024 B 1.00
ArrayAverage Job-YQEOCP /p:BUILDING_USING_DOTNET=true Default Default Default 10000 13,693.86 ns 512.901 ns 1,512.301 ns 14,049.32 ns 0.87 0.11 1.8921 80024 B 1.00
ArrayAverage Job-SEOIAS Default 2 2 1 10000 16,549.34 ns 5,509.571 ns 852.612 ns 16,654.92 ns 1.01 0.05 1.8311 80024 B 1.00
ArraySeqSum Job-YRWBVV /p:BUILDING_USING_DOTNET=true Default Default Default 10000 549.69 ns 2.934 ns 2.600 ns 549.51 ns 1.00 0.00 - - NA
ArraySeqSum Job-YQEOCP /p:BUILDING_USING_DOTNET=true Default Default Default 10000 4,843.34 ns 64.337 ns 60.181 ns 4,826.96 ns 8.82 0.12 - 32 B NA
ArraySeqSum Job-SEOIAS Default 2 2 1 10000 551.21 ns 42.723 ns 6.611 ns 550.96 ns 1.00 0.02 - - NA
ListSeqSum Job-YRWBVV /p:BUILDING_USING_DOTNET=true Default Default Default 10000 13,349.78 ns 349.754 ns 992.195 ns 12,981.18 ns 1.00 0.00 - 40 B 1.00
ListSeqSum Job-YQEOCP /p:BUILDING_USING_DOTNET=true Default Default Default 10000 14,501.57 ns 311.609 ns 894.065 ns 14,248.72 ns 1.09 0.10 - 40 B 1.00
ListSeqSum Job-SEOIAS Default 2 2 1 10000 12,715.10 ns 817.355 ns 126.487 ns 12,726.11 ns 0.99 0.03 - 40 B 1.00

By quick look of this, the Sum seems to be improved but the Average not really. Should I revert the Average change?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
Status: New
Development

Successfully merging this pull request may close these issues.

3 participants