Skip to content

[benchmark] Measure memory with rusage and a TON of gardening #18124

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

Merged
merged 34 commits into from
Jul 23, 2018

Conversation

palimondo
Copy link
Contributor

@palimondo palimondo commented Jul 21, 2018

This PR adds a feature to measure and report system environment indicators during benchmark execution:

  • Memory usage with maximum resident set size (MAX_RSS) in bytes

Proxy indicators of system load level:

  • Number of Involuntary Context Switches (ICS)
  • Number of Voluntary Context Switches (VCS)

MAX_RSS delta is reported in the last column of the log report, when enabled using the --memory flag.

The --verbose mode additionaly reports full values measured before and after the benchmark execution as well as their delta for MAX_RSS, ICS and VCS.

Benchmark_Driver already had the MAX_RSS reporting implemented on top of time -lp utility. This direct implementation using rusage in the Benchmark_O improves upon it by reporting the delta of the MAX_RSS before and after the benchmark execution, effectively excluding any overhead caused by the measurement infrastructure. Same is true for the system load indicators. This significantly reduces the variability in the reported values. A follow-up PR will switch the Benchmark_Driver to also use this implementation.


The PR also introduces thorough test coverage of the Benchmark_O's public interface (command line arguments and log format). The lit tests were converted into markdown format, to ease their self-documentation (literate testing), resulting in executable specification of the API. See Benchmark_O.test.md.

The DriverUtils.swift had a lot of accumulated technical debt, which required a ton of gardening to clean up. First a test coverage of a feature is established, followed by functionally neutral refactoring (labeled [Gardening] in the commit message). After the clean up, the new features were added on top of the improved code organization.

Major refactoring of the command line argument parsing has improved their error handling. The previously solid argument syntax parsing (parseArgs) is joined inside the ArgsParse.swift with type checking of arguments (previously done ad-hoc, per-argument in DriverUtils.swift) to form ArgumentParser class which handles the complete job of parsing command line arguments. It supports declarative configuration of the parsing, modeled after the interface of python's argparse module with the flexible addArgument method.

Program's API has remained largely unchanged, with the small exception of removed bogus Totals stats (c7fc745). Program's human facing interface was majorly improved to provide full documentation of all arguments with the --help command.

I've structured the PR as a series of small, incremental changes with detailed descriptions in the commit messages, it is therefore best reviewed sequentially by individual commits.

palimondo added 26 commits July 16, 2018 17:58
The testing of `Benchmark_O` and its public interface needs more documentation. The `lit` tests can be embedded in anything. Lets combine these.
Reformatting the `lit` test file to markdown format:

* Removed the unnecessary `// `prefix.
* Requires preambule in comment
* Test documentation intro
* Added check for running by test number.
* Documented “dry run” using `--list`.
* Moved real run test to the end.
* Added checks for logging benchmarks measurements (header and stats).
* Added check that specifying the same test multiple times runs it just once.
Report only the total number of executed tests.

Aggregating MIN, MAX and MEAN values for all executed benchmarks together (with microsecond precision!) has no statistical relevance.
Moved the formatting of`BenchmarkResults` into `runBenchmarks` function which already contained the logging of header and the special case of unsupported benchmark.
Test the `--verbose` mode output and the `--num-samples` option.
The `Test`struct was forwarding everything to `BenchmarkInfo` and its only contribution was carrying of the index. Tuple is fine for that.
The indices (test numbers) are strings on both ends of the IO — in user input as well as when printed to the console. We can spare few conversions and just store them directly as `String`.
Measure and report system environment indicators during benchmark execution:

* Memory usage with maximum resident set size (MAX_RSS) in bytes

Proxy indicators of system load level:

* Number of Involuntary Context Switches (ICS)
* Number of Voluntary Context Switches (VCS)

MAX_RSS delta is always reported in the last column of the log report.

The `--verbose` mode additionaly reports full values measured before and after the benchmark execution as well as their delta for MAX_RSS, ICS and VCS.
* Fix: flushing stdout before crashing to enable testing.
* Added tests that verify reporting of errors when the parsing of command line arguments fails.
Refactored to use Swift’s idiomatic error handling.
In case of invalid argument errors, the message is printed to `stderr` and we exit gracefully with error code 1. We no longer crash the app in most cases.
We no longer crash when the argument value parsing fails, but report an error.
Added handling for arguments that don’t have a value (flags), or whose values are optional (they can be empty). This covers all the argument types currently used in Benchmark_O with the single `optionalArg` function.
* Extracted tag parser
* Reordered all parsing of optional arguments to be grouped together.
Processing command line arguments is an integral part of `TestConfig` initialization. Make it explicit.
Moving towards immutable TestConfig.

The pattern used is inspired by the`PartialBenchmarkConfig` from [criterion.rs](https://github.com/japaric/criterion.rs/blob/master/src/benchmark.rs).

The idea is to have a temporary mutable struct which collects the command line arguments and is filled by the “parser” (which will be extracted later). The partial configuration is used to initialize the immutable `TestConfig`.

The optionality of the command line parameters is represented by the corresponding properties being `Optional`. (Accidentaly, all our arguments are optional… but that’s beside the point.) Null coalescing operator is used to fill in the defaults during initialization.

For some reason, the compiler found `optionalArg` calls for `tags` and `skip-tags` ambiguous, when types changed to `Set<BenchmarkCategory>?`, which was resolved by providing fully qualified key paths for them (`\PartialTestConfig.tags`).
The `TestConfig` is now completely immutable. Arguments that are not necessary for running benchmarks were moved inside the config initialization, which also subsumed the  `printRunInfo` function for displaying the configuration details in verbose mode.
Refactored `filterTests` to use two nested functions that better reveal the underlying logic.
Renamed `optionalArg` to `parseArg` because it can now also handle the positional arguments. Now all the command line arguments are handled through this function.

Minor naming improvement of the `filterTests` parameter.
Moved the argument parsing logic into new class `ArgumentParser`. The `checked` function is also moved to the ArgParse.swift, next to the parser.
The `ArgumentParser` now has a configuration phase which specifies the supported arguments and their handling. The configured parser is then executed using the `parse` method which returns the parsed result.
@palimondo palimondo changed the title [WIP][benchmark] Measure memory with rusage and a TON of gardening [WIP][benchmark] Measure memory with rusage and a TON of gardening Jul 21, 2018
Moved the printing of help message inside the `ArgumentParser`, which has all the necessary info.

Added test that checks the `--help` option.
In case of invalid command line arguments, there is no reasonable recovery, the `ArgumentParser` can exit the program itself.  It is therefore no longer necessary to propagate the `ArgumentError`s outside of the parser.
The `parseArgs` funtion is now a private method on `ArgumentParser`.

Removed `Arguments` struct and moved the `Argument` as a nested struct into the parser.

Adjusted error messages and the corresponding checks.
The `--help` option now prints standard usage description with documentaion for all arguments:

````
 $ Benchmark_O --help
usage: Benchmark_O [--argument=VALUE] [TEST [TEST ...]]

positional arguments:
 TEST           name or number of the benchmark to measure

optional arguments:
 --help         show this help message and exit
 --num-samples  number of samples to take per benchmark; default: 1
 --num-iters    number of iterations averaged in the sample;
                default: auto-scaled to measure for 1 second
 --iter-scale   number of seconds used for num-iters calculation
                default: 1
 --verbose      increase output verbosity
 --delim        value delimiter used for log output; default: ,
 --tags         run tests matching all the specified categories
 --skip-tags    don't run tests matching any of the specified
                categories; default: unstable,skip
 --sleep        number of seconds to sleep after benchmarking
 --list         don't run the tests, just log the list of test
                numbers, names and tags (respects specified filters)
````
Printing of the MAX_RSS is now hidden behind the optional `--memory` flag.
@palimondo
Copy link
Contributor Author

@eeckstein Please review 🙏

@palimondo palimondo changed the title [WIP][benchmark] Measure memory with rusage and a TON of gardening [benchmark] Measure memory with rusage and a TON of gardening Jul 22, 2018
Copy link
Contributor

@eeckstein eeckstein left a comment

Choose a reason for hiding this comment

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

Basically LGTM.
I have some (mostly stylistic) comments about some minor issues.

case let .invalidType(value, type, argument):
return (argument == nil)
? "'\(value)' is not a valid '\(type)'"
: "'\(value)' is not a valid '\(type)' for '\(argument!)'"
Copy link
Contributor

Choose a reason for hiding this comment

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

You could omit printing the type here. IMO it's sufficient to print "'(value)' is not a valid value for '(argument)'". Then you can also omit the (not-trivial) code to extract the type name. Printing the type name (e.g. "Int") is not very readable anyway.
Just a suggestion to make things simpler.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I thought it was helpful user feedback. For example, when you use a wrong tag, the message will read: error: 'bogus' is not a valid 'BenchmarkCategory'. So you'll know what to look for.

The type-checking parser for BenchmarkCategory (func tags) is called from a nested context within the attribute parsers for tags and skip-tags, where it doesn't have access to the argument name. The best it could do, would be to say 'bogus' is not valid value'.

I'm not sure that's the right trade-off here. I think it's worth a little bit of code complexity for much better QoL.

if type.starts(with: "Optional<") {
let s = type.index(after: type.index(of:"<")!)
let e = type.index(before: type.endIndex) // ">"
type = String(type[s..<e]) // strip Optional< >
Copy link
Contributor

Choose a reason for hiding this comment

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

Somehow a little bit hacky. As I said, you could just omit it.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Well, that's just how String processing in pure Swift looks like. 😕

try arguments.forEach { try $0.apply() } // parse all arguments
return result
} catch let error as ArgumentError {
fflush(stdout)
Copy link
Contributor

Choose a reason for hiding this comment

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

This is not needed because you exit with exit() and not with fatalError()

Copy link
Contributor Author

Choose a reason for hiding this comment

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

OK, I read the man exit(3) and I think I understand now. Does that mean I should add fflush(stdout) before the fatalError in the default catch?

} catch let error as ArgumentError {
fflush(stdout)
fputs("error: \(error)\n", stderr)
fflush(stderr)
Copy link
Contributor

Choose a reason for hiding this comment

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

The same here. Also, stderr is flushed by default

private func parseArgs() throws {

// For each argument we are passed...
var passThroughArgs = false
Copy link
Contributor

Choose a reason for hiding this comment

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

passThroughArgs is not used in the benchmarks. Can you remove it?

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 wasn't exactly sure what that does… ;-)

struct Argument {
let name: String?
let help: String?
let apply: () throws -> ()
Copy link
Contributor

Choose a reason for hiding this comment

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

The only purpose of this closure is to distinguish between --help and all other arguments. Wouldn't a good old style "if arg == help ... " simplify the whole code and make it more readable?

Copy link
Contributor Author

@palimondo palimondo Jul 23, 2018

Choose a reason for hiding this comment

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

The purpose of that closure (introduced in e5cbfcc) is to type-erase the generic T from parsers, so that they can be stored in []. The parsing (type-checking) happens as side effect of its execution. It being useful for printing help is just a pleasant accident.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

It isn't exactly obvious, so I'll add a better documentation for all of this.


/// Is verbose output enabled?
var verbose: Bool = false
let iterationScale: Int
Copy link
Contributor

Choose a reason for hiding this comment

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

Can you rename this to something like "sampleTime" and make it a Double, so that times < 1s can be specified? (If you prefer you can do it in a follow-up commit).

Copy link
Contributor Author

Choose a reason for hiding this comment

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

That makes perfect sense! Frankly, I wasn't fully aware how it worked until I was writing the help description in the penultimate commit.

help: "number of iterations averaged in the sample;\n" +
"default: auto-scaled to measure for 1 second",
parser: { UInt($0) })
p.addArgument("--iter-scale", \.iterationScale,
Copy link
Contributor

Choose a reason for hiding this comment

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

Also here: can you rename the option to e.g. --sample-time? That's actually what it is.

let fixedNumIters: UInt
let numSamples: Int
let verbose: Bool
let logMemory: Bool
Copy link
Contributor

Choose a reason for hiding this comment

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

Can you re-add the comments?

self.c = config
}

private static func usage() -> rusage {
Copy link
Contributor

Choose a reason for hiding this comment

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

A better name for this function would be memoryUsage

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I thought so too initially, but it is used to also measure system load (ICS, VCS). $ man getrusage says it means "get information about resource utilization", so I guess more proper name would be getResourceUtilization(). What do you think?

* Restored property doc comments on `TestConfig`
* Better name for func `usage` is `getResourceUtilization`
Sample time is a better name for what was previously called `iter-scale`.
Copy link
Contributor Author

@palimondo palimondo left a comment

Choose a reason for hiding this comment

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

@eeckstein I'd like to maintain the type checking error in its current form. I also think the separation of parsing into syntax and type-check phases in separate methods is justified. I have added documentation around the need for the Argument.apply() closure and all the logic of parsing arguments.

I believe I've addressed all your other points (renamed usage and iter-scale, cleaned fflush use, restored docs on TestConfig properties). Pushing 3 more commits now.

Please review 🙏

@palimondo
Copy link
Contributor Author

palimondo commented Jul 23, 2018

Funny story: I got stuck on the type change of the sampleTime. After switching the parser from { Int($0) } to { Double($0) } this test started failing:

RUN: not %Benchmark_O --sample-time=NaN \
RUN:         2>&1 | %FileCheck %s --check-prefix NANVALUE
NANVALUE: error: 'NaN' is not a valid 'Double' for '--sample-time'

Turns out NaN is a valid Double value, which lead to Illegal instruction: 4 down the line... So I've used the optional filter pattern, to allow only finite Double values (excluding NaN and the infinities). No big deal.

But when this parser was specified as inline closure, it wasn't working. For the last few hours I was doing println debugging on this — no fun! Turns out there is some very subtle bug with type inference, implicit optional conversions and generics. Once this lands, I'll file a bug report against this code, because I don't have enough energy to reduce it down any further...

So I guess all that test hardening and precise type checking parsers are paying off:

"Through bug reports to the brighter future" is out motto...
— 🤪

* Improved documentation.
* Corrected`fflush` usage in `parse` error handling.
* Removed unused `passThroughArgs`.
@palimondo palimondo force-pushed the fluctuation-of-the-pupil branch from bff0b23 to 362f925 Compare July 23, 2018 16:01
@eeckstein
Copy link
Contributor

Thanks! Looks good now.

@eeckstein
Copy link
Contributor

@swift-ci smoke benchmark

@eeckstein
Copy link
Contributor

@swift-ci smoke test

@eeckstein eeckstein merged commit 46a8390 into swiftlang:master Jul 23, 2018
@swift-ci
Copy link
Contributor

Build comment file:

Optimized (O)

Regression (21)
TEST OLD NEW DELTA SPEEDUP
Sim2DArray 417 669 +60.4% 0.62x
DataAppendDataMediumToLarge 22798 29606 +29.9% 0.77x (?)
StaticArray 9 11 +22.2% 0.82x
RangeIterationSigned 171 200 +17.0% 0.86x
NSDictionaryCastToSwift 7187 8093 +12.6% 0.89x (?)
StringEqualPointerComparison 286 315 +10.1% 0.91x
CharIteration_utf16_unicodeScalars_Backwards 17772 19429 +9.3% 0.91x
PointerArithmetics 31518 34378 +9.1% 0.92x
RC4 149 162 +8.7% 0.92x
CharIteration_japanese_unicodeScalars_Backwards 17193 18663 +8.5% 0.92x
CharIteration_korean_unicodeScalars_Backwards 13932 15121 +8.5% 0.92x
CharIteration_russian_unicodeScalars_Backwards 11974 12993 +8.5% 0.92x
CharIteration_ascii_unicodeScalars_Backwards 14367 15586 +8.5% 0.92x
CharIteration_chinese_unicodeScalars_Backwards 10880 11802 +8.5% 0.92x
MapReduceAnyCollection 371 402 +8.4% 0.92x
CharIteration_punctuated_unicodeScalars_Backwards 3268 3533 +8.1% 0.92x
CharIteration_punctuatedJapanese_unicodeScalars_Backwards 2616 2823 +7.9% 0.93x
SubstringComparable 13 14 +7.7% 0.93x
CharIteration_tweet_unicodeScalars_Backwards 28730 30787 +7.2% 0.93x
RemoveWhereMoveInts 14 15 +7.1% 0.93x
ObjectiveCBridgeStubFromNSStringRef 156 167 +7.1% 0.93x
Improvement (31)
TEST OLD NEW DELTA SPEEDUP
DataAppendDataSmallToLarge 37400 22095 -40.9% 1.69x
ObjectiveCBridgeFromNSArrayAnyObjectForced 5368 4712 -12.2% 1.14x (?)
UTF8Decode_InitFromData_ascii 768 690 -10.2% 1.11x (?)
DataCopyBytes 522 469 -10.2% 1.11x
PopFrontUnsafePointer 9536 8743 -8.3% 1.09x
MapReduceLazyCollectionShort 37 34 -8.1% 1.09x
PopFrontArrayGeneric 1987 1836 -7.6% 1.08x
ObjectiveCBridgeFromNSSetAnyObjectToString 74176 68696 -7.4% 1.08x
RandomDoubleLCG 2263 2102 -7.1% 1.08x
CharIndexing_japanese_unicodeScalars 20724 19266 -7.0% 1.08x
CharIndexing_russian_unicodeScalars 14436 13426 -7.0% 1.08x
CharIndexing_ascii_unicodeScalars 17313 16103 -7.0% 1.08x
CharIndexing_korean_unicodeScalars 16778 15610 -7.0% 1.07x
CharIndexing_chinese_unicodeScalars 13112 12204 -6.9% 1.07x
MapReduce 398 372 -6.5% 1.07x
ObjectiveCBridgeFromNSArrayAnyObjectToStringForced 47679 44572 -6.5% 1.07x
CharIndexing_punctuated_unicodeScalars 3913 3668 -6.3% 1.07x
CharIndexing_punctuatedJapanese_unicodeScalars 3124 2939 -5.9% 1.06x
MapReduceString 51 48 -5.9% 1.06x
CharIndexing_tweet_unicodeScalars 33478 31511 -5.9% 1.06x
CharIteration_punctuatedJapanese_unicodeScalars 3840 3640 -5.2% 1.05x
NopDeinit 31823 30168 -5.2% 1.05x
CharIteration_punctuated_unicodeScalars 4822 4572 -5.2% 1.05x
CharIteration_chinese_unicodeScalars 16192 15381 -5.0% 1.05x
CharIteration_russian_unicodeScalars 17814 16922 -5.0% 1.05x
StringWithCString 129389 122928 -5.0% 1.05x
SumUsingReduceInto 102 97 -4.9% 1.05x
CharIteration_japanese_unicodeScalars 25578 24333 -4.9% 1.05x
CharIteration_ascii_unicodeScalars 21349 20311 -4.9% 1.05x
CharIteration_tweet_unicodeScalars 42152 40121 -4.8% 1.05x
StringUTF16SubstringBuilder 6113 5819 -4.8% 1.05x (?)
No Changes (408)
TEST OLD NEW DELTA SPEEDUP
AngryPhonebook 3589 3603 +0.4% 1.00x (?)
AnyHashableWithAClass 91455 91861 +0.4% 1.00x (?)
Array2D 2847 2863 +0.6% 0.99x (?)
ArrayAppend 1117 1106 -1.0% 1.01x (?)
ArrayAppendArrayOfInt 798 798 +0.0% 1.00x
ArrayAppendAscii 3825 3804 -0.5% 1.01x (?)
ArrayAppendAsciiSubstring 24952 25172 +0.9% 0.99x
ArrayAppendFromGeneric 800 796 -0.5% 1.01x (?)
ArrayAppendGenericStructs 1401 1432 +2.2% 0.98x (?)
ArrayAppendLatin1 41188 41312 +0.3% 1.00x (?)
ArrayAppendLatin1Substring 142730 142561 -0.1% 1.00x (?)
ArrayAppendLazyMap 1344 1339 -0.4% 1.00x
ArrayAppendOptionals 1433 1429 -0.3% 1.00x (?)
ArrayAppendRepeatCol 1340 1339 -0.1% 1.00x (?)
ArrayAppendReserved 852 852 +0.0% 1.00x
ArrayAppendSequence 1120 1123 +0.3% 1.00x (?)
ArrayAppendStrings 6329 6327 -0.0% 1.00x (?)
ArrayAppendToFromGeneric 800 800 +0.0% 1.00x
ArrayAppendToGeneric 800 800 +0.0% 1.00x
ArrayAppendUTF16 41338 41257 -0.2% 1.00x
ArrayAppendUTF16Substring 140006 140293 +0.2% 1.00x (?)
ArrayInClass 86 86 +0.0% 1.00x
ArrayLiteral 0 0 +0.0% 1.00x
ArrayOfGenericPOD2 151 152 +0.7% 0.99x
ArrayOfGenericRef 4403 4404 +0.0% 1.00x (?)
ArrayOfPOD 185 184 -0.5% 1.01x (?)
ArrayOfRef 4412 4391 -0.5% 1.00x (?)
ArrayPlusEqualArrayOfInt 800 796 -0.5% 1.01x (?)
ArrayPlusEqualFiveElementCollection 5490 5501 +0.2% 1.00x (?)
ArrayPlusEqualSingleElementCollection 1116 1114 -0.2% 1.00x (?)
ArrayPlusEqualThreeElements 1654 1659 +0.3% 1.00x (?)
ArraySubscript 1582 1571 -0.7% 1.01x
ArrayValueProp 8 8 +0.0% 1.00x
ArrayValueProp2 8 8 +0.0% 1.00x
ArrayValueProp3 8 8 +0.0% 1.00x
ArrayValueProp4 8 8 +0.0% 1.00x
BinaryFloatingPointPropertiesBinade 25 25 +0.0% 1.00x
BinaryFloatingPointPropertiesNextUp 28 28 +0.0% 1.00x
BinaryFloatingPointPropertiesUlp 37 37 +0.0% 1.00x
BitCount 202 202 +0.0% 1.00x
ByteSwap 103 104 +1.0% 0.99x
COWArrayGuaranteedParameterOverhead 10860 11087 +2.1% 0.98x
COWTree 3653 3636 -0.5% 1.00x (?)
CSVParsing 655894 657546 +0.3% 1.00x (?)
CSVParsingAlt 810256 811477 +0.2% 1.00x (?)
CSVParsingAltIndices 342316 341381 -0.3% 1.00x (?)
CStringLongAscii 4035 4031 -0.1% 1.00x (?)
CStringLongNonAscii 2360 2357 -0.1% 1.00x (?)
CStringShortAscii 3406 3332 -2.2% 1.02x
Calculator 206 209 +1.5% 0.99x
CaptureProp 4094 4099 +0.1% 1.00x (?)
ChainedFilterMap 1247 1249 +0.2% 1.00x
CharIndexing_ascii_unicodeScalars_Backwards 15833 16464 +4.0% 0.96x
CharIndexing_chinese_unicodeScalars_Backwards 12001 12475 +3.9% 0.96x
CharIndexing_japanese_unicodeScalars_Backwards 18943 19715 +4.1% 0.96x
CharIndexing_korean_unicodeScalars_Backwards 15351 15966 +4.0% 0.96x
CharIndexing_punctuatedJapanese_unicodeScalars_Backwards 3012 2983 -1.0% 1.01x
CharIndexing_punctuated_unicodeScalars_Backwards 3608 3731 +3.4% 0.97x
CharIndexing_russian_unicodeScalars_Backwards 13186 13715 +4.0% 0.96x
CharIndexing_tweet_unicodeScalars_Backwards 31246 32285 +3.3% 0.97x
CharIndexing_utf16_unicodeScalars 23008 22688 -1.4% 1.01x
CharIndexing_utf16_unicodeScalars_Backwards 23173 23401 +1.0% 0.99x
CharIteration_korean_unicodeScalars 20645 19729 -4.4% 1.05x
CharIteration_utf16_unicodeScalars 28041 27862 -0.6% 1.01x
CharacterLiteralsLarge 5840 5830 -0.2% 1.00x (?)
CharacterLiteralsSmall 217 217 +0.0% 1.00x
CharacterPropertiesFetch 4601 4614 +0.3% 1.00x (?)
CharacterPropertiesPrecomputed 1019 1014 -0.5% 1.00x (?)
CharacterPropertiesStashed 1805 1790 -0.8% 1.01x
CharacterPropertiesStashedMemo 1563 1552 -0.7% 1.01x
Chars 1023 1022 -0.1% 1.00x
ClassArrayGetter 15 15 +0.0% 1.00x
Combos 496 494 -0.4% 1.00x (?)
DataAccessBytes 1150 1146 -0.3% 1.00x
DataAppendArray 5526 5307 -4.0% 1.04x
DataAppendBytes 4930 4990 +1.2% 0.99x (?)
DataAppendDataLargeToLarge 69990 71372 +2.0% 0.98x (?)
DataAppendDataLargeToMedium 35330 35861 +1.5% 0.99x (?)
DataAppendDataLargeToSmall 34445 34476 +0.1% 1.00x (?)
DataAppendDataMediumToMedium 6790 6482 -4.5% 1.05x
DataAppendDataMediumToSmall 6030 6198 +2.8% 0.97x (?)
DataAppendDataSmallToMedium 6386 6126 -4.1% 1.04x (?)
DataAppendDataSmallToSmall 6023 5831 -3.2% 1.03x (?)
DataAppendSequence 20196 20009 -0.9% 1.01x (?)
DataCount 37 37 +0.0% 1.00x
DataMutateBytes 3912 3952 +1.0% 0.99x (?)
DataReplaceLarge 36616 36556 -0.2% 1.00x (?)
DataReplaceLargeBuffer 58750 58394 -0.6% 1.01x (?)
DataReplaceMedium 7511 7352 -2.1% 1.02x (?)
DataReplaceMediumBuffer 12062 12279 +1.8% 0.98x (?)
DataReplaceSmall 5476 5614 +2.5% 0.98x (?)
DataReplaceSmallBuffer 9582 9707 +1.3% 0.99x (?)
DataReset 2829 2934 +3.7% 0.96x (?)
DataSetCount 606 618 +2.0% 0.98x
DataSubscript 220 220 +0.0% 1.00x
DictOfArraysToArrayOfDicts 806 801 -0.6% 1.01x (?)
Dictionary 515 512 -0.6% 1.01x
Dictionary2 639 636 -0.5% 1.00x (?)
Dictionary2OfObjects 2085 2092 +0.3% 1.00x
Dictionary3 223 223 +0.0% 1.00x
Dictionary3OfObjects 738 737 -0.1% 1.00x (?)
Dictionary4 320 316 -1.2% 1.01x
Dictionary4Legacy 692 693 +0.1% 1.00x (?)
Dictionary4OfObjects 434 434 +0.0% 1.00x
Dictionary4OfObjectsLegacy 913 912 -0.1% 1.00x
DictionaryBridge 1240 1222 -1.5% 1.01x (?)
DictionaryBridgeToObjC_Access 928 975 +5.1% 0.95x (?)
DictionaryBridgeToObjC_Bridge 19 19 +0.0% 1.00x
DictionaryBridgeToObjC_BulkAccess 167 164 -1.8% 1.02x (?)
DictionaryCompactMapValuesOfCastValue 14142 14853 +5.0% 0.95x
DictionaryCompactMapValuesOfNilValue 7260 7187 -1.0% 1.01x
DictionaryCopy 106178 105313 -0.8% 1.01x (?)
DictionaryFilter 105312 105318 +0.0% 1.00x (?)
DictionaryGroup 223 217 -2.7% 1.03x
DictionaryGroupOfObjects 2121 2126 +0.2% 1.00x
DictionaryKeysContainsCocoa 40 42 +5.0% 0.95x (?)
DictionaryKeysContainsNative 32 31 -3.1% 1.03x (?)
DictionaryLiteral 1909 1939 +1.6% 0.98x (?)
DictionaryOfObjects 2401 2378 -1.0% 1.01x
DictionaryRemove 4186 4190 +0.1% 1.00x (?)
DictionaryRemoveOfObjects 26161 25734 -1.6% 1.02x
DictionarySubscriptDefaultMutation 269 269 +0.0% 1.00x
DictionarySubscriptDefaultMutationArray 618 615 -0.5% 1.00x
DictionarySubscriptDefaultMutationArrayOfObjects 4045 4012 -0.8% 1.01x (?)
DictionarySubscriptDefaultMutationOfObjects 1740 1706 -2.0% 1.02x
DictionarySwap 1036 1033 -0.3% 1.00x
DictionarySwapAt 6551 6723 +2.6% 0.97x (?)
DictionarySwapAtOfObjects 51913 52063 +0.3% 1.00x (?)
DictionarySwapOfObjects 8737 8735 -0.0% 1.00x (?)
DoubleWidthDivision 0 0 +0.0% 1.00x
DropFirstAnyCollection 76 76 +0.0% 1.00x
DropFirstAnyCollectionLazy 64804 65456 +1.0% 0.99x (?)
DropFirstAnySeqCRangeIter 93 93 +0.0% 1.00x
DropFirstAnySeqCRangeIterLazy 93 93 +0.0% 1.00x
DropFirstAnySeqCntRange 71 71 +0.0% 1.00x
DropFirstAnySeqCntRangeLazy 71 71 +0.0% 1.00x
DropFirstAnySequence 1843 1843 +0.0% 1.00x
DropFirstAnySequenceLazy 1843 1844 +0.1% 1.00x
DropFirstArray 35 35 +0.0% 1.00x
DropFirstArrayLazy 35 35 +0.0% 1.00x
DropFirstCountableRange 35 35 +0.0% 1.00x
DropFirstCountableRangeLazy 35 35 +0.0% 1.00x
DropFirstSequence 2681 2682 +0.0% 1.00x (?)
DropFirstSequenceLazy 2779 2771 -0.3% 1.00x
DropLastAnyCollection 98 98 +0.0% 1.00x
DropLastAnyCollectionLazy 21610 22364 +3.5% 0.97x
DropLastAnySeqCRangeIter 3373 3322 -1.5% 1.02x
DropLastAnySeqCRangeIterLazy 3314 3333 +0.6% 0.99x (?)
DropLastAnySeqCntRange 20 20 +0.0% 1.00x
DropLastAnySeqCntRangeLazy 20 20 +0.0% 1.00x
DropLastAnySequence 4965 4956 -0.2% 1.00x
DropLastAnySequenceLazy 5070 5055 -0.3% 1.00x
DropLastCountableRange 15 15 +0.0% 1.00x
DropLastCountableRangeLazy 15 15 +0.0% 1.00x
DropLastSequence 650 645 -0.8% 1.01x
DropLastSequenceLazy 651 649 -0.3% 1.00x (?)
DropWhileAnyCollection 100 100 +0.0% 1.00x
DropWhileAnyCollectionLazy 130 130 +0.0% 1.00x
DropWhileAnySeqCRangeIter 76 76 +0.0% 1.00x
DropWhileAnySeqCRangeIterLazy 130 130 +0.0% 1.00x
DropWhileAnySeqCntRange 95 95 +0.0% 1.00x
DropWhileAnySeqCntRangeLazy 130 130 +0.0% 1.00x
DropWhileAnySequence 1860 1860 +0.0% 1.00x
DropWhileAnySequenceLazy 1855 1856 +0.1% 1.00x
DropWhileArrayLazy 88 88 +0.0% 1.00x
DropWhileCountableRange 36 36 +0.0% 1.00x
DropWhileCountableRangeLazy 105 105 +0.0% 1.00x
DropWhileSequence 2202 2220 +0.8% 0.99x
DropWhileSequenceLazy 88 88 +0.0% 1.00x
EqualStringSubstring 48 48 +0.0% 1.00x
EqualSubstringString 48 48 +0.0% 1.00x
EqualSubstringSubstring 48 48 +0.0% 1.00x
EqualSubstringSubstringGenericEquatable 48 48 +0.0% 1.00x
ErrorHandling 1218 1205 -1.1% 1.01x
ExclusivityGlobal 5 5 +0.0% 1.00x
ExclusivityIndependent 2 2 +0.0% 1.00x
FatCompactMap 1247 1248 +0.1% 1.00x (?)
FilterEvenUsingReduce 1347 1344 -0.2% 1.00x (?)
FilterEvenUsingReduceInto 164 158 -3.7% 1.04x (?)
FloatingPointPrinting_Double_description_small 21514 21459 -0.3% 1.00x (?)
FloatingPointPrinting_Double_description_uniform 21026 21039 +0.1% 1.00x (?)
FloatingPointPrinting_Double_interpolated 62898 63485 +0.9% 0.99x
FloatingPointPrinting_Float80_description_small 28404 28373 -0.1% 1.00x (?)
FloatingPointPrinting_Float80_description_uniform 27832 27444 -1.4% 1.01x
FloatingPointPrinting_Float80_interpolated 65708 65496 -0.3% 1.00x (?)
FloatingPointPrinting_Float_description_small 5510 5452 -1.1% 1.01x
FloatingPointPrinting_Float_description_uniform 5363 5568 +3.8% 0.96x
FloatingPointPrinting_Float_interpolated 38263 38296 +0.1% 1.00x (?)
FrequenciesUsingReduce 4934 5161 +4.6% 0.96x (?)
FrequenciesUsingReduceInto 1525 1584 +3.9% 0.96x (?)
Hanoi 2166 2087 -3.6% 1.04x
HashTest 961 953 -0.8% 1.01x (?)
Histogram 657 650 -1.1% 1.01x
Integrate 335 350 +4.5% 0.96x
IterateData 1403 1453 +3.6% 0.97x
Join 171 174 +1.8% 0.98x
LazilyFilteredArrayContains 38656 37870 -2.0% 1.02x
LazilyFilteredArrays 65601 66333 +1.1% 0.99x (?)
LazilyFilteredRange 3869 3883 +0.4% 1.00x
LessSubstringSubstring 48 49 +2.1% 0.98x
LessSubstringSubstringGenericComparable 48 49 +2.1% 0.98x
LinkedList 7574 7543 -0.4% 1.00x (?)
LuhnAlgoEager 456 455 -0.2% 1.00x (?)
LuhnAlgoLazy 455 450 -1.1% 1.01x
MapReduceAnyCollectionShort 2100 2033 -3.2% 1.03x
MapReduceClass 3019 3016 -0.1% 1.00x (?)
MapReduceClassShort 4554 4564 +0.2% 1.00x (?)
MapReduceLazyCollection 13 13 +0.0% 1.00x
MapReduceLazySequence 86 86 +0.0% 1.00x
MapReduceSequence 459 466 +1.5% 0.98x (?)
MapReduceShort 2009 2047 +1.9% 0.98x
MapReduceShortString 21 20 -4.8% 1.05x
Memset 219 214 -2.3% 1.02x (?)
MonteCarloE 10319 10356 +0.4% 1.00x (?)
MonteCarloPi 42958 42782 -0.4% 1.00x (?)
NSError 165 165 +0.0% 1.00x
NSStringConversion 714 723 +1.3% 0.99x
NibbleSort 3461 3448 -0.4% 1.00x
ObjectAllocation 132 133 +0.8% 0.99x
ObjectiveCBridgeFromNSArrayAnyObject 27012 26775 -0.9% 1.01x (?)
ObjectiveCBridgeFromNSArrayAnyObjectToString 48442 46584 -3.8% 1.04x (?)
ObjectiveCBridgeFromNSDictionaryAnyObject 110753 112763 +1.8% 0.98x (?)
ObjectiveCBridgeFromNSSetAnyObject 49783 47934 -3.7% 1.04x (?)
ObjectiveCBridgeFromNSSetAnyObjectForced 5327 5138 -3.5% 1.04x (?)
ObjectiveCBridgeFromNSString 1255 1265 +0.8% 0.99x (?)
ObjectiveCBridgeFromNSStringForced 2727 2729 +0.1% 1.00x (?)
ObjectiveCBridgeStubDataAppend 6447 6218 -3.6% 1.04x
ObjectiveCBridgeStubDateMutation 401 400 -0.2% 1.00x
ObjectiveCBridgeStubFromArrayOfNSString 35118 35355 +0.7% 0.99x (?)
ObjectiveCBridgeStubFromNSDate 6116 6406 +4.7% 0.95x (?)
ObjectiveCBridgeStubFromNSString 1033 1065 +3.1% 0.97x (?)
ObjectiveCBridgeStubNSDataAppend 2555 2566 +0.4% 1.00x (?)
ObjectiveCBridgeStubNSDateMutationRef 13795 13321 -3.4% 1.04x
ObjectiveCBridgeStubToArrayOfNSString 40309 39968 -0.8% 1.01x (?)
ObjectiveCBridgeStubToNSDate 15518 15001 -3.3% 1.03x (?)
ObjectiveCBridgeStubToNSDateRef 3431 3487 +1.6% 0.98x
ObjectiveCBridgeStubToNSString 2337 2331 -0.3% 1.00x (?)
ObjectiveCBridgeStubToNSStringRef 115 121 +5.2% 0.95x
ObjectiveCBridgeStubURLAppendPath 291194 279473 -4.0% 1.04x (?)
ObjectiveCBridgeStubURLAppendPathRef 285104 283915 -0.4% 1.00x (?)
ObjectiveCBridgeToNSArray 14580 14587 +0.0% 1.00x (?)
ObjectiveCBridgeToNSDictionary 27128 26990 -0.5% 1.01x (?)
ObjectiveCBridgeToNSSet 17525 17475 -0.3% 1.00x (?)
ObjectiveCBridgeToNSString 452 449 -0.7% 1.01x
ObserverClosure 2151 2152 +0.0% 1.00x (?)
ObserverForwarderStruct 1218 1216 -0.2% 1.00x (?)
ObserverPartiallyAppliedMethod 3720 3701 -0.5% 1.01x
ObserverUnappliedMethod 2568 2475 -3.6% 1.04x
OpaqueConsumingUsers 4181 4180 -0.0% 1.00x (?)
OpenClose 65 65 +0.0% 1.00x
PartialApplyDynamicType 0 0 +0.0% 1.00x
Phonebook 7159 7070 -1.2% 1.01x
PolymorphicCalls 25 25 +0.0% 1.00x
PopFrontArray 1891 1831 -3.2% 1.03x
PrefixAnyCollection 76 76 +0.0% 1.00x
PrefixAnyCollectionLazy 64682 66570 +2.9% 0.97x
PrefixAnySeqCRangeIter 40 40 +0.0% 1.00x
PrefixAnySeqCRangeIterLazy 40 40 +0.0% 1.00x
PrefixAnySeqCntRange 71 71 +0.0% 1.00x
PrefixAnySeqCntRangeLazy 71 71 +0.0% 1.00x
PrefixAnySequence 1378 1379 +0.1% 1.00x
PrefixAnySequenceLazy 1379 1378 -0.1% 1.00x
PrefixArray 35 35 +0.0% 1.00x
PrefixArrayLazy 35 35 +0.0% 1.00x
PrefixCountableRange 35 35 +0.0% 1.00x
PrefixCountableRangeLazy 35 35 +0.0% 1.00x
PrefixSequence 2223 2223 +0.0% 1.00x
PrefixSequenceLazy 2286 2275 -0.5% 1.00x
PrefixWhileAnyCollection 146 147 +0.7% 0.99x (?)
PrefixWhileAnyCollectionLazy 71 71 +0.0% 1.00x
PrefixWhileAnySeqCRangeIter 387 388 +0.3% 1.00x (?)
PrefixWhileAnySeqCRangeIterLazy 89 89 +0.0% 1.00x
PrefixWhileAnySeqCntRange 142 142 +0.0% 1.00x
PrefixWhileAnySeqCntRangeLazy 71 71 +0.0% 1.00x
PrefixWhileAnySequence 1541 1540 -0.1% 1.00x (?)
PrefixWhileAnySequenceLazy 1392 1392 +0.0% 1.00x
PrefixWhileArray 88 88 +0.0% 1.00x
PrefixWhileArrayLazy 70 70 +0.0% 1.00x
PrefixWhileCountableRange 36 36 +0.0% 1.00x
PrefixWhileCountableRangeLazy 35 35 +0.0% 1.00x
PrefixWhileSequence 363 362 -0.3% 1.00x (?)
PrefixWhileSequenceLazy 52 52 +0.0% 1.00x
Prims 932 922 -1.1% 1.01x
PrimsSplit 931 921 -1.1% 1.01x (?)
QueueConcrete 1150 1152 +0.2% 1.00x (?)
QueueGeneric 1136 1137 +0.1% 1.00x
RGBHistogram 2612 2637 +1.0% 0.99x (?)
RGBHistogramOfObjects 20372 20353 -0.1% 1.00x (?)
Radix2CooleyTukey 12749 12635 -0.9% 1.01x (?)
Radix2CooleyTukeyf 9049 8964 -0.9% 1.01x (?)
RandomDoubleDef 26669 26671 +0.0% 1.00x (?)
RandomIntegersDef 24295 24355 +0.2% 1.00x
RandomIntegersLCG 173 173 +0.0% 1.00x
RandomShuffleDef 810200 811317 +0.1% 1.00x (?)
RandomShuffleLCG 57976 56778 -2.1% 1.02x
RangeAssignment 335 349 +4.2% 0.96x (?)
RangeReplaceableCollectionPlusDefault 1063 1075 +1.1% 0.99x (?)
RecursiveOwnedParameter 115 115 +0.0% 1.00x
RemoveWhereFilterInts 47 47 +0.0% 1.00x
RemoveWhereFilterString 245 244 -0.4% 1.00x
RemoveWhereFilterStrings 437 437 +0.0% 1.00x
RemoveWhereMoveStrings 708 709 +0.1% 1.00x
RemoveWhereQuadraticInts 1292 1291 -0.1% 1.00x (?)
RemoveWhereQuadraticString 380 368 -3.2% 1.03x
RemoveWhereQuadraticStrings 2761 2755 -0.2% 1.00x
RemoveWhereSwapInts 19 19 +0.0% 1.00x
RemoveWhereSwapStrings 858 859 +0.1% 1.00x (?)
ReversedArray 57 58 +1.8% 0.98x
ReversedBidirectional 16782 16684 -0.6% 1.01x
ReversedDictionary 260 260 +0.0% 1.00x
RomanNumbers 81756 84189 +3.0% 0.97x
SequenceAlgosAnySequence 12044 12119 +0.6% 0.99x (?)
SequenceAlgosArray 1578 1579 +0.1% 1.00x (?)
SequenceAlgosContiguousArray 1584 1579 -0.3% 1.00x (?)
SequenceAlgosList 1356 1352 -0.3% 1.00x
SequenceAlgosRange 2577 2577 +0.0% 1.00x
SequenceAlgosUnfoldSequence 1102 1102 +0.0% 1.00x
SetExclusiveOr 5111 5009 -2.0% 1.02x
SetExclusiveOr_OfObjects 11582 11545 -0.3% 1.00x (?)
SetIntersect 694 696 +0.3% 1.00x (?)
SetIntersect_OfObjects 1588 1618 +1.9% 0.98x
SetIsSubsetOf 329 328 -0.3% 1.00x
SetIsSubsetOf_OfObjects 441 441 +0.0% 1.00x
SetUnion 4406 4275 -3.0% 1.03x
SetUnion_OfObjects 9932 9919 -0.1% 1.00x (?)
SevenBoom 848 845 -0.4% 1.00x (?)
SortLargeExistentials 5510 5543 +0.6% 0.99x
SortLettersInPlace 958 958 +0.0% 1.00x
SortSortedStrings 703 689 -2.0% 1.02x
SortStrings 1499 1492 -0.5% 1.00x
SortStringsUnicode 2113 2124 +0.5% 0.99x
StackPromo 25299 24658 -2.5% 1.03x
StrComplexWalk 1775 1780 +0.3% 1.00x
StrToInt 3181 3265 +2.6% 0.97x
StringAdder 548 548 +0.0% 1.00x
StringBuilder 497 497 +0.0% 1.00x
StringBuilderLong 1261 1255 -0.5% 1.00x (?)
StringBuilderSmallReservingCapacity 507 507 +0.0% 1.00x
StringBuilderWithLongSubstring 1461 1502 +2.8% 0.97x (?)
StringComparison_abnormal 779 776 -0.4% 1.00x (?)
StringComparison_ascii 1020 1005 -1.5% 1.01x
StringComparison_emoji 837 843 +0.7% 0.99x
StringComparison_fastPrenormal 838 844 +0.7% 0.99x
StringComparison_latin1 656 684 +4.3% 0.96x
StringComparison_longSharedPrefix 946 946 +0.0% 1.00x
StringComparison_nonBMPSlowestPrenormal 1638 1642 +0.2% 1.00x (?)
StringComparison_slowerPrenormal 1784 1804 +1.1% 0.99x
StringComparison_zalgo 111586 112144 +0.5% 1.00x
StringEdits 171414 165612 -3.4% 1.04x
StringEnumRawValueInitialization 855 856 +0.1% 1.00x (?)
StringFromLongWholeSubstring 21 21 +0.0% 1.00x
StringFromLongWholeSubstringGeneric 21 21 +0.0% 1.00x
StringHasPrefixAscii 2204 2205 +0.0% 1.00x (?)
StringHasPrefixUnicode 100327 99591 -0.7% 1.01x (?)
StringHasSuffixAscii 2232 2233 +0.0% 1.00x (?)
StringHasSuffixUnicode 100171 100790 +0.6% 0.99x (?)
StringHashing_abnormal 1438 1438 +0.0% 1.00x
StringHashing_ascii 33 34 +3.0% 0.97x
StringHashing_emoji 1915 1912 -0.2% 1.00x (?)
StringHashing_fastPrenormal 8446 8445 -0.0% 1.00x (?)
StringHashing_latin1 2573 2583 +0.4% 1.00x (?)
StringHashing_longSharedPrefix 7781 7799 +0.2% 1.00x (?)
StringHashing_nonBMPSlowestPrenormal 2071 2080 +0.4% 1.00x (?)
StringHashing_slowerPrenormal 2737 2746 +0.3% 1.00x (?)
StringHashing_zalgo 3509 3543 +1.0% 0.99x (?)
StringInterpolation 9095 9175 +0.9% 0.99x (?)
StringInterpolationManySmallSegments 18285 18550 +1.4% 0.99x (?)
StringInterpolationSmall 4172 4160 -0.3% 1.00x (?)
StringMatch 11937 11990 +0.4% 1.00x
StringRemoveDupes 491 486 -1.0% 1.01x (?)
StringUTF16Builder 2723 2706 -0.6% 1.01x (?)
StringWalk 1551 1544 -0.5% 1.00x
StringWordBuilder 2282 2283 +0.0% 1.00x (?)
StringWordBuilderReservingCapacity 1882 1884 +0.1% 1.00x (?)
SubstringEqualString 605 605 +0.0% 1.00x
SubstringEquatable 1448 1436 -0.8% 1.01x
SubstringFromLongString 10 10 +0.0% 1.00x
SubstringFromLongStringGeneric 74 74 +0.0% 1.00x
SuffixAnyCollection 52 51 -1.9% 1.02x
SuffixAnyCollectionLazy 21853 21943 +0.4% 1.00x (?)
SuffixAnySeqCRangeIter 3617 3636 +0.5% 0.99x (?)
SuffixAnySeqCRangeIterLazy 3615 3623 +0.2% 1.00x (?)
SuffixAnySeqCntRange 24 24 +0.0% 1.00x
SuffixAnySeqCntRangeLazy 24 24 +0.0% 1.00x
SuffixAnySequence 4960 4912 -1.0% 1.01x
SuffixAnySequenceLazy 5093 5009 -1.6% 1.02x
SuffixCountableRange 13 13 +0.0% 1.00x
SuffixCountableRangeLazy 18 18 +0.0% 1.00x
SuffixSequence 3690 3666 -0.7% 1.01x
SuffixSequenceLazy 3685 3675 -0.3% 1.00x (?)
SumUsingReduce 97 99 +2.1% 0.98x
SuperChars 20167 20095 -0.4% 1.00x (?)
TwoSum 1477 1511 +2.3% 0.98x (?)
TypeFlood 0 0 +0.0% 1.00x
UTF8Decode 298 313 +5.0% 0.95x
UTF8Decode_InitDecoding 1348 1350 +0.1% 1.00x (?)
UTF8Decode_InitDecoding_ascii 670 656 -2.1% 1.02x (?)
UTF8Decode_InitFromBytes 1192 1169 -1.9% 1.02x (?)
UTF8Decode_InitFromBytes_ascii 480 493 +2.7% 0.97x (?)
UTF8Decode_InitFromData 1255 1226 -2.3% 1.02x
Walsh 449 446 -0.7% 1.01x
WordCountHistogramASCII 6791 6777 -0.2% 1.00x (?)
WordCountHistogramUTF16 10195 10269 +0.7% 0.99x
WordCountUniqueASCII 2054 2047 -0.3% 1.00x
WordCountUniqueUTF16 4474 4508 +0.8% 0.99x (?)
WordSplitASCII 10113 9829 -2.8% 1.03x (?)
WordSplitUTF16 11670 11190 -4.1% 1.04x
XorLoop 404 399 -1.2% 1.01x
Hardware Overview
  Model Name: Mac Pro
  Model Identifier: MacPro6,1
  Processor Name: 12-Core Intel Xeon E5
  Processor Speed: 2.7 GHz
  Number of Processors: 1
  Total Number of Cores: 12
  L2 Cache (per Core): 256 KB
  L3 Cache: 30 MB
  Memory: 64 GB

@palimondo
Copy link
Contributor Author

Created SR-8377 to track the intermittently appearing bug mentioned above.

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

Successfully merging this pull request may close these issues.

3 participants