Conversation
0d15485 to
9457784
Compare
0321b45 to
072ade0
Compare
|
I tested performance with ghc-9.2.7 comparing this pull with branch realfloat-bench t Benchmark bytestring-bench: RUNNING...
All
Data.ByteString.Builder
Non-bounded encodings
RealFloat
FGeneric
Positive
Float (100000): OK
83.8 ms ± 3.4 ms, 33% less than baseline
Double (100000): OK
59.2 ms ± 2.8 ms, 46% less than baseline
DoubleSmall (100000): OK
213 ms ± 18 ms, 20% less than baseline
Negative
Float (100000): OK
82.8 ms ± 6.7 ms, 32% less than baseline
Double (100000): OK
62.0 ms ± 4.5 ms, 42% less than baseline
DoubleSmall (100000): OK
62.2 ms ± 5.6 ms, 43% less than baseline
Special
Float Average (100000): OK
28.4 ms ± 2.2 ms, same as baseline
Double Average (100000): OK
29.4 ms ± 2.8 ms, same as baseline
FScientific
Positive
Float (100000): OK
65.5 ms ± 4.5 ms, 34% less than baseline
Double (100000): OK
60.0 ms ± 3.4 ms, 41% less than baseline
DoubleSmall (100000): OK
58.6 ms ± 2.8 ms, 47% less than baseline
Negative
Float (100000): OK
65.8 ms ± 4.5 ms, 34% less than baseline
Double (100000): OK
57.0 ms ± 4.5 ms, 45% less than baseline
DoubleSmall (100000): OK
61.9 ms ± 2.2 ms, 45% less than baseline
Special
Float Average (100000): OK
29.1 ms ± 2.2 ms, 37% less than baseline
Double Average (100000): OK
29.1 ms ± 2.2 ms, 29% less than baseline
FStandard
Positive
without
Float (100000): OK
341 ms ± 22 ms, same as baseline
Double (100000): OK
890 ms ± 72 ms, same as baseline
DoubleSmall (100000): OK
436 ms ± 16 ms, 11% less than baseline
precision
Float-Preciaion-1 (100000): OK
419 ms ± 22 ms, same as baseline
Double-Preciaion-1 (100000): OK
129 ms ± 7.8 ms, 28% less than baseline
DoubleSmall-Preciaion-1 (100000): OK
390 ms ± 13 ms, 15% less than baseline
Float-Preciaion-6 (100000): OK
520 ms ± 27 ms, 10% less than baseline
Double-Preciaion-6 (100000): OK
252 ms ± 13 ms, 17% less than baseline
DoubleSmall-Preciaion-6 (100000): OK
512 ms ± 18 ms, 12% less than baseline
Negative
without
Float (100000): OK
335 ms ± 13 ms, 10% less than baseline
Double (100000): OK
842 ms ± 45 ms, 9% less than baseline
DoubleSmall (100000): OK
424 ms ± 22 ms, 13% less than baseline
precision
Float-Preciaion-1 (100000): OK
408 ms ± 18 ms, 10% less than baseline
Double-Preciaion-1 (100000): OK
128 ms ± 11 ms, 29% less than baseline
DoubleSmall-Preciaion-1 (100000): OK
399 ms ± 22 ms, 12% less than baseline
Float-Preciaion-6 (100000): OK
542 ms ± 54 ms, same as baseline
Double-Preciaion-6 (100000): OK
252 ms ± 18 ms, 18% less than baseline
DoubleSmall-Preciaion-6 (100000): OK
517 ms ± 18 ms, 10% less than baseline
Special
Float Average (100000): OK
27.1 ms ± 2.2 ms, same as baseline
Double Average (100000): OK
29.2 ms ± 2.8 ms, same as baseline |
02269a9 to
9e7e6bd
Compare
… parameters and returns a maybe
…ons to determine special string
also helps prevent future overflow implementation errors for example 128 bit floats
…n manipulate it beyond the regular formants
ce6e47c to
8479796
Compare
| import Data.ByteString.Builder.RealFloat.Internal (FloatFormat(..), fScientific, fGeneric) | ||
| import Data.ByteString.Builder.RealFloat.Internal (positiveZero, negativeZero) |
There was a problem hiding this comment.
| import Data.ByteString.Builder.RealFloat.Internal (FloatFormat(..), fScientific, fGeneric) | |
| import Data.ByteString.Builder.RealFloat.Internal (positiveZero, negativeZero) | |
| import Data.ByteString.Builder.RealFloat.Internal (FloatFormat(..), fScientific, fGeneric, SpecialStrings(..)) |
Importing positiveZero and negativeZero directly by name doesn't work so well due to NoFieldSelectors/DuplicateRecordFields
|
|
||
| -- | Unpacks a 16-bit word into 2 bytes [lsb, msb] | ||
| unpackWord16 :: Word# -> (# Word#, Word# #) | ||
| unpackWord16 :: Word# -> (# Word8#, Word8# #) |
There was a problem hiding this comment.
Word8# doesn't exist until ghc-8.8, and the conversion operators were renamed in ghc-9.2, with no compatibility wrappers left behind that I could quickly find.
If you really want to track Word8#-versus-Word# in the types, I guess the necessary CPP looks like this:
#if !MIN_VERSION_base(4,13,0)
type Word8# = Word#
wordToWord8# :: Word# -> Word8#
wordToWord8# = narrow8Word#
word8ToWord# :: Word8# -> Word#
word8ToWord# x = x
#elif !MIN_VERSION_base(4,16,0)
wordToWord8# :: Word# -> Word8#
wordToWord8# = narrowWord8#
word8ToWord# :: Word8# -> Word#
word8ToWord# = extendWord8#
#endif
Or the compatibility story gets easier with boxed types, with the trade-off being that we need to make sure GHC can unbox everything for us in worker/wrapper.
| {-# LANGUAGE AllowAmbiguousTypes #-} | ||
| {-# LANGUAGE BlockArguments #-} | ||
| {-# LANGUAGE NamedFieldPuns #-} | ||
| {-# LANGUAGE NoFieldSelectors #-} |
There was a problem hiding this comment.
NoFieldSelectors only exists since ghc-9.2.
#636
@clyring