dotnet / dotnet/fsharp

Boxing occurs when hashing a range - 200+ MB over a 90 seconds of normal IDE usage

Open
#6,052 1 comment 1 reaction 0 assignees View on GitHub
Feature Improvement Theme-Performance
Dominant language
F#
Stars
4.3k
Forks
876
Avg merge
4d 22h
Merged PRs (30d)
144

Description

This was noticed in #6047 but not addressed in #6048

Although the `range` type [overrides `GetHashCode`](https://github.com/Microsoft/visualfsharp/blob/master/src/fsharp/range.fs#L194) to call the `hash` function on two `int64`s, which specializes to that numeric type as you'd expect, the actual call chain ends up boxing the `range` type because it calls `GenericHashIntrinsic`:

https://github.com/Microsoft/visualfsharp/blob/44c7e10ca432d8f245a6d8f8e0ec19ca8c72edaf/src/fsharp/FSharp.Core/prim-types.fs#L1795

Ranges are hashed all of the time in normal IDE usage, including in various routines that will call `hash` directly or through the use of a `distinct` or `groupBy` function.

The net result was a few hundred MB in allocations over ~90 seconds of normal IDE usage.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.