├── .bazelrc
├── .gitignore
├── BUILD.bazel
├── BUILD.double_conversion
├── BUILD.folly
├── BUILD.skarupke
├── BUILD.sparsehash
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── WORKSPACE
├── build_info.cc
├── build_info.h
├── dynamic_rehash_effect.cc
├── hashtable_benchmarks.cc
├── hashtable_benchmarks.ipynb
├── hashtable_memory.ipynb
├── results
├── bytell_max_lf.txt
├── ngbronson-2018-10-02.json
├── sonmi-2018-07-19.json
└── sonmi-2021-05-02.json
├── sparseconfig.h
└── tools
└── workspace_status.sh
/.bazelrc:
--------------------------------------------------------------------------------
1 | build --cxxopt=--std=c++17
2 |
3 | build --copt=-march=corei7 --copt=-mtune=core-avx2
4 |
5 | build --workspace_status_command=tools/workspace_status.sh
6 | build -c opt
7 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | bazel-*
2 |
--------------------------------------------------------------------------------
/BUILD.bazel:
--------------------------------------------------------------------------------
1 | # Copyright 2018 Google LLC
2 | #
3 | # Licensed under the Apache License, Version 2.0 (the "License");
4 | # you may not use this file except in compliance with the License.
5 | # You may obtain a copy of the License at
6 | #
7 | # http://www.apache.org/licenses/LICENSE-2.0
8 | #
9 | # Unless required by applicable law or agreed to in writing, software
10 | # distributed under the License is distributed on an "AS IS" BASIS,
11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | # See the License for the specific language governing permissions and
13 | # limitations under the License.
14 |
15 | package(default_visibility = ["//visibility:public"])
16 |
17 | cc_library(
18 | name = "sparsehash_config",
19 | hdrs = ["sparseconfig.h"],
20 | include_prefix = "sparsehash/internal",
21 | visibility = ["//visibility:public"],
22 | )
23 |
24 | cc_library(
25 | name = "build_info",
26 | hdrs = ["build_info.h"],
27 | linkstamp = "build_info.cc",
28 | )
29 |
30 | cc_binary(
31 | name = "hashtable_benchmarks",
32 | srcs = ["hashtable_benchmarks.cc"],
33 | copts = ["-Wno-deprecated"],
34 | deps = [
35 | ":build_info",
36 | "@absl//absl/strings",
37 | "@absl//absl/strings:str_format",
38 | "@absl//absl/container:flat_hash_set",
39 | "@absl//absl/container:node_hash_set",
40 | "@boost//:preprocessor",
41 | "@facebook_folly//:folly",
42 | "@gbench//:benchmark_main",
43 | "@google_sparsehash//:sparsehash",
44 | "@skarupke//:skarupke",
45 | ],
46 | stamp = 1,
47 | )
48 |
49 | cc_binary(
50 | name = "dynamic_rehash_effect",
51 | srcs = ["dynamic_rehash_effect.cc"],
52 | deps = [
53 | "@skarupke//:skarupke",
54 | ],
55 | )
56 |
--------------------------------------------------------------------------------
/BUILD.double_conversion:
--------------------------------------------------------------------------------
1 | # Bazel(http://bazel.io) BUILD file
2 |
3 | licenses(["notice"])
4 |
5 | exports_files(["LICENSE"])
6 |
7 | cc_library(
8 | name = "double-conversion",
9 | srcs = glob(["double-conversion/*.cc"]),
10 | hdrs = glob(["double-conversion/*.h"]),
11 | includes = [
12 | ".",
13 | ],
14 | linkopts = [
15 | "-lm",
16 | ],
17 | visibility = ["//visibility:public"],
18 | )
19 |
20 | cc_test(
21 | name = "cctest",
22 | srcs = glob(["test/cctest/*.cc", "test/cctest/*.h"]),
23 | args = [
24 | "test-bignum",
25 | "test-bignum-dtoa",
26 | "test-conversions",
27 | "test-dtoa",
28 | "test-fast-dtoa",
29 | "test-fixed-dtoa",
30 | "test-ieee",
31 | "test-strtod",
32 | ],
33 | visibility = ["//visibility:public"],
34 | deps = [":double-conversion"],
35 | )
36 |
--------------------------------------------------------------------------------
/BUILD.folly:
--------------------------------------------------------------------------------
1 | cc_library(
2 | name = "folly",
3 | includes = [""],
4 | srcs = [
5 | "folly/FileUtil.cpp",
6 | "folly/ScopeGuard.cpp",
7 | "folly/container/detail/F14Table.cpp",
8 | "folly/lang/Assume.h",
9 | "folly/lang/ToAscii.cpp",
10 | "folly/lang/SafeAssert.cpp",
11 | "folly/net/NetOps.cpp",
12 | ],
13 | hdrs = glob([
14 | "folly/**/*.h",
15 | ]),
16 | defines = [
17 | "FOLLY_NO_CONFIG",
18 | "FOLLY_HAVE_MEMRCHR",
19 | "FOLLY_HAVE_SENDMMSG",
20 | "FOLLY_HAVE_RECVMMSG",
21 | ],
22 | visibility = ["//visibility:public"],
23 | deps = [
24 | "@com_github_google_glog//:glog",
25 | "@com_github_google_double_conversion//:double-conversion",
26 | ],
27 | )
28 |
--------------------------------------------------------------------------------
/BUILD.skarupke:
--------------------------------------------------------------------------------
1 | cc_library(
2 | name = "skarupke",
3 | includes = [""],
4 | hdrs = [
5 | "bytell_hash_map.hpp",
6 | "flat_hash_map.hpp",
7 | "unordered_map.hpp",
8 | ],
9 | visibility = ["//visibility:public"],
10 | )
11 |
--------------------------------------------------------------------------------
/BUILD.sparsehash:
--------------------------------------------------------------------------------
1 | cc_library(
2 | name = "sparsehash",
3 | includes = ["src"],
4 | hdrs = glob([
5 | "src/google/**/*",
6 | "src/sparsehash/**/*",
7 | ]),
8 | visibility = ["//visibility:public"],
9 | deps = [
10 | "@hashtable_benchmarks//:sparsehash_config",
11 | ],
12 | )
13 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # How to Contribute
2 |
3 | We'd love to accept your patches and contributions to this project. There are
4 | just a few small guidelines you need to follow.
5 |
6 | ## Contributor License Agreement
7 |
8 | Contributions to this project must be accompanied by a Contributor License
9 | Agreement. You (or your employer) retain the copyright to your contribution;
10 | this simply gives us permission to use and redistribute your contributions as
11 | part of the project. Head over to to see
12 | your current agreements on file or to sign a new one.
13 |
14 | You generally only need to submit a CLA once, so if you've already submitted one
15 | (even if it was for a different project), you probably don't need to do it
16 | again.
17 |
18 | ## Code reviews
19 |
20 | All submissions, including submissions by project members, require review. We
21 | use GitHub pull requests for this purpose. Consult
22 | [GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
23 | information on using pull requests.
24 |
25 | ## Community Guidelines
26 |
27 | This project follows [Google's Open Source Community
28 | Guidelines](https://opensource.google.com/conduct/).
29 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 |
2 | Apache License
3 | Version 2.0, January 2004
4 | http://www.apache.org/licenses/
5 |
6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7 |
8 | 1. Definitions.
9 |
10 | "License" shall mean the terms and conditions for use, reproduction,
11 | and distribution as defined by Sections 1 through 9 of this document.
12 |
13 | "Licensor" shall mean the copyright owner or entity authorized by
14 | the copyright owner that is granting the License.
15 |
16 | "Legal Entity" shall mean the union of the acting entity and all
17 | other entities that control, are controlled by, or are under common
18 | control with that entity. For the purposes of this definition,
19 | "control" means (i) the power, direct or indirect, to cause the
20 | direction or management of such entity, whether by contract or
21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
22 | outstanding shares, or (iii) beneficial ownership of such entity.
23 |
24 | "You" (or "Your") shall mean an individual or Legal Entity
25 | exercising permissions granted by this License.
26 |
27 | "Source" form shall mean the preferred form for making modifications,
28 | including but not limited to software source code, documentation
29 | source, and configuration files.
30 |
31 | "Object" form shall mean any form resulting from mechanical
32 | transformation or translation of a Source form, including but
33 | not limited to compiled object code, generated documentation,
34 | and conversions to other media types.
35 |
36 | "Work" shall mean the work of authorship, whether in Source or
37 | Object form, made available under the License, as indicated by a
38 | copyright notice that is included in or attached to the work
39 | (an example is provided in the Appendix below).
40 |
41 | "Derivative Works" shall mean any work, whether in Source or Object
42 | form, that is based on (or derived from) the Work and for which the
43 | editorial revisions, annotations, elaborations, or other modifications
44 | represent, as a whole, an original work of authorship. For the purposes
45 | of this License, Derivative Works shall not include works that remain
46 | separable from, or merely link (or bind by name) to the interfaces of,
47 | the Work and Derivative Works thereof.
48 |
49 | "Contribution" shall mean any work of authorship, including
50 | the original version of the Work and any modifications or additions
51 | to that Work or Derivative Works thereof, that is intentionally
52 | submitted to Licensor for inclusion in the Work by the copyright owner
53 | or by an individual or Legal Entity authorized to submit on behalf of
54 | the copyright owner. For the purposes of this definition, "submitted"
55 | means any form of electronic, verbal, or written communication sent
56 | to the Licensor or its representatives, including but not limited to
57 | communication on electronic mailing lists, source code control systems,
58 | and issue tracking systems that are managed by, or on behalf of, the
59 | Licensor for the purpose of discussing and improving the Work, but
60 | excluding communication that is conspicuously marked or otherwise
61 | designated in writing by the copyright owner as "Not a Contribution."
62 |
63 | "Contributor" shall mean Licensor and any individual or Legal Entity
64 | on behalf of whom a Contribution has been received by Licensor and
65 | subsequently incorporated within the Work.
66 |
67 | 2. Grant of Copyright License. Subject to the terms and conditions of
68 | this License, each Contributor hereby grants to You a perpetual,
69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70 | copyright license to reproduce, prepare Derivative Works of,
71 | publicly display, publicly perform, sublicense, and distribute the
72 | Work and such Derivative Works in Source or Object form.
73 |
74 | 3. Grant of Patent License. Subject to the terms and conditions of
75 | this License, each Contributor hereby grants to You a perpetual,
76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77 | (except as stated in this section) patent license to make, have made,
78 | use, offer to sell, sell, import, and otherwise transfer the Work,
79 | where such license applies only to those patent claims licensable
80 | by such Contributor that are necessarily infringed by their
81 | Contribution(s) alone or by combination of their Contribution(s)
82 | with the Work to which such Contribution(s) was submitted. If You
83 | institute patent litigation against any entity (including a
84 | cross-claim or counterclaim in a lawsuit) alleging that the Work
85 | or a Contribution incorporated within the Work constitutes direct
86 | or contributory patent infringement, then any patent licenses
87 | granted to You under this License for that Work shall terminate
88 | as of the date such litigation is filed.
89 |
90 | 4. Redistribution. You may reproduce and distribute copies of the
91 | Work or Derivative Works thereof in any medium, with or without
92 | modifications, and in Source or Object form, provided that You
93 | meet the following conditions:
94 |
95 | (a) You must give any other recipients of the Work or
96 | Derivative Works a copy of this License; and
97 |
98 | (b) You must cause any modified files to carry prominent notices
99 | stating that You changed the files; and
100 |
101 | (c) You must retain, in the Source form of any Derivative Works
102 | that You distribute, all copyright, patent, trademark, and
103 | attribution notices from the Source form of the Work,
104 | excluding those notices that do not pertain to any part of
105 | the Derivative Works; and
106 |
107 | (d) If the Work includes a "NOTICE" text file as part of its
108 | distribution, then any Derivative Works that You distribute must
109 | include a readable copy of the attribution notices contained
110 | within such NOTICE file, excluding those notices that do not
111 | pertain to any part of the Derivative Works, in at least one
112 | of the following places: within a NOTICE text file distributed
113 | as part of the Derivative Works; within the Source form or
114 | documentation, if provided along with the Derivative Works; or,
115 | within a display generated by the Derivative Works, if and
116 | wherever such third-party notices normally appear. The contents
117 | of the NOTICE file are for informational purposes only and
118 | do not modify the License. You may add Your own attribution
119 | notices within Derivative Works that You distribute, alongside
120 | or as an addendum to the NOTICE text from the Work, provided
121 | that such additional attribution notices cannot be construed
122 | as modifying the License.
123 |
124 | You may add Your own copyright statement to Your modifications and
125 | may provide additional or different license terms and conditions
126 | for use, reproduction, or distribution of Your modifications, or
127 | for any such Derivative Works as a whole, provided Your use,
128 | reproduction, and distribution of the Work otherwise complies with
129 | the conditions stated in this License.
130 |
131 | 5. Submission of Contributions. Unless You explicitly state otherwise,
132 | any Contribution intentionally submitted for inclusion in the Work
133 | by You to the Licensor shall be under the terms and conditions of
134 | this License, without any additional terms or conditions.
135 | Notwithstanding the above, nothing herein shall supersede or modify
136 | the terms of any separate license agreement you may have executed
137 | with Licensor regarding such Contributions.
138 |
139 | 6. Trademarks. This License does not grant permission to use the trade
140 | names, trademarks, service marks, or product names of the Licensor,
141 | except as required for reasonable and customary use in describing the
142 | origin of the Work and reproducing the content of the NOTICE file.
143 |
144 | 7. Disclaimer of Warranty. Unless required by applicable law or
145 | agreed to in writing, Licensor provides the Work (and each
146 | Contributor provides its Contributions) on an "AS IS" BASIS,
147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148 | implied, including, without limitation, any warranties or conditions
149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150 | PARTICULAR PURPOSE. You are solely responsible for determining the
151 | appropriateness of using or redistributing the Work and assume any
152 | risks associated with Your exercise of permissions under this License.
153 |
154 | 8. Limitation of Liability. In no event and under no legal theory,
155 | whether in tort (including negligence), contract, or otherwise,
156 | unless required by applicable law (such as deliberate and grossly
157 | negligent acts) or agreed to in writing, shall any Contributor be
158 | liable to You for damages, including any direct, indirect, special,
159 | incidental, or consequential damages of any character arising as a
160 | result of this License or out of the use or inability to use the
161 | Work (including but not limited to damages for loss of goodwill,
162 | work stoppage, computer failure or malfunction, or any and all
163 | other commercial damages or losses), even if such Contributor
164 | has been advised of the possibility of such damages.
165 |
166 | 9. Accepting Warranty or Additional Liability. While redistributing
167 | the Work or Derivative Works thereof, You may choose to offer,
168 | and charge a fee for, acceptance of support, warranty, indemnity,
169 | or other liability obligations and/or rights consistent with this
170 | License. However, in accepting such obligations, You may act only
171 | on Your own behalf and on Your sole responsibility, not on behalf
172 | of any other Contributor, and only if You agree to indemnify,
173 | defend, and hold each Contributor harmless for any liability
174 | incurred by, or claims asserted against, such Contributor by reason
175 | of your accepting any such warranty or additional liability.
176 |
177 | END OF TERMS AND CONDITIONS
178 |
179 | APPENDIX: How to apply the Apache License to your work.
180 |
181 | To apply the Apache License to your work, attach the following
182 | boilerplate notice, with the fields enclosed by brackets "[]"
183 | replaced with your own identifying information. (Don't include
184 | the brackets!) The text should be enclosed in the appropriate
185 | comment syntax for the file format. We also recommend that a
186 | file or class name and description of purpose be included on the
187 | same "printed page" as the copyright notice for easier
188 | identification within third-party archives.
189 |
190 | Copyright [yyyy] [name of copyright owner]
191 |
192 | Licensed under the Apache License, Version 2.0 (the "License");
193 | you may not use this file except in compliance with the License.
194 | You may obtain a copy of the License at
195 |
196 | http://www.apache.org/licenses/LICENSE-2.0
197 |
198 | Unless required by applicable law or agreed to in writing, software
199 | distributed under the License is distributed on an "AS IS" BASIS,
200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
201 | See the License for the specific language governing permissions and
202 | limitations under the License.
203 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Hashtable Benchmarks
2 |
3 | Benchmarks for comparing hashtable implementations.
4 |
5 | 1. Build:
6 |
7 | ```shell
8 | bazel build :hashtable_benchmarks
9 | ```
10 |
11 | Note that `-c opt` is the default.
12 |
13 | 2. Run:
14 |
15 | ```shell
16 | ./bazel-bin/hashtable_benchmarks --benchmark_format=json > benchmark-results.json
17 | ```
18 |
19 | 3. Analyze:
20 |
21 | You can use http://colab.research.google.com along with `hashtable_benchmarks.ipynb` to parse the generated `benchmark-results.json`.
22 |
23 | 4. Contribute:
24 |
25 | We would like this to turn into *the* place for comparing hashtables in C++. We
26 | will accept external dependencies on other hashtable libraries (assuming they
27 | have a compatible licence). We encourage folks to improve and modify both the
28 | analysis and the benchmarks themselves as we learn things. Please join the
29 | dicussion at
30 |
31 | https://groups.google.com/forum/#!forum/hashtable-benchmarks
32 |
33 | # Disclaimer
34 |
35 | This is not an officially supported Google product.
36 |
--------------------------------------------------------------------------------
/WORKSPACE:
--------------------------------------------------------------------------------
1 | # Copyright 2018 Google LLC
2 | #
3 | # Licensed under the Apache License, Version 2.0 (the "License");
4 | # you may not use this file except in compliance with the License.
5 | # You may obtain a copy of the License at
6 | #
7 | # http://www.apache.org/licenses/LICENSE-2.0
8 | #
9 | # Unless required by applicable law or agreed to in writing, software
10 | # distributed under the License is distributed on an "AS IS" BASIS,
11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | # See the License for the specific language governing permissions and
13 | # limitations under the License.
14 |
15 | workspace(name = "hashtable_benchmarks")
16 |
17 | load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
18 |
19 | # abseil
20 | http_archive(
21 | name = "absl",
22 | strip_prefix = "abseil-cpp-master",
23 | urls = ["https://github.com/abseil/abseil-cpp/archive/master.zip"],
24 | )
25 |
26 | # Google benchmark.
27 | http_archive(
28 | name = "gbench",
29 | strip_prefix = "benchmark-main",
30 | urls = ["https://github.com/google/benchmark/archive/main.zip"],
31 | )
32 |
33 | # Google dense_hash_set
34 | http_archive(
35 | name = "google_sparsehash",
36 | build_file = "//:BUILD.sparsehash",
37 | strip_prefix = "sparsehash-master",
38 | urls = ["https://github.com/google/sparsehash/archive/master.zip"],
39 | )
40 |
41 | http_archive(
42 | name = "com_github_gflags_gflags",
43 | strip_prefix = "gflags-master",
44 | urls = ["https://github.com/gflags/gflags/archive/master.zip"],
45 | )
46 | http_archive(
47 | name = "com_github_google_glog",
48 | strip_prefix = "glog-master",
49 | urls = ["https://github.com/google/glog/archive/master.zip"],
50 | )
51 | http_archive(
52 | name = "com_github_google_double_conversion",
53 | build_file = "//:BUILD.double_conversion",
54 | strip_prefix = "double-conversion-master",
55 | urls = ["https://github.com/google/double-conversion/archive/master.zip"],
56 | )
57 |
58 | # Facebook folly
59 | http_archive(
60 | name = "facebook_folly",
61 | build_file = "//:BUILD.folly",
62 | strip_prefix = "folly-main",
63 | urls = ["https://github.com/facebook/folly/archive/main.zip"],
64 | )
65 |
66 | # ska::flat_hash_set and ska::bytell_hash_set
67 | http_archive(
68 | name = "skarupke",
69 | build_file = "//:BUILD.skarupke",
70 | strip_prefix = "flat_hash_map-master",
71 | urls = ["https://github.com/skarupke/flat_hash_map/archive/master.zip"],
72 | )
73 |
74 | http_archive(
75 | name = "com_github_nelhage_rules_boost",
76 | strip_prefix = "rules_boost-master",
77 | urls = ["https://github.com/nelhage/rules_boost/archive/master.zip"],
78 | )
79 |
80 | load("@com_github_nelhage_rules_boost//:boost/boost.bzl", "boost_deps")
81 |
82 | boost_deps()
83 |
--------------------------------------------------------------------------------
/build_info.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2018 Google LLC
2 | //
3 | // Licensed under the Apache License, Version 2.0 (the "License");
4 | // you may not use this file except in compliance with the License.
5 | // You may obtain a copy of the License at
6 | //
7 | // http://www.apache.org/licenses/LICENSE-2.0
8 | //
9 | // Unless required by applicable law or agreed to in writing, software
10 | // distributed under the License is distributed on an "AS IS" BASIS,
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | // See the License for the specific language governing permissions and
13 | // limitations under the License.
14 |
15 | char const* getBuildScmRevision() {
16 | return BUILD_SCM_REVISION;
17 | }
18 |
--------------------------------------------------------------------------------
/build_info.h:
--------------------------------------------------------------------------------
1 | // Copyright 2018 Google LLC
2 | //
3 | // Licensed under the Apache License, Version 2.0 (the "License");
4 | // you may not use this file except in compliance with the License.
5 | // You may obtain a copy of the License at
6 | //
7 | // http://www.apache.org/licenses/LICENSE-2.0
8 | //
9 | // Unless required by applicable law or agreed to in writing, software
10 | // distributed under the License is distributed on an "AS IS" BASIS,
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | // See the License for the specific language governing permissions and
13 | // limitations under the License.
14 |
15 | char const* getBuildScmRevision();
16 |
--------------------------------------------------------------------------------
/dynamic_rehash_effect.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2018 Google LLC
2 | //
3 | // Licensed under the Apache License, Version 2.0 (the "License");
4 | // you may not use this file except in compliance with the License.
5 | // You may obtain a copy of the License at
6 | //
7 | // http://www.apache.org/licenses/LICENSE-2.0
8 | //
9 | // Unless required by applicable law or agreed to in writing, software
10 | // distributed under the License is distributed on an "AS IS" BASIS,
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | // See the License for the specific language governing permissions and
13 | // limitations under the License.
14 |
15 | #include
16 | #include
17 | #include
18 | #include
19 |
20 | #include "bytell_hash_map.hpp"
21 |
22 | // ska::bytell_hash_set has a collision-based rehash decision.
23 | // This program explores the load factor at which that rehash is triggered.
24 |
25 | int main(int argc, char **argv) {
26 | size_t maxSize = 1U << 28;
27 | size_t numReps = 100;
28 |
29 | std::random_device rd;
30 | auto rng = std::mt19937{rd()};
31 | auto dis = std::uniform_int_distribution{0, (1U << 31) - 1};
32 |
33 | for (size_t rep = 0; rep < numReps; ++rep) {
34 | ska::bytell_hash_set set;
35 | set.max_load_factor(0.999);
36 |
37 | while (set.size() < maxSize) {
38 | auto key = dis(rng);
39 | size_t prevSize = set.size();
40 | size_t prevCap = set.bucket_count();
41 | set.insert(key);
42 | if (set.bucket_count() > prevCap && prevCap > 0) {
43 | auto lf = static_cast(prevSize) / prevCap;
44 | std::cout << prevCap << " " << prevSize << " " << lf << "\n";
45 | }
46 | }
47 | std::cout << "\n";
48 | }
49 | return 0;
50 | }
51 |
--------------------------------------------------------------------------------
/hashtable_benchmarks.cc:
--------------------------------------------------------------------------------
1 | // Copyright 2018 Google LLC
2 | //
3 | // Licensed under the Apache License, Version 2.0 (the "License");
4 | // you may not use this file except in compliance with the License.
5 | // You may obtain a copy of the License at
6 | //
7 | // http://www.apache.org/licenses/LICENSE-2.0
8 | //
9 | // Unless required by applicable law or agreed to in writing, software
10 | // distributed under the License is distributed on an "AS IS" BASIS,
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | // See the License for the specific language governing permissions and
13 | // limitations under the License.
14 |
15 | #include
16 | #include
17 | #include
18 | #include
19 | #include
20 | #include
21 | #include
22 | #include
23 | #include
24 | #include
25 |
26 | #include "build_info.h"
27 | #include "benchmark/benchmark.h"
28 | #include "absl/strings/str_format.h"
29 | #include "absl/base/port.h"
30 | #include "absl/container/flat_hash_set.h"
31 | #include "absl/container/node_hash_set.h"
32 | #include "boost/preprocessor.hpp"
33 | #include "google/dense_hash_set"
34 | #include "folly/container/F14Set.h"
35 |
36 | #if defined(__GNUC__) || defined(__clang__)
37 | #define HT_BENCH_FLATTEN __attribute__((__flatten__))
38 | #define HT_BENCH_NOINLINE __attribute__((__noinline__))
39 | #else
40 | #define HT_BENCH_FLATTEN
41 | #define HT_BENCH_NOINLINE
42 | #endif
43 |
44 | // Benchmarks for comparing hash tables.
45 | //
46 | // TL;DR:
47 | //
48 | // $ bazel build -c opt :hashtable_benchmarks
49 | // $ ./bazel-bin/hashtable_benchmarks --benchmark_format=json
50 | //
51 | // This benchmark runs hashtables through a large suite of configurations.
52 |
53 | namespace {
54 |
55 | #if !defined(__clang__) && __GNUC__ == 5
56 | // gcc 5.5 miscompiles LookupHit_Hot's DoNotOptimize(set), resulting in
57 | // an immediate segfault in opt mode. This fallback implementation only
58 | // handles integral non-const lvalue types, but is sufficient for the
59 | // hash table benchmarks. gcc 7 is okay.
60 | template
61 | std::enable_if_t::value || std::is_pointer::value>
62 | DoNotOptimize(T &val) {
63 | asm volatile("" : "+r"(val) : : "memory");
64 | }
65 |
66 | template
67 | void DoNotOptimize(T const& val) {
68 | asm volatile("" : : "r,m"(val) : "memory");
69 | }
70 | #else
71 | using ::benchmark::DoNotOptimize;
72 | #endif
73 |
74 | std::mt19937 MakeRNG() {
75 | std::random_device rd;
76 | return std::mt19937(rd());
77 | }
78 |
79 | std::mt19937& GetRNG() {
80 | static auto* rng = new auto(MakeRNG());
81 | return *rng;
82 | }
83 |
84 | template
85 | class Ballast {
86 | char ballast_[kSize];
87 | };
88 |
89 | template <>
90 | class Ballast<0> {};
91 |
92 | // sizeof(Value) == kSize
93 | // alignof(Value) == kSize < 8 ? 4 : 8
94 | template
95 | class alignas(kSize < 8 ? 4 : 8) Value : private Ballast {
96 | public:
97 | static_assert(kSize >= 4, "");
98 | Value(uint32_t value = 0) : value_(value) {} // NOLINT
99 | operator uint32_t() const { return value_; } // NOLINT
100 |
101 | private:
102 | uint32_t value_;
103 | };
104 |
105 | // Use a ~zero cost hash function. The purpose of this benchmark is to
106 | // focus on the implementations of the containers, not the quality or
107 | // speed of their hash functions. Since we're bypassing the default hasher
108 | // for SwissTable and disabling the bit mixer that is normally applied to
109 | // untrusted hash functors by F14, we need to ensure that bits 30 and 31
110 | // of the key (which are always 0 and 1 respectively for keys inserted
111 | // to the hash table) don't end up causing collisions or affecting the
112 | // vector filtering step. SwissTable uses bits 0..6 for filtering; F14
113 | // uses bits 56..62. This hasher puts entropy in all bits of the hash
114 | // result except 30..33 (inclusive), which is enough to avoid collisions
115 | // for capacity 2^23 for SwissTable and 2^30 for F14.
116 | struct Hash {
117 | using folly_is_avalanching = std::true_type;
118 |
119 | size_t operator()(uint32_t x) const noexcept {
120 | return (size_t{x} << 34) | x;
121 | }
122 | };
123 |
124 | struct Eq {
125 | bool operator()(uint32_t x, uint32_t y) const {
126 | ++num_calls;
127 | return x == y;
128 | }
129 | static size_t num_calls;
130 | };
131 |
132 | size_t Eq::num_calls;
133 |
134 | // The highest order bit is set <=> it's a special value.
135 | constexpr uint32_t kEmpty = 1U << 31;
136 | constexpr uint32_t kDeleted = 3U << 30;
137 |
138 | uint32_t RandomNonSpecial() {
139 | std::uniform_int_distribution dis(0, (1U << 31) - 1);
140 | return dis(GetRNG());
141 | }
142 |
143 | // See Hash
144 | uint32_t RandomExistent() { return RandomNonSpecial() | (1U << 30); }
145 | uint32_t RandomNonexistent() { return RandomNonSpecial() & ~(1U << 30); }
146 |
147 | template
148 | void Init(Container* c) {}
149 |
150 | template
151 | void Reserve(Container* c, size_t n) {
152 | return c->reserve(n);
153 | }
154 |
155 | template
156 | void Init(google::dense_hash_set* s) {
157 | s->set_empty_key(kEmpty);
158 | s->set_deleted_key(kDeleted);
159 | }
160 |
161 | template
162 | void Reserve(google::dense_hash_set* s, size_t n) {
163 | s->resize(n);
164 | }
165 |
166 | template
167 | void Reserve(__gnu_cxx::hash_set* c, size_t n) {}
168 |
169 | template
170 | double MaxLoadFactor(const Container& c) {
171 | return c.max_load_factor();
172 | }
173 |
174 | template
175 | double MaxLoadFactor(const __gnu_cxx::hash_set& c) {
176 | return 1.;
177 | }
178 |
179 | template
180 | double LoadFactor(const Container& c) {
181 | // Do not use load_factor() because hash_map does not provide such function.
182 | return 1. * c.size() / c.bucket_count();
183 | }
184 |
185 | template
186 | double RelativeLoadFactor(const Container& c) {
187 | return LoadFactor(c) / MaxLoadFactor(c);
188 | }
189 |
190 | enum class Density {
191 | kMin, // mininum load factor
192 | kMax, // maximum load factor
193 | };
194 |
195 | // Returns a set filled with random data with size at least min_size and either
196 | // low or high load factor depending on the requested density. Calling this
197 | // function multiple times with the same arguments will yield sets with the same
198 | // size and the same number of buckets. Their elements can be different.
199 | template
200 | Set GenerateSet(size_t min_size, Density density) {
201 | Set set;
202 | Init(&set);
203 | Reserve(&set, min_size - 1); // -1 is a workaround for dense_hash_set
204 | std::vector v;
205 | v.reserve(min_size);
206 | // +1 is to ensure the final set size is at least min_size.
207 | while (set.size() < (density == Density::kMax ? min_size + 1 : min_size)) {
208 | uint32_t elem = RandomExistent();
209 | if (set.insert(elem).second) v.push_back(elem);
210 | }
211 | size_t bucket_count = set.bucket_count();
212 | while (true) {
213 | uint32_t elem = RandomExistent();
214 | if (!set.insert(elem).second) continue;
215 | v.push_back(elem);
216 | if (set.bucket_count() > bucket_count) {
217 | if (density == Density::kMax) {
218 | Set empty;
219 | Init(&empty);
220 | set.swap(empty);
221 | // Drop two elements instead of one as a workaround for dense_hash_set.
222 | assert(v.size() >= 2);
223 | set.insert(v.begin(), v.end() - 2);
224 | }
225 | return set;
226 | }
227 | }
228 | }
229 |
230 | // Generates several random sets with GenerateSet(min_size, density). The
231 | // sum of the set sizes is at least min_total_size.
232 | template
233 | HT_BENCH_NOINLINE std::vector GenerateSets(size_t min_size,
234 | size_t min_total_size,
235 | Density density) {
236 | GetRNG() = MakeRNG();
237 | size_t total_size = 0;
238 | std::vector res;
239 | res.reserve(min_total_size / min_size + 1);
240 | while (total_size < min_total_size) {
241 | Set set = GenerateSet(min_size, density);
242 | total_size += set.size();
243 | res.push_back(std::move(set));
244 | // This requirement makes benchmarks a bit simpler but it can be removed
245 | // when it becomes necessary to benchmark classes that violate it.
246 | assert(res.front().size() == res.back().size());
247 | }
248 | return res;
249 | }
250 |
251 | template
252 | std::vector ToVector(const Set& set) {
253 | std::vector res(set.size());
254 | std::copy(set.begin(), set.end(), res.begin());
255 | return res;
256 | }
257 |
258 | template class SetT, size_t kValueSizeT, Density kDensityT>
259 | class Environment {
260 | public:
261 | using Set = SetT, Hash, Eq>;
262 | static constexpr size_t kValueSize = kValueSizeT;
263 | static constexpr Density kDensity = kDensityT;
264 |
265 | explicit Environment(benchmark::State* state) : state_(*state) {}
266 |
267 | size_t Size() const { return state_.range(0); }
268 |
269 | bool KeepRunningBatch(size_t n) {
270 | if (state_.iterations() == 0) Eq::num_calls = 0;
271 | return state_.KeepRunningBatch(n);
272 | }
273 |
274 | private:
275 | benchmark::State& state_;
276 | };
277 |
278 | template class SetT, size_t kValueSizeT, Density kDensityT>
279 | const size_t Environment::kValueSize;
280 |
281 | template class SetT, size_t kValueSizeT, Density kDensityT>
282 | const Density Environment::kDensity;
283 |
284 | template
285 | std::vector MakeVector(std::vector v) {
286 | return std::move(v);
287 | }
288 |
289 | template
290 | std::vector MakeVector(T x) {
291 | std::vector v;
292 | v.push_back(std::move(x));
293 | return v;
294 | }
295 |
296 | // Wrapper around a concrete benchmark. F must be a default-constructible
297 | // functor taking Environment* as argument and
298 | // returning either std::vector, Hash, Eq>> or a single
299 | // set.
300 | template class SetT, size_t kValueSizeT,
301 | Density kDensityT>
302 | void BM(benchmark::State& state) {
303 | // Reset RNG so that each benchmark sees the same sequence of random numbers.
304 | GetRNG() = MakeRNG();
305 | Environment env(&state);
306 | std::vector, Hash, Eq>> s = MakeVector(F()(&env));
307 | // No iterations means the benchmark is disabled.
308 | if (state.iterations() == 0) return;
309 | assert(!s.empty());
310 | assert(!s.front().empty());
311 | for (const auto& set : s) {
312 | assert(set.size() == s.front().size());
313 | assert(set.bucket_count() == s.front().bucket_count());
314 | (void)set; // silence warning in opt
315 | }
316 | if (kDensityT == Density::kMin) {
317 | assert(RelativeLoadFactor(s.front()) < 0.6);
318 | } else {
319 | assert(RelativeLoadFactor(s.front()) > 0.6);
320 | }
321 | assert(state.iterations() > 0);
322 | double comp_per_op = 1. * Eq::num_calls / state.iterations();
323 | state.SetLabel(absl::StrFormat("lf=%.2f cmp=%.3f size=%u num_sets=%u",
324 | LoadFactor(s.front()), comp_per_op,
325 | s.front().size(), s.size()));
326 | }
327 |
328 | // Transposes the matrix and concatenates the resulting elements.
329 | template
330 | std::vector Transpose(std::vector> m) {
331 | assert(!m.empty());
332 | std::vector v(m.size() * m.front().size());
333 | for (size_t i = 0; i != m.size(); ++i) {
334 | assert(m[i].size() == m[0].size());
335 | for (size_t j = 0; j != m[i].size(); ++j) {
336 | v[j * m.size() + i] = m[i][j];
337 | }
338 | }
339 | return v;
340 | }
341 |
342 | // Helper function used to implement two similar benchmarks defined below.
343 | template
344 | HT_BENCH_FLATTEN std::vector LookupHit_Hot(Env* env,
345 | Lookup lookup) {
346 | using Set = typename Env::Set;
347 | static constexpr size_t kMinTotalKeyCount = 64 << 10;
348 | static constexpr size_t kOpsPerKey = 512;
349 |
350 | std::vector s =
351 | GenerateSets(env->Size(), kMinTotalKeyCount, Env::kDensity);
352 |
353 | if (s.size() > 1) {
354 | while (env->KeepRunningBatch(s.size() * s.front().size() * kOpsPerKey)) {
355 | for (Set& set : s) {
356 | for (uint32_t key : set) {
357 | for (size_t i = 0; i != kOpsPerKey; ++i) {
358 | lookup(&set, key);
359 | }
360 | }
361 | }
362 | }
363 | } else {
364 | std::vector keys = ToVector(s.front());
365 | std::shuffle(keys.begin(), keys.end(), GetRNG());
366 | keys.resize(kMinTotalKeyCount);
367 | while (env->KeepRunningBatch(kMinTotalKeyCount * kOpsPerKey)) {
368 | for (uint32_t key : keys) {
369 | for (size_t i = 0; i != kOpsPerKey; ++i) {
370 | lookup(&s.front(), key);
371 | }
372 | }
373 | }
374 | }
375 |
376 | return s;
377 | }
378 |
379 | // Helper function used to implement two similar benchmarks defined below.
380 | template
381 | HT_BENCH_FLATTEN std::vector LookupHit_Cold(Env* env,
382 | Lookup lookup) {
383 | using Set = typename Env::Set;
384 | // The larger this value, the colder the benchmark and the longer it takes to
385 | // run.
386 | static constexpr size_t kMinTotalBytes = 256 << 20;
387 |
388 | std::vector s = GenerateSets(
389 | env->Size(), kMinTotalBytes / Env::kValueSize, Env::kDensity);
390 |
391 | std::vector> m(s.size());
392 | for (size_t i = 0; i != s.size(); ++i) {
393 | m[i] = ToVector(s[i]);
394 | std::shuffle(m[i].begin(), m[i].end(), GetRNG());
395 | }
396 | std::vector keys = Transpose(std::move(m));
397 |
398 | const size_t num_sets = s.front().size();
399 | const size_t set_size = s.size();
400 | while (env->KeepRunningBatch(keys.size())) {
401 | for (size_t i = 0; i != num_sets; ++i) {
402 | for (size_t j = 0; j != set_size; ++j) {
403 | lookup(&s[j], keys[i * set_size + j]);
404 | }
405 | }
406 | }
407 |
408 | return s;
409 | }
410 |
411 | // Measures the time it takes to `find` an existent element.
412 | //
413 | // assert(set.find(key) != set.end());
414 | struct FindHit_Hot {
415 | template
416 | std::vector operator()(Env* env) const {
417 | using Set = typename Env::Set;
418 | return LookupHit_Hot(env, [](Set* set, uint32_t key) {
419 | DoNotOptimize(set);
420 | DoNotOptimize(key);
421 | DoNotOptimize(set->find(key));
422 | });
423 | }
424 | };
425 |
426 | // Measures the time it takes to `find` an existent element.
427 | //
428 | // assert(set.find(key) != set.end());
429 | struct FindHit_Cold {
430 | template
431 | std::vector operator()(Env* env) const {
432 | using Set = typename Env::Set;
433 | return LookupHit_Cold(env, [](Set* set, uint32_t key) {
434 | DoNotOptimize(set);
435 | DoNotOptimize(key);
436 | DoNotOptimize(set->find(key));
437 | });
438 | }
439 | };
440 |
441 | // Measures the time it takes to `insert` an existent element.
442 | //
443 | // assert(!set.insert(key).second);
444 | struct InsertHit_Hot {
445 | template
446 | std::vector operator()(Env* env) const {
447 | using Set = typename Env::Set;
448 | return LookupHit_Hot(env, [](Set* set, uint32_t key) {
449 | DoNotOptimize(set);
450 | DoNotOptimize(key);
451 | DoNotOptimize(set->insert(key));
452 | });
453 | }
454 | };
455 |
456 | // Measures the time it takes to `insert` an existent element.
457 | //
458 | // assert(!set.insert(key).second);
459 | struct InsertHit_Cold {
460 | template
461 | std::vector operator()(Env* env) const {
462 | using Set = typename Env::Set;
463 | return LookupHit_Cold(env, [](Set* set, uint32_t key) {
464 | DoNotOptimize(set);
465 | DoNotOptimize(key);
466 | DoNotOptimize(set->insert(key));
467 | });
468 | }
469 | };
470 |
471 | // Measures the time it takes to `find` an nonexistent element.
472 | //
473 | // assert(set.find(key) == set.end());
474 | struct FindMiss_Hot {
475 | template
476 | HT_BENCH_FLATTEN std::vector operator()(Env* env) const {
477 | using Set = typename Env::Set;
478 | // The larger this value, the less the results will depend on randomness and
479 | // the longer the benchmark will run.
480 | static constexpr size_t kMinTotalKeyCount = 64 << 10;
481 | // The larger this value, the hotter the benchmark and the longer it will
482 | // run.
483 | static constexpr size_t kOpsPerKey = 512;
484 |
485 | std::vector s =
486 | GenerateSets(env->Size(), kMinTotalKeyCount, Env::kDensity);
487 | const size_t keys_per_set = kMinTotalKeyCount / s.size();
488 |
489 | while (env->KeepRunningBatch(s.size() * keys_per_set * kOpsPerKey)) {
490 | for (const Set& set : s) {
491 | for (size_t i = 0; i != keys_per_set; ++i) {
492 | const uint32_t key = RandomNonexistent();
493 | for (size_t j = 0; j != kOpsPerKey; ++j) {
494 | DoNotOptimize(set);
495 | DoNotOptimize(key);
496 | DoNotOptimize(set.find(key));
497 | }
498 | }
499 | }
500 | }
501 |
502 | return s;
503 | }
504 | };
505 |
506 | // Measures the time it takes to `find` an nonexistent element.
507 | //
508 | // assert(set.find(key) == set.end());
509 | struct FindMiss_Cold {
510 | template
511 | HT_BENCH_FLATTEN std::vector operator()(Env* env) const {
512 | using Set = typename Env::Set;
513 | // The larger this value, the colder the benchmark and the longer it takes
514 | // to run.
515 | static constexpr size_t kMinTotalBytes = 256 << 20;
516 |
517 | std::vector s = GenerateSets(
518 | env->Size(), kMinTotalBytes / Env::kValueSize, Env::kDensity);
519 | std::vector keys(s.front().size());
520 | for (uint32_t& key : keys) key = RandomNonexistent();
521 |
522 | while (env->KeepRunningBatch(keys.size() * s.size())) {
523 | for (uint32_t key : keys) {
524 | for (const Set& set : s) {
525 | DoNotOptimize(set);
526 | DoNotOptimize(key);
527 | DoNotOptimize(set.find(key));
528 | }
529 | }
530 | }
531 |
532 | return s;
533 | }
534 | };
535 |
536 | // Measures the time it takes to `erase` an existent element and then `insert`
537 | // a new element.
538 | //
539 | // assert(set.erase(key1));
540 | // assert(set.insert(key2).second);
541 | struct EraseInsert_Hot {
542 | template
543 | HT_BENCH_FLATTEN typename Env::Set operator()(Env* env) const {
544 | using Set = typename Env::Set;
545 | // The larger this value, the less the results will depend on randomness and
546 | // the longer the benchmark will run.
547 | static constexpr size_t kMinKeyCount = 1 << 20;
548 |
549 | // I cannot figure out how to make this benchmark work with high load factor
550 | // on dense_hash_set and flat_hash_set. Disabling it for now.
551 | if (Env::kDensity != Density::kMin) return Set();
552 |
553 | Set s = GenerateSet(env->Size(), Env::kDensity);
554 | std::vector keys = ToVector(s);
555 | std::shuffle(keys.begin(), keys.end(), GetRNG());
556 | std::unordered_set extra;
557 | while (keys.size() < kMinKeyCount || keys.size() < 3 * s.size()) {
558 | uint32_t key = RandomExistent();
559 | if (!s.count(key) && extra.insert(key).second) keys.push_back(key);
560 | }
561 |
562 | const size_t set_size = s.size();
563 | const size_t num_keys = keys.size();
564 | while (env->KeepRunningBatch(num_keys)) {
565 | for (size_t i = 0; i != num_keys - set_size; ++i) {
566 | DoNotOptimize(s);
567 | DoNotOptimize(s.erase(keys[i]));
568 | DoNotOptimize(s.insert(keys[i + set_size]));
569 | }
570 | for (size_t i = 0; i != set_size; ++i) {
571 | DoNotOptimize(s);
572 | DoNotOptimize(s.erase(keys[num_keys - set_size + i]));
573 | DoNotOptimize(s.insert(keys[i]));
574 | }
575 | }
576 |
577 | return s;
578 | }
579 | };
580 |
581 | // Measures the time it takes to `erase` an existent element and then `insert`
582 | // a new element.
583 | //
584 | // assert(set.erase(key1));
585 | // assert(set.insert(key2).second);
586 | struct EraseInsert_Cold {
587 | template
588 | HT_BENCH_FLATTEN std::vector operator()(Env* env) const {
589 | using Set = typename Env::Set;
590 | // The larger this value, the colder the benchmark and the longer it takes
591 | // to run.
592 | static constexpr size_t kMinTotalBytes = 128 << 20;
593 |
594 | // I cannot figure out how to make this benchmark work with high load factor
595 | // on dense_hash_set and flat_hash_set. Disabling it for now.
596 | if (Env::kDensity != Density::kMin) return {};
597 |
598 | std::vector s = GenerateSets(
599 | env->Size(), kMinTotalBytes / Env::kValueSize, Env::kDensity);
600 |
601 | const size_t set_size = s.front().size();
602 | const size_t set_keys = 3 * set_size;
603 | std::vector> m(s.size());
604 | for (size_t i = 0; i != s.size(); ++i) {
605 | m[i] = ToVector(s[i]);
606 | std::shuffle(m[i].begin(), m[i].end(), GetRNG());
607 | std::unordered_set extra;
608 | m[i].reserve(set_keys);
609 | while (m[i].size() < set_keys) {
610 | uint32_t key = RandomExistent();
611 | if (!s[i].count(key) && extra.insert(key).second) m[i].push_back(key);
612 | }
613 | }
614 |
615 | std::vector keys = Transpose(std::move(m));
616 |
617 | const size_t num_sets = s.size();
618 | while (env->KeepRunningBatch(keys.size())) {
619 | for (size_t i = 0; i != set_keys - set_size; ++i) {
620 | for (size_t j = 0; j != num_sets; ++j) {
621 | DoNotOptimize(s[j].erase(keys[i * num_sets + j]));
622 | DoNotOptimize(s[j].insert(keys[(i + set_size) * num_sets + j]));
623 | }
624 | }
625 | for (size_t i = 0; i != set_size; ++i) {
626 | for (size_t j = 0; j != num_sets; ++j) {
627 | DoNotOptimize(
628 | s[j].erase(keys[(set_keys - set_size + i) * num_sets + j]));
629 | DoNotOptimize(s[j].insert(keys[i * num_sets + j]));
630 | }
631 | }
632 | }
633 |
634 | return s;
635 | }
636 | };
637 |
638 | // Measures the time it takes to `clear` a set and then `insert` the same
639 | // elements back in random order. The reported time is per element. In other
640 | // words, the pseudo code below counts as N iterations.
641 | //
642 | // set.clear();
643 | // set.reserve(N);
644 | // set.insert(key1);
645 | // ...
646 | // set.insert(keyN);
647 | //
648 | // What we really need is to clear the container without releasing memory. For
649 | // most containers this can be expressed as `set.clear()` but for SwissTable
650 | // and densehashtable containers this call can release memory.
651 | struct InsertManyUnordered_Hot {
652 | template
653 | HT_BENCH_FLATTEN typename Env::Set operator()(Env* env) const {
654 | using Set = typename Env::Set;
655 | // The higher the value, the less contribution std::shuffle makes. The price
656 | // is longer benchmarking time. With 64 std::shuffle adds around 0.3 ns to
657 | // the benchmark results.
658 | static constexpr size_t kRepetitions = 64;
659 | // The larger this value, the less the results will depend on randomness and
660 | // the longer the benchmark will run.
661 | static constexpr size_t kMinInsertions = 256 << 10;
662 |
663 | Set s = GenerateSet(env->Size(), Env::kDensity);
664 | std::vector keys = ToVector(s);
665 |
666 | const size_t n = std::max(size_t{1}, kMinInsertions / keys.size());
667 | while (env->KeepRunningBatch(keys.size() * n * kRepetitions)) {
668 | for (size_t i = 0; i != n; ++i) {
669 | std::shuffle(keys.begin(), keys.end(), GetRNG());
670 | for (size_t j = 0; j != kRepetitions; ++j) {
671 | s.clear();
672 | Reserve(&s, keys.size());
673 | for (uint32_t key : keys) DoNotOptimize(s.insert(key));
674 | }
675 | }
676 | }
677 |
678 | return s;
679 | }
680 | };
681 |
682 | // Measures the time it takes to `clear` a set and then `insert` the same
683 | // elements back in random order. The reported time is per element. In other
684 | // words, the pseudo code below counts as N iterations.
685 | //
686 | // set.clear();
687 | // set.reserve(N);
688 | // set.insert(key1);
689 | // ...
690 | // set.insert(keyN);
691 | //
692 | // What we really need is to clear the container without releasing memory. For
693 | // most containers this can be expressed as `set.clear()` but for SwissTable
694 | // and densehashtable containers this call can release memory.
695 | struct InsertManyUnordered_Cold {
696 | template
697 | HT_BENCH_FLATTEN std::vector operator()(Env* env) const {
698 | using Set = typename Env::Set;
699 | // The larger this value, the colder the benchmark and the longer it takes
700 | // to run.
701 | static constexpr size_t kMinTotalBytes = 128 << 20;
702 |
703 | std::vector s = GenerateSets(
704 | env->Size(), kMinTotalBytes / Env::kValueSize, Env::kDensity);
705 |
706 | std::vector> m(s.size());
707 | for (size_t i = 0; i != s.size(); ++i) {
708 | m[i] = ToVector(s[i]);
709 | std::shuffle(m[i].begin(), m[i].end(), GetRNG());
710 | }
711 |
712 | std::vector keys = Transpose(std::move(m));
713 | const size_t set_size = s.front().size();
714 | const size_t num_sets = s.size();
715 | while (env->KeepRunningBatch(keys.size())) {
716 | for (Set& set : s) {
717 | set.clear();
718 | Reserve(&set, set_size);
719 | }
720 | for (size_t i = 0; i != set_size; ++i) {
721 | for (size_t j = 0; j != num_sets; ++j) {
722 | DoNotOptimize(s[j].insert(keys[i * num_sets + j]));
723 | }
724 | }
725 | }
726 |
727 | return s;
728 | }
729 | };
730 |
731 | // Measures the time it takes to `clear` a set and then `insert` the same
732 | // elements in the order they were in the set. The reported time is per element.
733 | // In other words, the pseudo code below counts as N iterations.
734 | //
735 | // set.clear();
736 | // set.reserve(N);
737 | // set.insert(key1);
738 | // ...
739 | // set.insert(keyN);
740 | //
741 | // What we really need is to clear the container without releasing memory. For
742 | // most containers this can be expressed as `set.clear()` but for SwissTable,
743 | // densehashtable, and F14 containers this call can release memory.
744 | struct InsertManyOrdered_Hot {
745 | template
746 | HT_BENCH_FLATTEN std::vector operator()(Env* env) const {
747 | using Set = typename Env::Set;
748 | // The higher the value, the less contribution std::shuffle makes. The price
749 | // is longer benchmarking time. With 64 std::shuffle adds around 0.3 ns to
750 | // the benchmark results.
751 | static constexpr size_t kRepetitions = 64;
752 | // The larger this value, the less the results will depend on randomness and
753 | // the longer the benchmark will run.
754 | static constexpr size_t kMinTotalKeyCount = 256 << 10;
755 |
756 | std::vector s =
757 | GenerateSets(env->Size(), kMinTotalKeyCount, Env::kDensity);
758 | std::vector> keys(s.size());
759 | for (size_t i = 0; i != s.size(); ++i) {
760 | keys[i] = ToVector(s[i]);
761 | }
762 |
763 | while (env->KeepRunningBatch(s.size() * s.front().size() * kRepetitions)) {
764 | for (size_t i = 0; i != s.size(); ++i) {
765 | for (size_t j = 0; j != kRepetitions; ++j) {
766 | s[i].clear();
767 | Reserve(&s[i], keys[i].size());
768 | for (uint32_t key : keys[i]) DoNotOptimize(s[i].insert(key));
769 | }
770 | }
771 | }
772 |
773 | return s;
774 | }
775 | };
776 |
777 | // Measures the time it takes to `clear` a set and then `insert` the same
778 | // elements in the order they were in the set. The reported time is per element.
779 | // In other words, the pseudo code below counts as N iterations.
780 | //
781 | // set.clear();
782 | // set.reserve(N);
783 | // set.insert(key1);
784 | // ...
785 | // set.insert(keyN);
786 | //
787 | // What we really need is to clear the container without releasing memory. For
788 | // most containers this can be expressed as `set.clear()` but for SwissTable
789 | // and densehashtable containers this call can release memory.
790 | struct InsertManyOrdered_Cold {
791 | template
792 | HT_BENCH_FLATTEN std::vector operator()(Env* env) const {
793 | using Set = typename Env::Set;
794 | // The larger this value, the colder the benchmark and the longer it takes
795 | // to run.
796 | static constexpr size_t kMinTotalBytes = 128 << 20;
797 |
798 | std::vector s = GenerateSets(
799 | env->Size(), kMinTotalBytes / Env::kValueSize, Env::kDensity);
800 |
801 | std::vector> m(s.size());
802 | for (size_t i = 0; i != s.size(); ++i) {
803 | m[i] = ToVector(s[i]);
804 | }
805 |
806 | std::vector keys = Transpose(std::move(m));
807 | const size_t set_size = s.front().size();
808 | const size_t num_sets = s.size();
809 | while (env->KeepRunningBatch(keys.size())) {
810 | for (Set& set : s) {
811 | set.clear();
812 | Reserve(&set, set_size);
813 | }
814 | for (size_t i = 0; i != set_size; ++i) {
815 | for (size_t j = 0; j != num_sets; ++j) {
816 | DoNotOptimize(s[j].insert(keys[i * num_sets + j]));
817 | }
818 | }
819 | }
820 |
821 | return s;
822 | }
823 | };
824 |
825 | // Measures the time it takes to iterate over a set and read its every element.
826 | // The reported time is per element. In other words, the pseudo code below
827 | // counts as `set.size()` iterations.
828 | //
829 | // for (const auto& elem : set) {
830 | // Read(elem);
831 | // }
832 | struct Iterate_Hot {
833 | template
834 | HT_BENCH_FLATTEN std::vector operator()(Env* env) const {
835 | using Set = typename Env::Set;
836 | // The larger this value, the hotter the benchmark and the longer it will
837 | // run.
838 | static constexpr size_t kRepetitions = 64;
839 | // The larger this value, the less the results will depend on randomness and
840 | // the longer the benchmark will run.
841 | static constexpr size_t kMinKeyCount = 256 << 10;
842 |
843 | std::vector s =
844 | GenerateSets(env->Size(), kMinKeyCount, Env::kDensity);
845 |
846 | alignas(Value) char data[Env::kValueSize];
847 | while (env->KeepRunningBatch(s.size() * s.front().size() * kRepetitions)) {
848 | for (const Set& set : s) {
849 | for (size_t i = 0; i != kRepetitions; ++i) {
850 | for (const auto& elem : set) {
851 | memcpy(data, &elem, Env::kValueSize);
852 | DoNotOptimize(data);
853 | }
854 | }
855 | }
856 | }
857 |
858 | return s;
859 | }
860 | };
861 |
862 | // Measures the time it takes to iterate over a set and read its every element.
863 | // The reported time is per element. In other words, the pseudo code below
864 | // counts as `set.size()` iterations.
865 | //
866 | // for (const auto& elem : set) {
867 | // Read(elem);
868 | // }
869 | struct Iterate_Cold {
870 | template
871 | HT_BENCH_FLATTEN std::vector operator()(Env* env) const {
872 | using Set = typename Env::Set;
873 | // The larger this value, the colder the benchmark and the longer it takes
874 | // to run.
875 | static constexpr size_t kMinTotalBytes = 128 << 20;
876 | static constexpr size_t kStride = 16;
877 |
878 | std::vector s = GenerateSets(
879 | env->Size(), kMinTotalBytes / Env::kValueSize, Env::kDensity);
880 |
881 | const size_t num_strides = s.front().size() / kStride;
882 | assert(num_strides > 0);
883 |
884 | std::vector> m;
885 | m.reserve(s.size());
886 | for (const Set& set : s) {
887 | auto iter = set.begin();
888 | std::vector iters;
889 | iters.reserve(num_strides);
890 | for (size_t i = 0; i != num_strides; ++i) {
891 | iters.push_back(iter);
892 | std::advance(iter, kStride);
893 | }
894 | m.push_back(std::move(iters));
895 | }
896 |
897 | std::vector begins = Transpose(std::move(m));
898 | std::vector iters = begins;
899 | alignas(Value) char data[Env::kValueSize];
900 | const size_t num_sets = s.size();
901 | while (env->KeepRunningBatch(iters.size() * kStride)) {
902 | for (size_t i = 0; i != kStride; ++i) {
903 | for (size_t j = 0; j != num_strides; ++j) {
904 | for (size_t k = 0; k != num_sets; ++k) {
905 | auto& iter = iters[j * num_sets + k];
906 | DoNotOptimize(iter == s[k].end());
907 | memcpy(data, &*iter, Env::kValueSize);
908 | DoNotOptimize(data);
909 | ++iter;
910 | }
911 | }
912 | }
913 | iters = begins;
914 | }
915 |
916 | return s;
917 | }
918 | };
919 |
920 |
921 | // Adjust benchmark flag defaults so that the benchmarks run in a reasonable
922 | // time. The benchmark framework restarts the whole benchmark with number of
923 | // iterations until it runs for a specific time. This means we build the
924 | // benchmarking state many times over and this is very costly. To fix this
925 | // we set a fixed high number iterations that experimentally produce stable
926 | // results and avoid the repeated creation of the benchmarking state.
927 | void ConfigureBenchmark(benchmark::internal::Benchmark* b) {
928 | b->Arg(1 << 4);
929 | b->Arg(1 << 8);
930 | b->Arg(1 << 12);
931 | b->Arg(1 << 16);
932 | b->Arg(1 << 20);
933 | b->Iterations(20000000);
934 | }
935 |
936 | // clang-format off
937 | #define BENCHES \
938 | (FindHit) \
939 | (FindMiss) \
940 | (InsertHit) \
941 | (EraseInsert) \
942 | (InsertManyUnordered) \
943 | (InsertManyOrdered) \
944 | (Iterate)
945 |
946 | #define ENVS \
947 | (_Hot) \
948 | (_Cold)
949 |
950 | #define VALUE_SIZES \
951 | (4) \
952 | (8) \
953 | (16) \
954 | (32) \
955 | (64)
956 |
957 | #define DENSITIES \
958 | (Density::kMin) \
959 | (Density::kMax)
960 |
961 | #define SET_TYPES \
962 | (__gnu_cxx::hash_set) \
963 | (std::unordered_set) \
964 | (google::dense_hash_set) \
965 | (absl::flat_hash_set) \
966 | (absl::node_hash_set) \
967 | (folly::F14ValueSet) \
968 | (folly::F14NodeSet) \
969 | (folly::F14VectorSet)
970 | // clang-format on
971 |
972 | #define DEFINE_BENCH_I(bench, env, set, value_size, density) \
973 | BENCHMARK_TEMPLATE(BM, bench##env, set, value_size, density) \
974 | ->Apply(ConfigureBenchmark);
975 |
976 | #define DEFINE_BENCH(r, seq) \
977 | BOOST_PP_EXPAND(DEFINE_BENCH_I BOOST_PP_SEQ_TO_TUPLE(seq))
978 |
979 | BOOST_PP_SEQ_FOR_EACH_PRODUCT(
980 | DEFINE_BENCH, (BENCHES)(ENVS)(SET_TYPES)(VALUE_SIZES)(DENSITIES))
981 |
982 | } // namespace
983 |
984 | int main(int argc, char **argv) {
985 | auto prog = std::string(argv[0]) + "@" + getBuildScmRevision();
986 | argv[0] = const_cast(prog.c_str());
987 |
988 | benchmark::Initialize(&argc, argv);
989 | if (benchmark::ReportUnrecognizedArguments(argc, argv)) {
990 | return 1;
991 | }
992 | benchmark::RunSpecifiedBenchmarks();
993 | return 0;
994 | }
995 |
--------------------------------------------------------------------------------
/results/bytell_max_lf.txt:
--------------------------------------------------------------------------------
1 | 16 15 0.9375
2 | 32 31 0.96875
3 | 64 63 0.984375
4 | 128 127 0.992188
5 | 256 253 0.988281
6 | 512 508 0.992188
7 | 1024 964 0.941406
8 | 2048 1945 0.949707
9 | 4096 3952 0.964844
10 | 8192 7830 0.955811
11 | 16384 15216 0.928711
12 | 32768 30919 0.943573
13 | 65536 61566 0.939423
14 | 131072 121953 0.930428
15 | 262144 245867 0.937908
16 | 524288 487348 0.929543
17 | 1048576 965902 0.921156
18 | 2097152 1922625 0.916779
19 | 4194304 3732342 0.88986
20 | 8388608 7586045 0.904327
21 | 16777216 15272974 0.91034
22 | 33554432 30222305 0.900695
23 | 67108864 58753924 0.875502
24 | 134217728 118292639 0.881349
25 | 268435456 228764183 0.852213
26 |
27 | 16 15 0.9375
28 | 32 31 0.96875
29 | 64 63 0.984375
30 | 128 126 0.984375
31 | 256 252 0.984375
32 | 512 502 0.980469
33 | 1024 1001 0.977539
34 | 2048 1988 0.970703
35 | 4096 3993 0.974854
36 | 8192 7855 0.958862
37 | 16384 15632 0.954102
38 | 32768 30199 0.9216
39 | 65536 61110 0.932465
40 | 131072 123016 0.938538
41 | 262144 241293 0.92046
42 | 524288 473852 0.903801
43 | 1048576 956118 0.911825
44 | 2097152 1912809 0.912098
45 | 4194304 3793604 0.904466
46 | 8388608 7473029 0.890854
47 | 16777216 14822649 0.883499
48 | 33554432 29863459 0.89
49 | 67108864 59637241 0.888664
50 | 134217728 119344749 0.889188
51 | 268435456 233779838 0.870898
52 |
53 | 16 15 0.9375
54 | 32 31 0.96875
55 | 64 63 0.984375
56 | 128 127 0.992188
57 | 256 255 0.996094
58 | 512 510 0.996094
59 | 1024 974 0.951172
60 | 2048 1972 0.962891
61 | 4096 4002 0.977051
62 | 8192 7889 0.963013
63 | 16384 14993 0.9151
64 | 32768 31100 0.949097
65 | 65536 62107 0.947678
66 | 131072 122449 0.934212
67 | 262144 246307 0.939587
68 | 524288 487634 0.930088
69 | 1048576 958325 0.91393
70 | 2097152 1926039 0.918407
71 | 4194304 3810317 0.90845
72 | 8388608 7573603 0.902844
73 | 16777216 15098795 0.899958
74 | 33554432 29681994 0.884592
75 | 67108864 57802625 0.861326
76 | 134217728 118807420 0.885184
77 | 268435456 236102008 0.879549
78 |
79 | 16 15 0.9375
80 | 32 31 0.96875
81 | 64 63 0.984375
82 | 128 126 0.984375
83 | 256 253 0.988281
84 | 512 506 0.988281
85 | 1024 980 0.957031
86 | 2048 2004 0.978516
87 | 4096 3940 0.961914
88 | 8192 7864 0.959961
89 | 16384 15581 0.950989
90 | 32768 31046 0.947449
91 | 65536 60479 0.922836
92 | 131072 123587 0.942894
93 | 262144 245605 0.936909
94 | 524288 472664 0.901535
95 | 1048576 961274 0.916742
96 | 2097152 1922345 0.916646
97 | 4194304 3823214 0.911525
98 | 8388608 7439809 0.886894
99 | 16777216 14361616 0.856019
100 | 33554432 29969833 0.893171
101 | 67108864 59011620 0.879342
102 | 134217728 119468695 0.890111
103 | 268435456 228960569 0.852945
104 |
105 | 16 15 0.9375
106 | 32 31 0.96875
107 | 64 63 0.984375
108 | 128 126 0.984375
109 | 256 255 0.996094
110 | 512 505 0.986328
111 | 1024 989 0.96582
112 | 2048 1996 0.974609
113 | 4096 3893 0.950439
114 | 8192 7940 0.969238
115 | 16384 15624 0.953613
116 | 32768 31041 0.947296
117 | 65536 61544 0.939087
118 | 131072 122562 0.935074
119 | 262144 240796 0.918564
120 | 524288 490719 0.935972
121 | 1048576 963562 0.918924
122 | 2097152 1902162 0.907022
123 | 4194304 3731389 0.889632
124 | 8388608 7632645 0.909882
125 | 16777216 14887192 0.887346
126 | 33554432 29708495 0.885382
127 | 67108864 59897681 0.892545
128 | 134217728 116493824 0.867947
129 | 268435456 234069408 0.871976
130 |
131 | 16 15 0.9375
132 | 32 31 0.96875
133 | 64 63 0.984375
134 | 128 127 0.992188
135 | 256 253 0.988281
136 | 512 508 0.992188
137 | 1024 1008 0.984375
138 | 2048 1996 0.974609
139 | 4096 3882 0.947754
140 | 8192 7951 0.970581
141 | 16384 15769 0.962463
142 | 32768 30605 0.93399
143 | 65536 61670 0.94101
144 | 131072 121360 0.925903
145 | 262144 242476 0.924973
146 | 524288 486684 0.928276
147 | 1048576 957302 0.912954
148 | 2097152 1897858 0.904969
149 | 4194304 3834832 0.914295
150 | 8388608 7376840 0.879388
151 | 16777216 14561736 0.867947
152 | 33554432 29808863 0.888373
153 | 67108864 59310601 0.883797
154 | 134217728 116928761 0.871187
155 | 268435456 238361416 0.887965
156 |
157 | 16 15 0.9375
158 | 32 31 0.96875
159 | 64 63 0.984375
160 | 128 127 0.992188
161 | 256 249 0.972656
162 | 512 507 0.990234
163 | 1024 986 0.962891
164 | 2048 1998 0.975586
165 | 4096 3989 0.973877
166 | 8192 7898 0.964111
167 | 16384 15692 0.957764
168 | 32768 31129 0.949982
169 | 65536 61349 0.936111
170 | 131072 119663 0.912956
171 | 262144 240778 0.918495
172 | 524288 480544 0.916565
173 | 1048576 971336 0.926338
174 | 2097152 1909661 0.910597
175 | 4194304 3828040 0.912676
176 | 8388608 7561812 0.901438
177 | 16777216 14832135 0.884064
178 | 33554432 29616165 0.88263
179 | 67108864 59229899 0.882594
180 | 134217728 116891266 0.870908
181 | 268435456 230258686 0.85778
182 |
183 | 16 15 0.9375
184 | 32 31 0.96875
185 | 64 63 0.984375
186 | 128 127 0.992188
187 | 256 255 0.996094
188 | 512 510 0.996094
189 | 1024 1008 0.984375
190 | 2048 2004 0.978516
191 | 4096 3937 0.961182
192 | 8192 7908 0.965332
193 | 16384 15448 0.942871
194 | 32768 31331 0.956146
195 | 65536 60518 0.923431
196 | 131072 116369 0.887825
197 | 262144 241994 0.923134
198 | 524288 472308 0.900856
199 | 1048576 962591 0.917998
200 | 2097152 1933438 0.921935
201 | 4194304 3758970 0.896208
202 | 8388608 7661872 0.913366
203 | 16777216 14988169 0.893364
204 | 33554432 29804744 0.888251
205 | 67108864 59681964 0.889331
206 | 134217728 113984121 0.849248
207 | 268435456 233815494 0.871031
208 |
209 | 16 15 0.9375
210 | 32 31 0.96875
211 | 64 63 0.984375
212 | 128 127 0.992188
213 | 256 255 0.996094
214 | 512 509 0.994141
215 | 1024 1011 0.987305
216 | 2048 2008 0.980469
217 | 4096 3882 0.947754
218 | 8192 7680 0.9375
219 | 16384 15449 0.942932
220 | 32768 30741 0.938141
221 | 65536 61762 0.942413
222 | 131072 122945 0.937996
223 | 262144 243991 0.930752
224 | 524288 481358 0.918118
225 | 1048576 944334 0.900587
226 | 2097152 1838722 0.876771
227 | 4194304 3768888 0.898573
228 | 8388608 7394593 0.881504
229 | 16777216 15092133 0.899561
230 | 33554432 29722841 0.88581
231 | 67108864 59347941 0.884353
232 | 134217728 117721426 0.877093
233 | 268435456 231831924 0.863641
234 |
235 | 16 15 0.9375
236 | 32 31 0.96875
237 | 64 63 0.984375
238 | 128 127 0.992188
239 | 256 253 0.988281
240 | 512 495 0.966797
241 | 1024 1013 0.989258
242 | 2048 2007 0.97998
243 | 4096 3968 0.96875
244 | 8192 7941 0.96936
245 | 16384 15639 0.954529
246 | 32768 31327 0.956024
247 | 65536 61842 0.943634
248 | 131072 122898 0.937637
249 | 262144 244644 0.933243
250 | 524288 474396 0.904839
251 | 1048576 934773 0.891469
252 | 2097152 1925463 0.918132
253 | 4194304 3834916 0.914315
254 | 8388608 7427088 0.885378
255 | 16777216 15045447 0.896779
256 | 33554432 29960151 0.892882
257 | 67108864 59877984 0.892251
258 | 134217728 117124518 0.872646
259 | 268435456 233585425 0.870174
260 |
261 | 16 15 0.9375
262 | 32 31 0.96875
263 | 64 63 0.984375
264 | 128 127 0.992188
265 | 256 249 0.972656
266 | 512 503 0.982422
267 | 1024 989 0.96582
268 | 2048 1929 0.941895
269 | 4096 3933 0.960205
270 | 8192 7842 0.957275
271 | 16384 15722 0.959595
272 | 32768 31274 0.954407
273 | 65536 61265 0.93483
274 | 131072 121964 0.930511
275 | 262144 236104 0.900665
276 | 524288 479416 0.914413
277 | 1048576 959357 0.914914
278 | 2097152 1910959 0.911216
279 | 4194304 3850620 0.918059
280 | 8388608 7671627 0.914529
281 | 16777216 15101120 0.900097
282 | 33554432 29710644 0.885446
283 | 67108864 58918190 0.877949
284 | 134217728 117558686 0.87588
285 | 268435456 231205465 0.861307
286 |
287 | 16 15 0.9375
288 | 32 31 0.96875
289 | 64 63 0.984375
290 | 128 127 0.992188
291 | 256 255 0.996094
292 | 512 502 0.980469
293 | 1024 988 0.964844
294 | 2048 2014 0.983398
295 | 4096 3963 0.967529
296 | 8192 7856 0.958984
297 | 16384 15407 0.940369
298 | 32768 31069 0.948151
299 | 65536 61931 0.944992
300 | 131072 122897 0.93763
301 | 262144 244955 0.934429
302 | 524288 466613 0.889994
303 | 1048576 959547 0.915095
304 | 2097152 1886717 0.899657
305 | 4194304 3769537 0.898728
306 | 8388608 7600819 0.906088
307 | 16777216 15047949 0.896928
308 | 33554432 29717707 0.885657
309 | 67108864 58604516 0.873275
310 | 134217728 117480155 0.875295
311 | 268435456 232397231 0.865747
312 |
313 | 16 15 0.9375
314 | 32 31 0.96875
315 | 64 63 0.984375
316 | 128 127 0.992188
317 | 256 255 0.996094
318 | 512 502 0.980469
319 | 1024 1006 0.982422
320 | 2048 1990 0.97168
321 | 4096 3983 0.972412
322 | 8192 7888 0.962891
323 | 16384 15662 0.955933
324 | 32768 31043 0.947357
325 | 65536 61885 0.94429
326 | 131072 121852 0.929657
327 | 262144 240844 0.918747
328 | 524288 488377 0.931505
329 | 1048576 959329 0.914887
330 | 2097152 1915193 0.913235
331 | 4194304 3784128 0.902206
332 | 8388608 7444676 0.887475
333 | 16777216 14813906 0.882978
334 | 33554432 29287075 0.872823
335 | 67108864 59173217 0.88175
336 | 134217728 118298577 0.881393
337 | 268435456 234442542 0.873367
338 |
339 | 16 15 0.9375
340 | 32 31 0.96875
341 | 64 63 0.984375
342 | 128 125 0.976562
343 | 256 253 0.988281
344 | 512 506 0.988281
345 | 1024 999 0.975586
346 | 2048 2010 0.981445
347 | 4096 3957 0.966064
348 | 8192 7838 0.956787
349 | 16384 15692 0.957764
350 | 32768 31141 0.950348
351 | 65536 61000 0.930786
352 | 131072 119552 0.912109
353 | 262144 243197 0.927723
354 | 524288 484814 0.924709
355 | 1048576 972159 0.927123
356 | 2097152 1885980 0.899305
357 | 4194304 3705295 0.883411
358 | 8388608 7493241 0.893264
359 | 16777216 15069596 0.898218
360 | 33554432 29410944 0.876514
361 | 67108864 60367458 0.899545
362 | 134217728 117249625 0.873578
363 | 268435456 234523362 0.873668
364 |
365 | 16 15 0.9375
366 | 32 31 0.96875
367 | 64 63 0.984375
368 | 128 127 0.992188
369 | 256 251 0.980469
370 | 512 503 0.982422
371 | 1024 1006 0.982422
372 | 2048 1995 0.974121
373 | 4096 3984 0.972656
374 | 8192 7923 0.967163
375 | 16384 15446 0.942749
376 | 32768 31212 0.952515
377 | 65536 61671 0.941025
378 | 131072 119700 0.913239
379 | 262144 241782 0.922325
380 | 524288 481082 0.917591
381 | 1048576 935543 0.892203
382 | 2097152 1911287 0.911373
383 | 4194304 3773527 0.899679
384 | 8388608 7531379 0.89781
385 | 16777216 14821851 0.883451
386 | 33554432 29895053 0.890942
387 | 67108864 57931698 0.86325
388 | 134217728 116882219 0.87084
389 | 268435456 235506879 0.877331
390 |
391 | 16 15 0.9375
392 | 32 31 0.96875
393 | 64 63 0.984375
394 | 128 127 0.992188
395 | 256 254 0.992188
396 | 512 507 0.990234
397 | 1024 1005 0.981445
398 | 2048 2017 0.984863
399 | 4096 3948 0.963867
400 | 8192 7819 0.954468
401 | 16384 15474 0.944458
402 | 32768 30650 0.935364
403 | 65536 61319 0.935654
404 | 131072 122786 0.936783
405 | 262144 244526 0.932793
406 | 524288 472124 0.900505
407 | 1048576 953663 0.909484
408 | 2097152 1901600 0.906754
409 | 4194304 3701319 0.882463
410 | 8388608 7618347 0.908178
411 | 16777216 14790012 0.881553
412 | 33554432 29682106 0.884596
413 | 67108864 58884872 0.877453
414 | 134217728 117644630 0.876521
415 | 268435456 236544115 0.881195
416 |
417 | 16 15 0.9375
418 | 32 31 0.96875
419 | 64 63 0.984375
420 | 128 127 0.992188
421 | 256 251 0.980469
422 | 512 502 0.980469
423 | 1024 998 0.974609
424 | 2048 1980 0.966797
425 | 4096 3873 0.945557
426 | 8192 7722 0.942627
427 | 16384 15512 0.946777
428 | 32768 31236 0.953247
429 | 65536 61637 0.940506
430 | 131072 122609 0.935432
431 | 262144 229386 0.875038
432 | 524288 485140 0.925331
433 | 1048576 955208 0.910957
434 | 2097152 1928248 0.91946
435 | 4194304 3824084 0.911733
436 | 8388608 7446018 0.887635
437 | 16777216 14913335 0.888904
438 | 33554432 30091834 0.896807
439 | 67108864 58983107 0.878917
440 | 134217728 118010731 0.879248
441 | 268435456 234456196 0.873417
442 |
443 | 16 15 0.9375
444 | 32 31 0.96875
445 | 64 63 0.984375
446 | 128 127 0.992188
447 | 256 255 0.996094
448 | 512 508 0.992188
449 | 1024 1009 0.985352
450 | 2048 1997 0.975098
451 | 4096 3988 0.973633
452 | 8192 7877 0.961548
453 | 16384 15546 0.948853
454 | 32768 31049 0.94754
455 | 65536 60772 0.927307
456 | 131072 119189 0.90934
457 | 262144 244019 0.930859
458 | 524288 483314 0.921848
459 | 1048576 962918 0.91831
460 | 2097152 1879120 0.896034
461 | 4194304 3765928 0.897867
462 | 8388608 7502293 0.894343
463 | 16777216 14820901 0.883395
464 | 33554432 30240967 0.901251
465 | 67108864 58449047 0.870959
466 | 134217728 118186750 0.88056
467 | 268435456 231317883 0.861726
468 |
469 | 16 15 0.9375
470 | 32 31 0.96875
471 | 64 63 0.984375
472 | 128 125 0.976562
473 | 256 254 0.992188
474 | 512 507 0.990234
475 | 1024 1004 0.980469
476 | 2048 2007 0.97998
477 | 4096 3966 0.968262
478 | 8192 7949 0.970337
479 | 16384 15759 0.961853
480 | 32768 30737 0.938019
481 | 65536 61870 0.944061
482 | 131072 123080 0.939026
483 | 262144 240920 0.919037
484 | 524288 474643 0.90531
485 | 1048576 956433 0.912126
486 | 2097152 1934968 0.922665
487 | 4194304 3798742 0.905691
488 | 8388608 7573725 0.902858
489 | 16777216 14634644 0.872293
490 | 33554432 29164558 0.869172
491 | 67108864 58928638 0.878105
492 | 134217728 118169767 0.880433
493 | 268435456 234218601 0.872532
494 |
495 | 16 15 0.9375
496 | 32 31 0.96875
497 | 64 63 0.984375
498 | 128 127 0.992188
499 | 256 253 0.988281
500 | 512 502 0.980469
501 | 1024 1003 0.979492
502 | 2048 1989 0.971191
503 | 4096 3959 0.966553
504 | 8192 7923 0.967163
505 | 16384 15474 0.944458
506 | 32768 30394 0.927551
507 | 65536 61396 0.936829
508 | 131072 119894 0.914719
509 | 262144 240561 0.917667
510 | 524288 482048 0.919434
511 | 1048576 955490 0.911226
512 | 2097152 1902778 0.907315
513 | 4194304 3746217 0.893168
514 | 8388608 7591260 0.904949
515 | 16777216 15173272 0.904397
516 | 33554432 28831420 0.859243
517 | 67108864 59007096 0.879274
518 | 134217728 117612706 0.876283
519 | 268435456 226098260 0.842282
520 |
521 | 16 15 0.9375
522 | 32 31 0.96875
523 | 64 63 0.984375
524 | 128 127 0.992188
525 | 256 254 0.992188
526 | 512 504 0.984375
527 | 1024 1013 0.989258
528 | 2048 1990 0.97168
529 | 4096 3931 0.959717
530 | 8192 7838 0.956787
531 | 16384 15483 0.945007
532 | 32768 30677 0.936188
533 | 65536 60222 0.918915
534 | 131072 122080 0.931396
535 | 262144 245314 0.935799
536 | 524288 478984 0.913589
537 | 1048576 959752 0.915291
538 | 2097152 1923555 0.917222
539 | 4194304 3825752 0.91213
540 | 8388608 7650303 0.911987
541 | 16777216 15103110 0.900216
542 | 33554432 29917106 0.891599
543 | 67108864 59754645 0.890414
544 | 134217728 116799676 0.870225
545 | 268435456 237306416 0.884035
546 |
547 | 16 15 0.9375
548 | 32 31 0.96875
549 | 64 63 0.984375
550 | 128 127 0.992188
551 | 256 254 0.992188
552 | 512 506 0.988281
553 | 1024 1000 0.976562
554 | 2048 2003 0.978027
555 | 4096 3948 0.963867
556 | 8192 7770 0.948486
557 | 16384 15520 0.947266
558 | 32768 30132 0.919556
559 | 65536 59218 0.903595
560 | 131072 122724 0.93631
561 | 262144 242231 0.924038
562 | 524288 475340 0.906639
563 | 1048576 947451 0.90356
564 | 2097152 1896493 0.904318
565 | 4194304 3790707 0.903775
566 | 8388608 7508482 0.895081
567 | 16777216 15026352 0.89564
568 | 33554432 29903141 0.891183
569 | 67108864 59379711 0.884827
570 | 134217728 118690786 0.884315
571 | 268435456 234779884 0.874623
572 |
573 | 16 15 0.9375
574 | 32 31 0.96875
575 | 64 63 0.984375
576 | 128 127 0.992188
577 | 256 254 0.992188
578 | 512 502 0.980469
579 | 1024 993 0.969727
580 | 2048 2015 0.983887
581 | 4096 3927 0.95874
582 | 8192 7946 0.969971
583 | 16384 15518 0.947144
584 | 32768 31182 0.951599
585 | 65536 61937 0.945084
586 | 131072 123036 0.93869
587 | 262144 241822 0.922478
588 | 524288 482331 0.919973
589 | 1048576 939429 0.895909
590 | 2097152 1846059 0.88027
591 | 4194304 3795281 0.904866
592 | 8388608 7566518 0.901999
593 | 16777216 14909265 0.888661
594 | 33554432 29420427 0.876797
595 | 67108864 59268489 0.883169
596 | 134217728 117928181 0.878633
597 | 268435456 229432206 0.854702
598 |
599 | 16 15 0.9375
600 | 32 31 0.96875
601 | 64 63 0.984375
602 | 128 127 0.992188
603 | 256 255 0.996094
604 | 512 506 0.988281
605 | 1024 1006 0.982422
606 | 2048 1995 0.974121
607 | 4096 3951 0.9646
608 | 8192 7783 0.950073
609 | 16384 15312 0.93457
610 | 32768 30127 0.919403
611 | 65536 62094 0.947479
612 | 131072 122949 0.938026
613 | 262144 243398 0.92849
614 | 524288 473876 0.903847
615 | 1048576 971298 0.926302
616 | 2097152 1882123 0.897466
617 | 4194304 3791131 0.903876
618 | 8388608 7567298 0.902092
619 | 16777216 15076847 0.89865
620 | 33554432 30218320 0.900576
621 | 67108864 59905309 0.892659
622 | 134217728 117934652 0.878682
623 | 268435456 235265606 0.876433
624 |
625 | 16 15 0.9375
626 | 32 31 0.96875
627 | 64 63 0.984375
628 | 128 127 0.992188
629 | 256 252 0.984375
630 | 512 505 0.986328
631 | 1024 1004 0.980469
632 | 2048 2002 0.977539
633 | 4096 3969 0.968994
634 | 8192 7823 0.954956
635 | 16384 15569 0.950256
636 | 32768 30794 0.939758
637 | 65536 60736 0.926758
638 | 131072 123689 0.943672
639 | 262144 242962 0.926826
640 | 524288 484143 0.923429
641 | 1048576 974607 0.929458
642 | 2097152 1896309 0.904231
643 | 4194304 3804515 0.907067
644 | 8388608 7433079 0.886092
645 | 16777216 14724694 0.87766
646 | 33554432 30002024 0.89413
647 | 67108864 59310882 0.883801
648 | 134217728 119360263 0.889303
649 | 268435456 236928235 0.882626
650 |
651 | 16 15 0.9375
652 | 32 31 0.96875
653 | 64 63 0.984375
654 | 128 127 0.992188
655 | 256 255 0.996094
656 | 512 503 0.982422
657 | 1024 994 0.970703
658 | 2048 2009 0.980957
659 | 4096 3943 0.962646
660 | 8192 7857 0.959106
661 | 16384 15675 0.956726
662 | 32768 31309 0.955475
663 | 65536 61963 0.94548
664 | 131072 122880 0.9375
665 | 262144 245200 0.935364
666 | 524288 480684 0.916832
667 | 1048576 959068 0.914639
668 | 2097152 1914301 0.91281
669 | 4194304 3812449 0.908959
670 | 8388608 7644077 0.911245
671 | 16777216 14781194 0.881028
672 | 33554432 29792499 0.887886
673 | 67108864 59445234 0.885803
674 | 134217728 117754984 0.877343
675 | 268435456 227647654 0.848054
676 |
677 | 16 15 0.9375
678 | 32 31 0.96875
679 | 64 63 0.984375
680 | 128 127 0.992188
681 | 256 251 0.980469
682 | 512 509 0.994141
683 | 1024 999 0.975586
684 | 2048 1976 0.964844
685 | 4096 3933 0.960205
686 | 8192 7792 0.951172
687 | 16384 15224 0.929199
688 | 32768 30277 0.923981
689 | 65536 61200 0.933838
690 | 131072 120259 0.917503
691 | 262144 234167 0.893276
692 | 524288 478920 0.913467
693 | 1048576 966945 0.922151
694 | 2097152 1933486 0.921958
695 | 4194304 3757460 0.895848
696 | 8388608 7645078 0.911364
697 | 16777216 15116128 0.900991
698 | 33554432 29131279 0.86818
699 | 67108864 58129091 0.866191
700 | 134217728 116615339 0.868852
701 | 268435456 231625788 0.862873
702 |
703 | 16 15 0.9375
704 | 32 31 0.96875
705 | 64 63 0.984375
706 | 128 127 0.992188
707 | 256 254 0.992188
708 | 512 491 0.958984
709 | 1024 1000 0.976562
710 | 2048 1987 0.970215
711 | 4096 3932 0.959961
712 | 8192 7839 0.956909
713 | 16384 15805 0.964661
714 | 32768 30732 0.937866
715 | 65536 60867 0.928757
716 | 131072 121753 0.928902
717 | 262144 241398 0.92086
718 | 524288 485274 0.925587
719 | 1048576 941563 0.897944
720 | 2097152 1897194 0.904653
721 | 4194304 3816337 0.909886
722 | 8388608 7462638 0.889616
723 | 16777216 14769047 0.880304
724 | 33554432 29839876 0.889298
725 | 67108864 58099008 0.865743
726 | 134217728 119043320 0.886942
727 | 268435456 235752838 0.878248
728 |
729 | 16 15 0.9375
730 | 32 31 0.96875
731 | 64 63 0.984375
732 | 128 127 0.992188
733 | 256 254 0.992188
734 | 512 509 0.994141
735 | 1024 1000 0.976562
736 | 2048 1946 0.950195
737 | 4096 3934 0.960449
738 | 8192 7930 0.968018
739 | 16384 15601 0.952209
740 | 32768 31513 0.9617
741 | 65536 60809 0.927872
742 | 131072 122669 0.93589
743 | 262144 245420 0.936203
744 | 524288 486234 0.927418
745 | 1048576 954354 0.910143
746 | 2097152 1931587 0.921052
747 | 4194304 3821284 0.911065
748 | 8388608 7411083 0.88347
749 | 16777216 15037562 0.896309
750 | 33554432 30068631 0.896115
751 | 67108864 57797441 0.861249
752 | 134217728 117816483 0.877801
753 | 268435456 229906679 0.856469
754 |
755 | 16 15 0.9375
756 | 32 31 0.96875
757 | 64 63 0.984375
758 | 128 126 0.984375
759 | 256 253 0.988281
760 | 512 507 0.990234
761 | 1024 1010 0.986328
762 | 2048 1987 0.970215
763 | 4096 3931 0.959717
764 | 8192 7990 0.975342
765 | 16384 15716 0.959229
766 | 32768 31022 0.946716
767 | 65536 61813 0.943192
768 | 131072 120682 0.920731
769 | 262144 244354 0.932137
770 | 524288 481497 0.918383
771 | 1048576 972324 0.92728
772 | 2097152 1909518 0.910529
773 | 4194304 3818956 0.91051
774 | 8388608 7574108 0.902904
775 | 16777216 14846127 0.884898
776 | 33554432 30322397 0.903678
777 | 67108864 57795396 0.861219
778 | 134217728 118008330 0.879231
779 | 268435456 236006806 0.879194
780 |
781 | 16 15 0.9375
782 | 32 31 0.96875
783 | 64 63 0.984375
784 | 128 127 0.992188
785 | 256 249 0.972656
786 | 512 501 0.978516
787 | 1024 1008 0.984375
788 | 2048 1976 0.964844
789 | 4096 3965 0.968018
790 | 8192 7895 0.963745
791 | 16384 15421 0.941223
792 | 32768 30629 0.934723
793 | 65536 61753 0.942276
794 | 131072 121996 0.930756
795 | 262144 242861 0.926441
796 | 524288 483298 0.921818
797 | 1048576 956091 0.911799
798 | 2097152 1916449 0.913834
799 | 4194304 3788103 0.903154
800 | 8388608 7535875 0.898346
801 | 16777216 14968653 0.892201
802 | 33554432 29800785 0.888133
803 | 67108864 59269615 0.883186
804 | 134217728 116444202 0.867577
805 | 268435456 232891401 0.867588
806 |
807 | 16 15 0.9375
808 | 32 31 0.96875
809 | 64 63 0.984375
810 | 128 127 0.992188
811 | 256 252 0.984375
812 | 512 502 0.980469
813 | 1024 1004 0.980469
814 | 2048 1963 0.958496
815 | 4096 3983 0.972412
816 | 8192 7682 0.937744
817 | 16384 15700 0.958252
818 | 32768 30945 0.944366
819 | 65536 60548 0.923889
820 | 131072 119650 0.912857
821 | 262144 240560 0.917664
822 | 524288 478564 0.912788
823 | 1048576 972638 0.92758
824 | 2097152 1908869 0.91022
825 | 4194304 3813550 0.909221
826 | 8388608 7597886 0.905739
827 | 16777216 15056156 0.897417
828 | 33554432 29407448 0.87641
829 | 67108864 59557640 0.887478
830 | 134217728 118896437 0.885847
831 | 268435456 236366271 0.880533
832 |
833 | 16 15 0.9375
834 | 32 31 0.96875
835 | 64 63 0.984375
836 | 128 127 0.992188
837 | 256 254 0.992188
838 | 512 506 0.988281
839 | 1024 1010 0.986328
840 | 2048 1995 0.974121
841 | 4096 3960 0.966797
842 | 8192 7966 0.972412
843 | 16384 15208 0.928223
844 | 32768 31019 0.946625
845 | 65536 61931 0.944992
846 | 131072 123891 0.945213
847 | 262144 243711 0.929684
848 | 524288 486918 0.928722
849 | 1048576 959408 0.914963
850 | 2097152 1915762 0.913507
851 | 4194304 3743907 0.892617
852 | 8388608 7638454 0.910575
853 | 16777216 14807155 0.882575
854 | 33554432 29568807 0.881219
855 | 67108864 58392643 0.870118
856 | 134217728 120017419 0.894199
857 | 268435456 230136928 0.857327
858 |
859 | 16 15 0.9375
860 | 32 31 0.96875
861 | 64 63 0.984375
862 | 128 127 0.992188
863 | 256 254 0.992188
864 | 512 510 0.996094
865 | 1024 1007 0.983398
866 | 2048 1954 0.954102
867 | 4096 3880 0.947266
868 | 8192 7797 0.951782
869 | 16384 15634 0.954224
870 | 32768 31134 0.950134
871 | 65536 60127 0.917465
872 | 131072 118918 0.907272
873 | 262144 240784 0.918518
874 | 524288 481011 0.917456
875 | 1048576 974421 0.92928
876 | 2097152 1894942 0.903579
877 | 4194304 3835618 0.914483
878 | 8388608 7526167 0.897189
879 | 16777216 14524247 0.865713
880 | 33554432 29769626 0.887204
881 | 67108864 59209817 0.882295
882 | 134217728 117608435 0.876251
883 | 268435456 231954074 0.864096
884 |
885 | 16 15 0.9375
886 | 32 31 0.96875
887 | 64 63 0.984375
888 | 128 127 0.992188
889 | 256 254 0.992188
890 | 512 500 0.976562
891 | 1024 994 0.970703
892 | 2048 1962 0.958008
893 | 4096 3946 0.963379
894 | 8192 7931 0.96814
895 | 16384 15577 0.950745
896 | 32768 31281 0.95462
897 | 65536 62137 0.948135
898 | 131072 122135 0.931816
899 | 262144 246008 0.938446
900 | 524288 483459 0.922125
901 | 1048576 957621 0.913259
902 | 2097152 1892991 0.902648
903 | 4194304 3829342 0.912986
904 | 8388608 7607515 0.906886
905 | 16777216 14827366 0.88378
906 | 33554432 29491345 0.878911
907 | 67108864 58553594 0.872517
908 | 134217728 116737139 0.869759
909 | 268435456 234795793 0.874682
910 |
911 | 16 15 0.9375
912 | 32 31 0.96875
913 | 64 63 0.984375
914 | 128 127 0.992188
915 | 256 253 0.988281
916 | 512 507 0.990234
917 | 1024 986 0.962891
918 | 2048 1995 0.974121
919 | 4096 3816 0.931641
920 | 8192 7823 0.954956
921 | 16384 15194 0.927368
922 | 32768 30383 0.927216
923 | 65536 61777 0.942642
924 | 131072 123127 0.939384
925 | 262144 243555 0.929089
926 | 524288 486188 0.92733
927 | 1048576 953961 0.909768
928 | 2097152 1925785 0.918286
929 | 4194304 3835419 0.914435
930 | 8388608 7516491 0.896036
931 | 16777216 15033975 0.896095
932 | 33554432 30001706 0.894121
933 | 67108864 58905957 0.877767
934 | 134217728 118944415 0.886205
935 | 268435456 229169365 0.853722
936 |
937 | 16 15 0.9375
938 | 32 31 0.96875
939 | 64 63 0.984375
940 | 128 127 0.992188
941 | 256 249 0.972656
942 | 512 506 0.988281
943 | 1024 1001 0.977539
944 | 2048 2003 0.978027
945 | 4096 3954 0.965332
946 | 8192 7900 0.964355
947 | 16384 15474 0.944458
948 | 32768 31219 0.952728
949 | 65536 61821 0.943314
950 | 131072 123541 0.942543
951 | 262144 243157 0.92757
952 | 524288 483154 0.921543
953 | 1048576 959148 0.914715
954 | 2097152 1900881 0.906411
955 | 4194304 3720402 0.887013
956 | 8388608 7505693 0.894748
957 | 16777216 14967163 0.892112
958 | 33554432 30074617 0.896293
959 | 67108864 59421065 0.885443
960 | 134217728 116671512 0.869271
961 | 268435456 238168882 0.887248
962 |
963 | 16 15 0.9375
964 | 32 31 0.96875
965 | 64 63 0.984375
966 | 128 127 0.992188
967 | 256 253 0.988281
968 | 512 504 0.984375
969 | 1024 1003 0.979492
970 | 2048 2008 0.980469
971 | 4096 3959 0.966553
972 | 8192 7826 0.955322
973 | 16384 15618 0.953247
974 | 32768 31032 0.947021
975 | 65536 61302 0.935394
976 | 131072 121999 0.930779
977 | 262144 240867 0.918835
978 | 524288 489075 0.932837
979 | 1048576 959587 0.915133
980 | 2097152 1924464 0.917656
981 | 4194304 3814310 0.909402
982 | 8388608 7653196 0.912332
983 | 16777216 14262236 0.850096
984 | 33554432 29759504 0.886902
985 | 67108864 59436990 0.88568
986 | 134217728 118091695 0.879852
987 | 268435456 234295241 0.872818
988 |
989 | 16 15 0.9375
990 | 32 31 0.96875
991 | 64 63 0.984375
992 | 128 126 0.984375
993 | 256 249 0.972656
994 | 512 506 0.988281
995 | 1024 1006 0.982422
996 | 2048 1942 0.948242
997 | 4096 3933 0.960205
998 | 8192 7637 0.932251
999 | 16384 15737 0.96051
1000 | 32768 30921 0.943634
1001 | 65536 62024 0.946411
1002 | 131072 122296 0.933044
1003 | 262144 244661 0.933308
1004 | 524288 476185 0.908251
1005 | 1048576 956344 0.912041
1006 | 2097152 1897311 0.904708
1007 | 4194304 3809005 0.908138
1008 | 8388608 7521706 0.896657
1009 | 16777216 15119492 0.901192
1010 | 33554432 29611106 0.88248
1011 | 67108864 59618229 0.888381
1012 | 134217728 117174061 0.873015
1013 | 268435456 236807760 0.882178
1014 |
1015 | 16 15 0.9375
1016 | 32 31 0.96875
1017 | 64 63 0.984375
1018 | 128 123 0.960938
1019 | 256 251 0.980469
1020 | 512 511 0.998047
1021 | 1024 1006 0.982422
1022 | 2048 1982 0.967773
1023 | 4096 3949 0.964111
1024 | 8192 7857 0.959106
1025 | 16384 15670 0.956421
1026 | 32768 30587 0.933441
1027 | 65536 62041 0.946671
1028 | 131072 123239 0.940239
1029 | 262144 244498 0.932686
1030 | 524288 484583 0.924269
1031 | 1048576 967780 0.922947
1032 | 2097152 1925517 0.918158
1033 | 4194304 3743770 0.892584
1034 | 8388608 7610633 0.907258
1035 | 16777216 14841994 0.884652
1036 | 33554432 29575644 0.881423
1037 | 67108864 59188166 0.881972
1038 | 134217728 116837438 0.870507
1039 | 268435456 236883152 0.882459
1040 |
1041 | 16 15 0.9375
1042 | 32 31 0.96875
1043 | 64 63 0.984375
1044 | 128 127 0.992188
1045 | 256 255 0.996094
1046 | 512 495 0.966797
1047 | 1024 993 0.969727
1048 | 2048 1992 0.972656
1049 | 4096 3845 0.938721
1050 | 8192 7896 0.963867
1051 | 16384 15701 0.958313
1052 | 32768 31135 0.950165
1053 | 65536 60177 0.918228
1054 | 131072 120967 0.922905
1055 | 262144 241655 0.921841
1056 | 524288 474160 0.904388
1057 | 1048576 936151 0.892783
1058 | 2097152 1921972 0.916468
1059 | 4194304 3835653 0.914491
1060 | 8388608 7589303 0.904715
1061 | 16777216 14895301 0.887829
1062 | 33554432 29916298 0.891575
1063 | 67108864 59461754 0.886049
1064 | 134217728 119259766 0.888554
1065 | 268435456 234642787 0.874112
1066 |
1067 | 16 15 0.9375
1068 | 32 31 0.96875
1069 | 64 63 0.984375
1070 | 128 127 0.992188
1071 | 256 255 0.996094
1072 | 512 503 0.982422
1073 | 1024 1000 0.976562
1074 | 2048 1966 0.959961
1075 | 4096 4022 0.981934
1076 | 8192 7867 0.960327
1077 | 16384 15797 0.964172
1078 | 32768 31612 0.964722
1079 | 65536 61844 0.943665
1080 | 131072 123354 0.941116
1081 | 262144 235347 0.897778
1082 | 524288 483315 0.92185
1083 | 1048576 960009 0.915536
1084 | 2097152 1922145 0.91655
1085 | 4194304 3805184 0.907227
1086 | 8388608 7354580 0.876734
1087 | 16777216 14784591 0.88123
1088 | 33554432 29864255 0.890024
1089 | 67108864 60282088 0.898273
1090 | 134217728 117735941 0.877201
1091 | 268435456 235406773 0.876959
1092 |
1093 | 16 15 0.9375
1094 | 32 31 0.96875
1095 | 64 63 0.984375
1096 | 128 127 0.992188
1097 | 256 255 0.996094
1098 | 512 506 0.988281
1099 | 1024 989 0.96582
1100 | 2048 1982 0.967773
1101 | 4096 3835 0.936279
1102 | 8192 7960 0.97168
1103 | 16384 15692 0.957764
1104 | 32768 31045 0.947418
1105 | 65536 61185 0.933609
1106 | 131072 123180 0.939789
1107 | 262144 244954 0.934425
1108 | 524288 483020 0.921288
1109 | 1048576 958302 0.913908
1110 | 2097152 1924763 0.917799
1111 | 4194304 3819106 0.910546
1112 | 8388608 7517953 0.89621
1113 | 16777216 14981662 0.892977
1114 | 33554432 29882137 0.890557
1115 | 67108864 57742482 0.86043
1116 | 134217728 114705568 0.854623
1117 | 268435456 235534224 0.877433
1118 |
1119 | 16 15 0.9375
1120 | 32 31 0.96875
1121 | 64 63 0.984375
1122 | 128 127 0.992188
1123 | 256 250 0.976562
1124 | 512 500 0.976562
1125 | 1024 1008 0.984375
1126 | 2048 2012 0.982422
1127 | 4096 3986 0.973145
1128 | 8192 7731 0.943726
1129 | 16384 15673 0.956604
1130 | 32768 31493 0.96109
1131 | 65536 61735 0.942001
1132 | 131072 123801 0.944527
1133 | 262144 242819 0.926281
1134 | 524288 489339 0.93334
1135 | 1048576 966357 0.92159
1136 | 2097152 1905520 0.908623
1137 | 4194304 3686980 0.879045
1138 | 8388608 7373063 0.878938
1139 | 16777216 14881555 0.88701
1140 | 33554432 29946082 0.892463
1141 | 67108864 58993584 0.879073
1142 | 134217728 119674681 0.891646
1143 | 268435456 237916743 0.886309
1144 |
1145 | 16 15 0.9375
1146 | 32 31 0.96875
1147 | 64 63 0.984375
1148 | 128 127 0.992188
1149 | 256 251 0.980469
1150 | 512 503 0.982422
1151 | 1024 1002 0.978516
1152 | 2048 2006 0.979492
1153 | 4096 3986 0.973145
1154 | 8192 7741 0.944946
1155 | 16384 15524 0.94751
1156 | 32768 30480 0.930176
1157 | 65536 62178 0.948761
1158 | 131072 123040 0.938721
1159 | 262144 244305 0.93195
1160 | 524288 477049 0.909899
1161 | 1048576 956317 0.912015
1162 | 2097152 1922185 0.916569
1163 | 4194304 3795613 0.904945
1164 | 8388608 7521540 0.896637
1165 | 16777216 14858674 0.885646
1166 | 33554432 30013312 0.894466
1167 | 67108864 57938022 0.863344
1168 | 134217728 117568402 0.875953
1169 | 268435456 232957660 0.867835
1170 |
1171 | 16 15 0.9375
1172 | 32 31 0.96875
1173 | 64 63 0.984375
1174 | 128 127 0.992188
1175 | 256 252 0.984375
1176 | 512 505 0.986328
1177 | 1024 1001 0.977539
1178 | 2048 2019 0.98584
1179 | 4096 3881 0.94751
1180 | 8192 7930 0.968018
1181 | 16384 15488 0.945312
1182 | 32768 30765 0.938873
1183 | 65536 61852 0.943787
1184 | 131072 119696 0.913208
1185 | 262144 238780 0.910873
1186 | 524288 485113 0.92528
1187 | 1048576 962807 0.918204
1188 | 2097152 1856053 0.885035
1189 | 4194304 3771340 0.899158
1190 | 8388608 7586280 0.904355
1191 | 16777216 14882139 0.887045
1192 | 33554432 30074151 0.89628
1193 | 67108864 59847988 0.891805
1194 | 134217728 118675448 0.884201
1195 | 268435456 237188650 0.883597
1196 |
1197 | 16 15 0.9375
1198 | 32 31 0.96875
1199 | 64 63 0.984375
1200 | 128 127 0.992188
1201 | 256 253 0.988281
1202 | 512 504 0.984375
1203 | 1024 1003 0.979492
1204 | 2048 2013 0.98291
1205 | 4096 3803 0.928467
1206 | 8192 7845 0.957642
1207 | 16384 15748 0.961182
1208 | 32768 31206 0.952332
1209 | 65536 61896 0.944458
1210 | 131072 119841 0.914314
1211 | 262144 239480 0.913544
1212 | 524288 487044 0.928963
1213 | 1048576 935610 0.892267
1214 | 2097152 1899509 0.905756
1215 | 4194304 3791428 0.903947
1216 | 8388608 7451060 0.888236
1217 | 16777216 14775121 0.880666
1218 | 33554432 29933760 0.892096
1219 | 67108864 59144546 0.881322
1220 | 134217728 117453601 0.875098
1221 | 268435456 235912072 0.878841
1222 |
1223 | 16 15 0.9375
1224 | 32 31 0.96875
1225 | 64 63 0.984375
1226 | 128 127 0.992188
1227 | 256 254 0.992188
1228 | 512 502 0.980469
1229 | 1024 1000 0.976562
1230 | 2048 1966 0.959961
1231 | 4096 3764 0.918945
1232 | 8192 7943 0.969604
1233 | 16384 15712 0.958984
1234 | 32768 30974 0.945251
1235 | 65536 62051 0.946823
1236 | 131072 121905 0.930061
1237 | 262144 244971 0.93449
1238 | 524288 483603 0.9224
1239 | 1048576 969353 0.924447
1240 | 2097152 1906569 0.909123
1241 | 4194304 3740028 0.891692
1242 | 8388608 7363451 0.877792
1243 | 16777216 14738941 0.878509
1244 | 33554432 29986252 0.89366
1245 | 67108864 58942406 0.87831
1246 | 134217728 119481201 0.890204
1247 | 268435456 236670359 0.881666
1248 |
1249 | 16 15 0.9375
1250 | 32 31 0.96875
1251 | 64 63 0.984375
1252 | 128 126 0.984375
1253 | 256 252 0.984375
1254 | 512 495 0.966797
1255 | 1024 1001 0.977539
1256 | 2048 2013 0.98291
1257 | 4096 3999 0.976318
1258 | 8192 7789 0.950806
1259 | 16384 15585 0.951233
1260 | 32768 31081 0.948517
1261 | 65536 61577 0.93959
1262 | 131072 123401 0.941475
1263 | 262144 242494 0.925041
1264 | 524288 471875 0.90003
1265 | 1048576 957310 0.912962
1266 | 2097152 1896200 0.904179
1267 | 4194304 3852666 0.918547
1268 | 8388608 7623387 0.908779
1269 | 16777216 15154791 0.903296
1270 | 33554432 30147272 0.898459
1271 | 67108864 59566734 0.887614
1272 | 134217728 118240112 0.880957
1273 | 268435456 232358895 0.865604
1274 |
1275 | 16 15 0.9375
1276 | 32 31 0.96875
1277 | 64 63 0.984375
1278 | 128 127 0.992188
1279 | 256 254 0.992188
1280 | 512 506 0.988281
1281 | 1024 974 0.951172
1282 | 2048 1914 0.93457
1283 | 4096 3931 0.959717
1284 | 8192 7811 0.953491
1285 | 16384 15507 0.946472
1286 | 32768 30815 0.940399
1287 | 65536 60893 0.929153
1288 | 131072 116735 0.890617
1289 | 262144 238905 0.91135
1290 | 524288 483732 0.922646
1291 | 1048576 969420 0.924511
1292 | 2097152 1910536 0.911015
1293 | 4194304 3800755 0.906171
1294 | 8388608 7600362 0.906034
1295 | 16777216 14882938 0.887092
1296 | 33554432 30267734 0.902049
1297 | 67108864 59955558 0.893407
1298 | 134217728 117795395 0.877644
1299 | 268435456 235158638 0.876034
1300 |
1301 | 16 15 0.9375
1302 | 32 31 0.96875
1303 | 64 63 0.984375
1304 | 128 127 0.992188
1305 | 256 252 0.984375
1306 | 512 497 0.970703
1307 | 1024 993 0.969727
1308 | 2048 1973 0.963379
1309 | 4096 4007 0.978271
1310 | 8192 7846 0.957764
1311 | 16384 15775 0.96283
1312 | 32768 31117 0.949615
1313 | 65536 62052 0.946838
1314 | 131072 120844 0.921967
1315 | 262144 241160 0.919952
1316 | 524288 473644 0.903404
1317 | 1048576 965946 0.921198
1318 | 2097152 1832516 0.873812
1319 | 4194304 3692721 0.880413
1320 | 8388608 7603158 0.906367
1321 | 16777216 15071458 0.898329
1322 | 33554432 29665711 0.884107
1323 | 67108864 60085477 0.895343
1324 | 134217728 117690314 0.876861
1325 | 268435456 237120757 0.883344
1326 |
1327 | 16 15 0.9375
1328 | 32 31 0.96875
1329 | 64 63 0.984375
1330 | 128 127 0.992188
1331 | 256 253 0.988281
1332 | 512 506 0.988281
1333 | 1024 989 0.96582
1334 | 2048 1970 0.961914
1335 | 4096 3953 0.965088
1336 | 8192 7816 0.954102
1337 | 16384 15628 0.953857
1338 | 32768 30605 0.93399
1339 | 65536 60389 0.921463
1340 | 131072 123981 0.9459
1341 | 262144 246634 0.940834
1342 | 524288 477325 0.910425
1343 | 1048576 967283 0.922473
1344 | 2097152 1861311 0.887542
1345 | 4194304 3765756 0.897826
1346 | 8388608 7611239 0.90733
1347 | 16777216 14940914 0.890548
1348 | 33554432 29433185 0.877177
1349 | 67108864 57622475 0.858642
1350 | 134217728 118069541 0.879687
1351 | 268435456 232272798 0.865284
1352 |
1353 | 16 15 0.9375
1354 | 32 31 0.96875
1355 | 64 63 0.984375
1356 | 128 127 0.992188
1357 | 256 254 0.992188
1358 | 512 502 0.980469
1359 | 1024 1008 0.984375
1360 | 2048 1982 0.967773
1361 | 4096 3980 0.97168
1362 | 8192 7854 0.95874
1363 | 16384 15705 0.958557
1364 | 32768 31418 0.958801
1365 | 65536 60995 0.93071
1366 | 131072 123335 0.940971
1367 | 262144 244461 0.932545
1368 | 524288 488312 0.931381
1369 | 1048576 954473 0.910256
1370 | 2097152 1907332 0.909487
1371 | 4194304 3800375 0.90608
1372 | 8388608 7537153 0.898499
1373 | 16777216 14947484 0.890939
1374 | 33554432 30018572 0.894623
1375 | 67108864 59445563 0.885808
1376 | 134217728 118505257 0.882933
1377 | 268435456 230610987 0.859093
1378 |
1379 | 16 15 0.9375
1380 | 32 31 0.96875
1381 | 64 63 0.984375
1382 | 128 127 0.992188
1383 | 256 249 0.972656
1384 | 512 507 0.990234
1385 | 1024 999 0.975586
1386 | 2048 2007 0.97998
1387 | 4096 3982 0.972168
1388 | 8192 7953 0.970825
1389 | 16384 15519 0.947205
1390 | 32768 30758 0.93866
1391 | 65536 61900 0.944519
1392 | 131072 116558 0.889267
1393 | 262144 238580 0.91011
1394 | 524288 485045 0.92515
1395 | 1048576 964668 0.919979
1396 | 2097152 1901603 0.906755
1397 | 4194304 3837683 0.914975
1398 | 8388608 7605335 0.906627
1399 | 16777216 14921402 0.889385
1400 | 33554432 29692428 0.884903
1401 | 67108864 60210427 0.897205
1402 | 134217728 118585675 0.883532
1403 | 268435456 231890754 0.86386
1404 |
1405 | 16 15 0.9375
1406 | 32 31 0.96875
1407 | 64 63 0.984375
1408 | 128 125 0.976562
1409 | 256 255 0.996094
1410 | 512 505 0.986328
1411 | 1024 997 0.973633
1412 | 2048 1990 0.97168
1413 | 4096 3939 0.96167
1414 | 8192 7835 0.956421
1415 | 16384 15802 0.964478
1416 | 32768 31055 0.947723
1417 | 65536 61146 0.933014
1418 | 131072 116762 0.890823
1419 | 262144 245052 0.934799
1420 | 524288 489838 0.934292
1421 | 1048576 962445 0.917859
1422 | 2097152 1930883 0.920717
1423 | 4194304 3809994 0.908373
1424 | 8388608 7598609 0.905825
1425 | 16777216 14774128 0.880607
1426 | 33554432 29683894 0.884649
1427 | 67108864 59704503 0.889666
1428 | 134217728 116832191 0.870468
1429 | 268435456 236691740 0.881745
1430 |
1431 | 16 15 0.9375
1432 | 32 31 0.96875
1433 | 64 63 0.984375
1434 | 128 127 0.992188
1435 | 256 251 0.980469
1436 | 512 505 0.986328
1437 | 1024 1007 0.983398
1438 | 2048 1984 0.96875
1439 | 4096 3950 0.964355
1440 | 8192 7805 0.952759
1441 | 16384 15602 0.952271
1442 | 32768 31486 0.960876
1443 | 65536 61385 0.936661
1444 | 131072 121729 0.928719
1445 | 262144 240426 0.917152
1446 | 524288 487895 0.930586
1447 | 1048576 956561 0.912248
1448 | 2097152 1886364 0.899488
1449 | 4194304 3849556 0.917806
1450 | 8388608 7425731 0.885216
1451 | 16777216 15054163 0.897298
1452 | 33554432 29731914 0.88608
1453 | 67108864 58603407 0.873259
1454 | 134217728 118311328 0.881488
1455 | 268435456 233574557 0.870133
1456 |
1457 | 16 15 0.9375
1458 | 32 31 0.96875
1459 | 64 63 0.984375
1460 | 128 127 0.992188
1461 | 256 253 0.988281
1462 | 512 500 0.976562
1463 | 1024 1016 0.992188
1464 | 2048 2019 0.98584
1465 | 4096 3922 0.95752
1466 | 8192 7925 0.967407
1467 | 16384 15446 0.942749
1468 | 32768 30897 0.942902
1469 | 65536 60954 0.930084
1470 | 131072 123254 0.940353
1471 | 262144 245765 0.937519
1472 | 524288 488831 0.932371
1473 | 1048576 954967 0.910728
1474 | 2097152 1921167 0.916084
1475 | 4194304 3818589 0.910423
1476 | 8388608 7540236 0.898866
1477 | 16777216 15160453 0.903633
1478 | 33554432 30164807 0.898981
1479 | 67108864 59788568 0.890919
1480 | 134217728 120029871 0.894292
1481 | 268435456 232830834 0.867362
1482 |
1483 | 16 15 0.9375
1484 | 32 31 0.96875
1485 | 64 63 0.984375
1486 | 128 127 0.992188
1487 | 256 251 0.980469
1488 | 512 500 0.976562
1489 | 1024 1002 0.978516
1490 | 2048 1950 0.952148
1491 | 4096 3950 0.964355
1492 | 8192 7878 0.96167
1493 | 16384 15630 0.953979
1494 | 32768 31265 0.954132
1495 | 65536 61983 0.945786
1496 | 131072 122540 0.934906
1497 | 262144 242823 0.926296
1498 | 524288 484725 0.92454
1499 | 1048576 954983 0.910743
1500 | 2097152 1902443 0.907156
1501 | 4194304 3867036 0.921973
1502 | 8388608 7647280 0.911627
1503 | 16777216 14772545 0.880512
1504 | 33554432 30063417 0.89596
1505 | 67108864 59072710 0.880252
1506 | 134217728 118843538 0.885453
1507 | 268435456 233205962 0.86876
1508 |
1509 | 16 15 0.9375
1510 | 32 31 0.96875
1511 | 64 63 0.984375
1512 | 128 127 0.992188
1513 | 256 255 0.996094
1514 | 512 505 0.986328
1515 | 1024 994 0.970703
1516 | 2048 2020 0.986328
1517 | 4096 3980 0.97168
1518 | 8192 7883 0.96228
1519 | 16384 15614 0.953003
1520 | 32768 31229 0.953033
1521 | 65536 61204 0.933899
1522 | 131072 122195 0.932274
1523 | 262144 242806 0.926231
1524 | 524288 486234 0.927418
1525 | 1048576 940756 0.897175
1526 | 2097152 1929333 0.919978
1527 | 4194304 3722006 0.887395
1528 | 8388608 7551811 0.900246
1529 | 16777216 15048477 0.896959
1530 | 33554432 29408777 0.87645
1531 | 67108864 59806239 0.891182
1532 | 134217728 119369382 0.889371
1533 | 268435456 234276269 0.872747
1534 |
1535 | 16 15 0.9375
1536 | 32 31 0.96875
1537 | 64 63 0.984375
1538 | 128 127 0.992188
1539 | 256 253 0.988281
1540 | 512 505 0.986328
1541 | 1024 1001 0.977539
1542 | 2048 2003 0.978027
1543 | 4096 3953 0.965088
1544 | 8192 7865 0.960083
1545 | 16384 15636 0.954346
1546 | 32768 31109 0.949371
1547 | 65536 61937 0.945084
1548 | 131072 121019 0.923302
1549 | 262144 239966 0.915398
1550 | 524288 476479 0.908812
1551 | 1048576 948406 0.90447
1552 | 2097152 1915848 0.913548
1553 | 4194304 3783774 0.902122
1554 | 8388608 7504488 0.894605
1555 | 16777216 15043316 0.896652
1556 | 33554432 29699021 0.8851
1557 | 67108864 59545290 0.887294
1558 | 134217728 117994225 0.879125
1559 | 268435456 236729291 0.881885
1560 |
1561 | 16 15 0.9375
1562 | 32 31 0.96875
1563 | 64 63 0.984375
1564 | 128 127 0.992188
1565 | 256 255 0.996094
1566 | 512 496 0.96875
1567 | 1024 1002 0.978516
1568 | 2048 2014 0.983398
1569 | 4096 3968 0.96875
1570 | 8192 7824 0.955078
1571 | 16384 15774 0.962769
1572 | 32768 31057 0.947784
1573 | 65536 61679 0.941147
1574 | 131072 121373 0.926003
1575 | 262144 244679 0.933376
1576 | 524288 476176 0.908234
1577 | 1048576 953160 0.909004
1578 | 2097152 1910268 0.910887
1579 | 4194304 3846129 0.916989
1580 | 8388608 7638530 0.910584
1581 | 16777216 15174281 0.904458
1582 | 33554432 30172350 0.899206
1583 | 67108864 59753619 0.890398
1584 | 134217728 118450592 0.882526
1585 | 268435456 235631193 0.877795
1586 |
1587 | 16 15 0.9375
1588 | 32 31 0.96875
1589 | 64 63 0.984375
1590 | 128 126 0.984375
1591 | 256 255 0.996094
1592 | 512 498 0.972656
1593 | 1024 1004 0.980469
1594 | 2048 1990 0.97168
1595 | 4096 3995 0.975342
1596 | 8192 7944 0.969727
1597 | 16384 15827 0.966003
1598 | 32768 31239 0.953339
1599 | 65536 60004 0.915588
1600 | 131072 121284 0.925323
1601 | 262144 228511 0.8717
1602 | 524288 475922 0.907749
1603 | 1048576 973312 0.928223
1604 | 2097152 1909763 0.910646
1605 | 4194304 3725182 0.888153
1606 | 8388608 7539719 0.898805
1607 | 16777216 15149764 0.902996
1608 | 33554432 29903156 0.891183
1609 | 67108864 58889442 0.877521
1610 | 134217728 112894385 0.841129
1611 | 268435456 233117951 0.868432
1612 |
1613 | 16 15 0.9375
1614 | 32 31 0.96875
1615 | 64 63 0.984375
1616 | 128 127 0.992188
1617 | 256 255 0.996094
1618 | 512 504 0.984375
1619 | 1024 998 0.974609
1620 | 2048 2002 0.977539
1621 | 4096 3895 0.950928
1622 | 8192 7709 0.94104
1623 | 16384 15609 0.952698
1624 | 32768 30680 0.936279
1625 | 65536 62638 0.95578
1626 | 131072 120394 0.918533
1627 | 262144 243282 0.928047
1628 | 524288 486971 0.928823
1629 | 1048576 968089 0.923242
1630 | 2097152 1892432 0.902382
1631 | 4194304 3647618 0.86966
1632 | 8388608 7556508 0.900806
1633 | 16777216 15042513 0.896604
1634 | 33554432 29936153 0.892167
1635 | 67108864 59396200 0.885072
1636 | 134217728 117432504 0.87494
1637 | 268435456 233591500 0.870196
1638 |
1639 | 16 15 0.9375
1640 | 32 31 0.96875
1641 | 64 63 0.984375
1642 | 128 127 0.992188
1643 | 256 250 0.976562
1644 | 512 504 0.984375
1645 | 1024 1009 0.985352
1646 | 2048 1998 0.975586
1647 | 4096 3940 0.961914
1648 | 8192 7804 0.952637
1649 | 16384 15649 0.955139
1650 | 32768 31081 0.948517
1651 | 65536 61469 0.937943
1652 | 131072 121852 0.929657
1653 | 262144 243895 0.930386
1654 | 524288 477093 0.909983
1655 | 1048576 960956 0.916439
1656 | 2097152 1904095 0.907943
1657 | 4194304 3730686 0.889465
1658 | 8388608 7563797 0.901675
1659 | 16777216 15275546 0.910493
1660 | 33554432 29887427 0.890715
1661 | 67108864 59726855 0.889999
1662 | 134217728 116830208 0.870453
1663 | 268435456 232865813 0.867493
1664 |
1665 | 16 15 0.9375
1666 | 32 31 0.96875
1667 | 64 63 0.984375
1668 | 128 127 0.992188
1669 | 256 254 0.992188
1670 | 512 499 0.974609
1671 | 1024 1010 0.986328
1672 | 2048 1970 0.961914
1673 | 4096 3988 0.973633
1674 | 8192 7717 0.942017
1675 | 16384 15594 0.951782
1676 | 32768 31133 0.950104
1677 | 65536 60626 0.925079
1678 | 131072 121535 0.927238
1679 | 262144 242234 0.924049
1680 | 524288 486588 0.928093
1681 | 1048576 968516 0.923649
1682 | 2097152 1887597 0.900076
1683 | 4194304 3824104 0.911737
1684 | 8388608 7483459 0.892098
1685 | 16777216 15029896 0.895852
1686 | 33554432 29867337 0.890116
1687 | 67108864 58841637 0.876809
1688 | 134217728 117032184 0.871958
1689 | 268435456 230587230 0.859004
1690 |
1691 | 16 15 0.9375
1692 | 32 31 0.96875
1693 | 64 63 0.984375
1694 | 128 127 0.992188
1695 | 256 255 0.996094
1696 | 512 500 0.976562
1697 | 1024 1008 0.984375
1698 | 2048 1991 0.972168
1699 | 4096 3957 0.966064
1700 | 8192 7844 0.95752
1701 | 16384 15391 0.939392
1702 | 32768 30865 0.941925
1703 | 65536 62263 0.950058
1704 | 131072 121963 0.930504
1705 | 262144 241607 0.921658
1706 | 524288 487157 0.929178
1707 | 1048576 923122 0.880358
1708 | 2097152 1875012 0.894075
1709 | 4194304 3805057 0.907196
1710 | 8388608 7599721 0.905957
1711 | 16777216 14875156 0.886628
1712 | 33554432 29874387 0.890326
1713 | 67108864 59402113 0.88516
1714 | 134217728 117759038 0.877373
1715 | 268435456 231931408 0.864012
1716 |
1717 | 16 15 0.9375
1718 | 32 31 0.96875
1719 | 64 63 0.984375
1720 | 128 127 0.992188
1721 | 256 252 0.984375
1722 | 512 502 0.980469
1723 | 1024 1001 0.977539
1724 | 2048 2002 0.977539
1725 | 4096 3878 0.946777
1726 | 8192 7864 0.959961
1727 | 16384 15827 0.966003
1728 | 32768 31113 0.949493
1729 | 65536 61593 0.939835
1730 | 131072 123281 0.940559
1731 | 262144 243194 0.927711
1732 | 524288 489398 0.933453
1733 | 1048576 958073 0.91369
1734 | 2097152 1914779 0.913038
1735 | 4194304 3879894 0.925039
1736 | 8388608 7550102 0.900042
1737 | 16777216 14513449 0.865069
1738 | 33554432 30287882 0.902649
1739 | 67108864 59264193 0.883105
1740 | 134217728 114935972 0.85634
1741 | 268435456 237240153 0.883788
1742 |
1743 | 16 15 0.9375
1744 | 32 31 0.96875
1745 | 64 63 0.984375
1746 | 128 127 0.992188
1747 | 256 255 0.996094
1748 | 512 507 0.990234
1749 | 1024 978 0.955078
1750 | 2048 2011 0.981934
1751 | 4096 3950 0.964355
1752 | 8192 7920 0.966797
1753 | 16384 15846 0.967163
1754 | 32768 30688 0.936523
1755 | 65536 62613 0.955399
1756 | 131072 121781 0.929115
1757 | 262144 233818 0.891945
1758 | 524288 484096 0.92334
1759 | 1048576 964379 0.919703
1760 | 2097152 1934117 0.922259
1761 | 4194304 3787394 0.902985
1762 | 8388608 7500701 0.894153
1763 | 16777216 15246172 0.908743
1764 | 33554432 30163937 0.898955
1765 | 67108864 59064510 0.88013
1766 | 134217728 118376435 0.881973
1767 | 268435456 235739120 0.878197
1768 |
1769 | 16 15 0.9375
1770 | 32 31 0.96875
1771 | 64 63 0.984375
1772 | 128 126 0.984375
1773 | 256 250 0.976562
1774 | 512 495 0.966797
1775 | 1024 1004 0.980469
1776 | 2048 1993 0.973145
1777 | 4096 3954 0.965332
1778 | 8192 7902 0.9646
1779 | 16384 15748 0.961182
1780 | 32768 30900 0.942993
1781 | 65536 60899 0.929245
1782 | 131072 123473 0.942024
1783 | 262144 243740 0.929794
1784 | 524288 487201 0.929262
1785 | 1048576 972511 0.927459
1786 | 2097152 1938647 0.924419
1787 | 4194304 3831718 0.913553
1788 | 8388608 7659170 0.913044
1789 | 16777216 15159648 0.903585
1790 | 33554432 30194567 0.899868
1791 | 67108864 58275097 0.868367
1792 | 134217728 116497014 0.86797
1793 | 268435456 229974089 0.85672
1794 |
1795 | 16 15 0.9375
1796 | 32 31 0.96875
1797 | 64 63 0.984375
1798 | 128 127 0.992188
1799 | 256 253 0.988281
1800 | 512 508 0.992188
1801 | 1024 995 0.97168
1802 | 2048 1995 0.974121
1803 | 4096 3998 0.976074
1804 | 8192 7857 0.959106
1805 | 16384 15564 0.949951
1806 | 32768 30407 0.927948
1807 | 65536 61663 0.940903
1808 | 131072 122189 0.932228
1809 | 262144 245606 0.936913
1810 | 524288 484636 0.92437
1811 | 1048576 955550 0.911283
1812 | 2097152 1923907 0.91739
1813 | 4194304 3804431 0.907047
1814 | 8388608 7523604 0.896883
1815 | 16777216 14965783 0.89203
1816 | 33554432 29475204 0.87843
1817 | 67108864 59233933 0.882654
1818 | 134217728 117851497 0.878062
1819 | 268435456 236591835 0.881373
1820 |
1821 | 16 15 0.9375
1822 | 32 31 0.96875
1823 | 64 63 0.984375
1824 | 128 127 0.992188
1825 | 256 251 0.980469
1826 | 512 509 0.994141
1827 | 1024 988 0.964844
1828 | 2048 1995 0.974121
1829 | 4096 3962 0.967285
1830 | 8192 7841 0.957153
1831 | 16384 15582 0.95105
1832 | 32768 31005 0.946198
1833 | 65536 62360 0.951538
1834 | 131072 120980 0.923004
1835 | 262144 244331 0.932049
1836 | 524288 485118 0.925289
1837 | 1048576 970224 0.925278
1838 | 2097152 1838578 0.876702
1839 | 4194304 3764780 0.897593
1840 | 8388608 7641895 0.910985
1841 | 16777216 14971815 0.89239
1842 | 33554432 29377108 0.875506
1843 | 67108864 58289818 0.868586
1844 | 134217728 118225357 0.880848
1845 | 268435456 234141255 0.872244
1846 |
1847 | 16 15 0.9375
1848 | 32 31 0.96875
1849 | 64 63 0.984375
1850 | 128 127 0.992188
1851 | 256 255 0.996094
1852 | 512 499 0.974609
1853 | 1024 1002 0.978516
1854 | 2048 1966 0.959961
1855 | 4096 3951 0.9646
1856 | 8192 7801 0.952271
1857 | 16384 15821 0.965637
1858 | 32768 31208 0.952393
1859 | 65536 61810 0.943146
1860 | 131072 122065 0.931282
1861 | 262144 243412 0.928543
1862 | 524288 474438 0.904919
1863 | 1048576 969287 0.924384
1864 | 2097152 1922471 0.916706
1865 | 4194304 3795586 0.904938
1866 | 8388608 7539097 0.89873
1867 | 16777216 14783382 0.881158
1868 | 33554432 29875682 0.890365
1869 | 67108864 59582465 0.887848
1870 | 134217728 114996342 0.85679
1871 | 268435456 233811877 0.871017
1872 |
1873 | 16 15 0.9375
1874 | 32 31 0.96875
1875 | 64 63 0.984375
1876 | 128 127 0.992188
1877 | 256 252 0.984375
1878 | 512 502 0.980469
1879 | 1024 1007 0.983398
1880 | 2048 1999 0.976074
1881 | 4096 3992 0.974609
1882 | 8192 7871 0.960815
1883 | 16384 15664 0.956055
1884 | 32768 30836 0.94104
1885 | 65536 61538 0.938995
1886 | 131072 123044 0.938751
1887 | 262144 244548 0.932877
1888 | 524288 484650 0.924397
1889 | 1048576 953152 0.908997
1890 | 2097152 1919897 0.915478
1891 | 4194304 3813159 0.909128
1892 | 8388608 7496864 0.893696
1893 | 16777216 14970281 0.892298
1894 | 33554432 29754396 0.88675
1895 | 67108864 59477643 0.886286
1896 | 134217728 117931189 0.878656
1897 | 268435456 236236068 0.880048
1898 |
1899 | 16 15 0.9375
1900 | 32 31 0.96875
1901 | 64 63 0.984375
1902 | 128 127 0.992188
1903 | 256 253 0.988281
1904 | 512 504 0.984375
1905 | 1024 1012 0.988281
1906 | 2048 2014 0.983398
1907 | 4096 3933 0.960205
1908 | 8192 7954 0.970947
1909 | 16384 15451 0.943054
1910 | 32768 31402 0.958313
1911 | 65536 61337 0.935928
1912 | 131072 122889 0.937569
1913 | 262144 244612 0.933121
1914 | 524288 481068 0.917564
1915 | 1048576 941522 0.897905
1916 | 2097152 1905311 0.908523
1917 | 4194304 3663632 0.873478
1918 | 8388608 7589256 0.90471
1919 | 16777216 15193005 0.905574
1920 | 33554432 29670301 0.884244
1921 | 67108864 59586131 0.887903
1922 | 134217728 118675189 0.884199
1923 | 268435456 231674687 0.863055
1924 |
1925 | 16 15 0.9375
1926 | 32 31 0.96875
1927 | 64 63 0.984375
1928 | 128 127 0.992188
1929 | 256 252 0.984375
1930 | 512 508 0.992188
1931 | 1024 1009 0.985352
1932 | 2048 2006 0.979492
1933 | 4096 3952 0.964844
1934 | 8192 7890 0.963135
1935 | 16384 15755 0.961609
1936 | 32768 31004 0.946167
1937 | 65536 61346 0.936066
1938 | 131072 123762 0.944229
1939 | 262144 240920 0.919037
1940 | 524288 487960 0.93071
1941 | 1048576 973632 0.928528
1942 | 2097152 1827004 0.871183
1943 | 4194304 3825603 0.912095
1944 | 8388608 7549826 0.900009
1945 | 16777216 15023156 0.89545
1946 | 33554432 29403994 0.876307
1947 | 67108864 58761071 0.875608
1948 | 134217728 117670228 0.876712
1949 | 268435456 232225204 0.865106
1950 |
1951 | 16 15 0.9375
1952 | 32 31 0.96875
1953 | 64 63 0.984375
1954 | 128 124 0.96875
1955 | 256 255 0.996094
1956 | 512 507 0.990234
1957 | 1024 989 0.96582
1958 | 2048 1972 0.962891
1959 | 4096 3988 0.973633
1960 | 8192 7721 0.942505
1961 | 16384 15809 0.964905
1962 | 32768 31150 0.950623
1963 | 65536 61368 0.936401
1964 | 131072 122951 0.938042
1965 | 262144 242810 0.926247
1966 | 524288 478741 0.913126
1967 | 1048576 961689 0.917138
1968 | 2097152 1924122 0.917493
1969 | 4194304 3747143 0.893389
1970 | 8388608 7422008 0.884772
1971 | 16777216 15065387 0.897967
1972 | 33554432 29933007 0.892073
1973 | 67108864 59866608 0.892082
1974 | 134217728 118421700 0.88231
1975 | 268435456 235612529 0.877725
1976 |
1977 | 16 15 0.9375
1978 | 32 31 0.96875
1979 | 64 63 0.984375
1980 | 128 127 0.992188
1981 | 256 255 0.996094
1982 | 512 507 0.990234
1983 | 1024 997 0.973633
1984 | 2048 1999 0.976074
1985 | 4096 3941 0.962158
1986 | 8192 7867 0.960327
1987 | 16384 15288 0.933105
1988 | 32768 31026 0.946838
1989 | 65536 61118 0.932587
1990 | 131072 122833 0.937141
1991 | 262144 243483 0.928814
1992 | 524288 487978 0.930744
1993 | 1048576 965749 0.92101
1994 | 2097152 1897615 0.904853
1995 | 4194304 3821624 0.911146
1996 | 8388608 7554445 0.90056
1997 | 16777216 15017987 0.895142
1998 | 33554432 29668971 0.884204
1999 | 67108864 59552549 0.887402
2000 | 134217728 118144929 0.880248
2001 | 268435456 232989987 0.867955
2002 |
2003 | 16 15 0.9375
2004 | 32 31 0.96875
2005 | 64 63 0.984375
2006 | 128 127 0.992188
2007 | 256 255 0.996094
2008 | 512 498 0.972656
2009 | 1024 1018 0.994141
2010 | 2048 1986 0.969727
2011 | 4096 3968 0.96875
2012 | 8192 7826 0.955322
2013 | 16384 15651 0.955261
2014 | 32768 30694 0.936707
2015 | 65536 62238 0.949677
2016 | 131072 123915 0.945396
2017 | 262144 246396 0.939926
2018 | 524288 484651 0.924398
2019 | 1048576 942074 0.898432
2020 | 2097152 1915776 0.913513
2021 | 4194304 3776650 0.900424
2022 | 8388608 7595177 0.905416
2023 | 16777216 15201991 0.906109
2024 | 33554432 30092703 0.896832
2025 | 67108864 59522462 0.886954
2026 | 134217728 117887442 0.87833
2027 | 268435456 234081628 0.872022
2028 |
2029 | 16 15 0.9375
2030 | 32 31 0.96875
2031 | 64 63 0.984375
2032 | 128 127 0.992188
2033 | 256 253 0.988281
2034 | 512 506 0.988281
2035 | 1024 1016 0.992188
2036 | 2048 2002 0.977539
2037 | 4096 4003 0.977295
2038 | 8192 7929 0.967896
2039 | 16384 15408 0.94043
2040 | 32768 31040 0.947266
2041 | 65536 61609 0.940079
2042 | 131072 121936 0.930298
2043 | 262144 243663 0.929501
2044 | 524288 478779 0.913198
2045 | 1048576 964722 0.920031
2046 | 2097152 1870482 0.891915
2047 | 4194304 3842084 0.916024
2048 | 8388608 7337033 0.874642
2049 | 16777216 14951419 0.891174
2050 | 33554432 30034797 0.895107
2051 | 67108864 59498721 0.8866
2052 | 134217728 117254516 0.873614
2053 | 268435456 232538130 0.866272
2054 |
2055 | 16 15 0.9375
2056 | 32 31 0.96875
2057 | 64 63 0.984375
2058 | 128 127 0.992188
2059 | 256 253 0.988281
2060 | 512 505 0.986328
2061 | 1024 996 0.972656
2062 | 2048 1955 0.95459
2063 | 4096 3940 0.961914
2064 | 8192 7870 0.960693
2065 | 16384 15491 0.945496
2066 | 32768 30868 0.942017
2067 | 65536 61238 0.934418
2068 | 131072 123494 0.942184
2069 | 262144 240658 0.918037
2070 | 524288 479962 0.915455
2071 | 1048576 969049 0.924157
2072 | 2097152 1901654 0.906779
2073 | 4194304 3843379 0.916333
2074 | 8388608 7557431 0.900916
2075 | 16777216 14867257 0.886158
2076 | 33554432 29886250 0.89068
2077 | 67108864 59539204 0.887203
2078 | 134217728 120128265 0.895025
2079 | 268435456 234158510 0.872308
2080 |
2081 | 16 15 0.9375
2082 | 32 31 0.96875
2083 | 64 63 0.984375
2084 | 128 127 0.992188
2085 | 256 250 0.976562
2086 | 512 509 0.994141
2087 | 1024 988 0.964844
2088 | 2048 1999 0.976074
2089 | 4096 3964 0.967773
2090 | 8192 7958 0.971436
2091 | 16384 15415 0.940857
2092 | 32768 30993 0.945831
2093 | 65536 61354 0.936188
2094 | 131072 121004 0.923187
2095 | 262144 241240 0.920258
2096 | 524288 474609 0.905245
2097 | 1048576 946229 0.902394
2098 | 2097152 1919194 0.915143
2099 | 4194304 3788019 0.903134
2100 | 8388608 7587308 0.904478
2101 | 16777216 15220271 0.907199
2102 | 33554432 29681538 0.884579
2103 | 67108864 59158417 0.881529
2104 | 134217728 118172710 0.880455
2105 | 268435456 234154133 0.872292
2106 |
2107 | 16 15 0.9375
2108 | 32 31 0.96875
2109 | 64 63 0.984375
2110 | 128 127 0.992188
2111 | 256 255 0.996094
2112 | 512 496 0.96875
2113 | 1024 990 0.966797
2114 | 2048 2012 0.982422
2115 | 4096 3990 0.974121
2116 | 8192 7868 0.960449
2117 | 16384 15720 0.959473
2118 | 32768 31049 0.94754
2119 | 65536 61723 0.941818
2120 | 131072 120401 0.918587
2121 | 262144 246659 0.940929
2122 | 524288 481135 0.917692
2123 | 1048576 967586 0.922762
2124 | 2097152 1924068 0.917467
2125 | 4194304 3758418 0.896077
2126 | 8388608 7577195 0.903272
2127 | 16777216 14997491 0.89392
2128 | 33554432 29329326 0.874082
2129 | 67108864 59644415 0.888771
2130 | 134217728 118341491 0.881713
2131 | 268435456 232282601 0.86532
2132 |
2133 | 16 15 0.9375
2134 | 32 31 0.96875
2135 | 64 63 0.984375
2136 | 128 127 0.992188
2137 | 256 251 0.980469
2138 | 512 498 0.972656
2139 | 1024 1005 0.981445
2140 | 2048 2017 0.984863
2141 | 4096 3951 0.9646
2142 | 8192 7690 0.938721
2143 | 16384 15352 0.937012
2144 | 32768 31126 0.94989
2145 | 65536 61389 0.936722
2146 | 131072 121732 0.928741
2147 | 262144 244353 0.932133
2148 | 524288 486782 0.928463
2149 | 1048576 959203 0.914767
2150 | 2097152 1899916 0.905951
2151 | 4194304 3817997 0.910281
2152 | 8388608 7545650 0.899512
2153 | 16777216 15178029 0.904681
2154 | 33554432 29916725 0.891588
2155 | 67108864 58536934 0.872268
2156 | 134217728 116734735 0.869742
2157 | 268435456 230113613 0.85724
2158 |
2159 | 16 15 0.9375
2160 | 32 31 0.96875
2161 | 64 63 0.984375
2162 | 128 127 0.992188
2163 | 256 251 0.980469
2164 | 512 508 0.992188
2165 | 1024 1005 0.981445
2166 | 2048 2016 0.984375
2167 | 4096 3950 0.964355
2168 | 8192 7919 0.966675
2169 | 16384 15639 0.954529
2170 | 32768 31400 0.958252
2171 | 65536 61749 0.942215
2172 | 131072 123328 0.940918
2173 | 262144 241970 0.923042
2174 | 524288 476102 0.908092
2175 | 1048576 939670 0.896139
2176 | 2097152 1895224 0.903713
2177 | 4194304 3839584 0.915428
2178 | 8388608 7445460 0.887568
2179 | 16777216 15038640 0.896373
2180 | 33554432 29547223 0.880576
2181 | 67108864 59189726 0.881996
2182 | 134217728 118255549 0.881072
2183 | 268435456 232472369 0.866027
2184 |
2185 | 16 15 0.9375
2186 | 32 31 0.96875
2187 | 64 63 0.984375
2188 | 128 127 0.992188
2189 | 256 254 0.992188
2190 | 512 484 0.945312
2191 | 1024 1008 0.984375
2192 | 2048 1999 0.976074
2193 | 4096 3948 0.963867
2194 | 8192 7799 0.952026
2195 | 16384 15188 0.927002
2196 | 32768 30677 0.936188
2197 | 65536 61868 0.944031
2198 | 131072 122493 0.934547
2199 | 262144 237210 0.904884
2200 | 524288 486500 0.927925
2201 | 1048576 964364 0.919689
2202 | 2097152 1910970 0.911222
2203 | 4194304 3785231 0.902469
2204 | 8388608 7523037 0.896816
2205 | 16777216 14988641 0.893393
2206 | 33554432 29954527 0.892714
2207 | 67108864 58642491 0.873841
2208 | 134217728 119237102 0.888386
2209 | 268435456 237483539 0.884695
2210 |
2211 | 16 15 0.9375
2212 | 32 31 0.96875
2213 | 64 63 0.984375
2214 | 128 127 0.992188
2215 | 256 252 0.984375
2216 | 512 497 0.970703
2217 | 1024 1008 0.984375
2218 | 2048 2012 0.982422
2219 | 4096 3995 0.975342
2220 | 8192 7871 0.960815
2221 | 16384 15434 0.942017
2222 | 32768 31077 0.948395
2223 | 65536 61426 0.937286
2224 | 131072 123550 0.942612
2225 | 262144 245045 0.934772
2226 | 524288 479717 0.914988
2227 | 1048576 961998 0.917433
2228 | 2097152 1909857 0.910691
2229 | 4194304 3858134 0.919851
2230 | 8388608 7421441 0.884705
2231 | 16777216 14853281 0.885325
2232 | 33554432 30095314 0.89691
2233 | 67108864 58288704 0.868569
2234 | 134217728 117886061 0.87832
2235 | 268435456 235819195 0.878495
2236 |
2237 | 16 15 0.9375
2238 | 32 31 0.96875
2239 | 64 63 0.984375
2240 | 128 127 0.992188
2241 | 256 255 0.996094
2242 | 512 501 0.978516
2243 | 1024 1001 0.977539
2244 | 2048 2004 0.978516
2245 | 4096 3928 0.958984
2246 | 8192 7715 0.941772
2247 | 16384 15778 0.963013
2248 | 32768 30775 0.939178
2249 | 65536 61927 0.944931
2250 | 131072 118797 0.906349
2251 | 262144 239839 0.914913
2252 | 524288 489651 0.933935
2253 | 1048576 954230 0.910025
2254 | 2097152 1930293 0.920435
2255 | 4194304 3755526 0.895387
2256 | 8388608 7589387 0.904725
2257 | 16777216 15160853 0.903657
2258 | 33554432 29701812 0.885183
2259 | 67108864 59318340 0.883912
2260 | 134217728 118097819 0.879897
2261 | 268435456 234730458 0.874439
2262 |
2263 | 16 15 0.9375
2264 | 32 31 0.96875
2265 | 64 63 0.984375
2266 | 128 127 0.992188
2267 | 256 255 0.996094
2268 | 512 505 0.986328
2269 | 1024 999 0.975586
2270 | 2048 1997 0.975098
2271 | 4096 3968 0.96875
2272 | 8192 7971 0.973022
2273 | 16384 15546 0.948853
2274 | 32768 30600 0.933838
2275 | 65536 61908 0.944641
2276 | 131072 123104 0.939209
2277 | 262144 242237 0.924061
2278 | 524288 480191 0.915892
2279 | 1048576 950014 0.906004
2280 | 2097152 1938499 0.924348
2281 | 4194304 3811897 0.908827
2282 | 8388608 7426048 0.885254
2283 | 16777216 15100605 0.900066
2284 | 33554432 29586359 0.881742
2285 | 67108864 59798639 0.891069
2286 | 134217728 116918264 0.871109
2287 | 268435456 236745311 0.881945
2288 |
2289 | 16 15 0.9375
2290 | 32 31 0.96875
2291 | 64 63 0.984375
2292 | 128 127 0.992188
2293 | 256 254 0.992188
2294 | 512 503 0.982422
2295 | 1024 977 0.954102
2296 | 2048 2009 0.980957
2297 | 4096 4003 0.977295
2298 | 8192 7872 0.960938
2299 | 16384 15115 0.922546
2300 | 32768 31112 0.949463
2301 | 65536 61503 0.938461
2302 | 131072 122332 0.933319
2303 | 262144 246304 0.939575
2304 | 524288 479280 0.914154
2305 | 1048576 949970 0.905962
2306 | 2097152 1917727 0.914443
2307 | 4194304 3814674 0.909489
2308 | 8388608 7616141 0.907915
2309 | 16777216 15018014 0.895143
2310 | 33554432 29740735 0.886343
2311 | 67108864 59245051 0.88282
2312 | 134217728 113713434 0.847231
2313 | 268435456 235197447 0.876179
2314 |
2315 | 16 15 0.9375
2316 | 32 31 0.96875
2317 | 64 63 0.984375
2318 | 128 125 0.976562
2319 | 256 251 0.980469
2320 | 512 501 0.978516
2321 | 1024 1005 0.981445
2322 | 2048 2024 0.988281
2323 | 4096 4028 0.983398
2324 | 8192 7914 0.966064
2325 | 16384 15552 0.949219
2326 | 32768 30887 0.942596
2327 | 65536 60863 0.928696
2328 | 131072 121454 0.92662
2329 | 262144 244837 0.933979
2330 | 524288 484834 0.924747
2331 | 1048576 946597 0.902745
2332 | 2097152 1899786 0.905889
2333 | 4194304 3791933 0.904067
2334 | 8388608 7551277 0.900182
2335 | 16777216 14921548 0.889394
2336 | 33554432 29074844 0.866498
2337 | 67108864 59608111 0.88823
2338 | 134217728 116176324 0.865581
2339 | 268435456 235233640 0.876314
2340 |
2341 | 16 15 0.9375
2342 | 32 31 0.96875
2343 | 64 63 0.984375
2344 | 128 127 0.992188
2345 | 256 255 0.996094
2346 | 512 505 0.986328
2347 | 1024 1001 0.977539
2348 | 2048 1993 0.973145
2349 | 4096 3990 0.974121
2350 | 8192 7896 0.963867
2351 | 16384 15653 0.955383
2352 | 32768 31165 0.95108
2353 | 65536 61532 0.938904
2354 | 131072 123393 0.941414
2355 | 262144 244321 0.932011
2356 | 524288 475976 0.907852
2357 | 1048576 958291 0.913898
2358 | 2097152 1920898 0.915956
2359 | 4194304 3789556 0.903501
2360 | 8388608 7477146 0.891345
2361 | 16777216 14873569 0.886534
2362 | 33554432 29366455 0.875189
2363 | 67108864 59193920 0.882058
2364 | 134217728 120125929 0.895008
2365 | 268435456 234459013 0.873428
2366 |
2367 | 16 15 0.9375
2368 | 32 31 0.96875
2369 | 64 63 0.984375
2370 | 128 127 0.992188
2371 | 256 249 0.972656
2372 | 512 493 0.962891
2373 | 1024 1011 0.987305
2374 | 2048 1975 0.964355
2375 | 4096 3901 0.952393
2376 | 8192 7669 0.936157
2377 | 16384 15324 0.935303
2378 | 32768 31476 0.960571
2379 | 65536 61565 0.939407
2380 | 131072 121510 0.927048
2381 | 262144 244180 0.931473
2382 | 524288 480393 0.916277
2383 | 1048576 942001 0.898362
2384 | 2097152 1930177 0.92038
2385 | 4194304 3793576 0.904459
2386 | 8388608 7582004 0.903845
2387 | 16777216 14893279 0.887709
2388 | 33554432 29897263 0.891008
2389 | 67108864 59075908 0.8803
2390 | 134217728 118991507 0.886556
2391 | 268435456 233406022 0.869505
2392 |
2393 | 16 15 0.9375
2394 | 32 31 0.96875
2395 | 64 63 0.984375
2396 | 128 127 0.992188
2397 | 256 255 0.996094
2398 | 512 508 0.992188
2399 | 1024 987 0.963867
2400 | 2048 1995 0.974121
2401 | 4096 3846 0.938965
2402 | 8192 7932 0.968262
2403 | 16384 15686 0.957397
2404 | 32768 30683 0.936371
2405 | 65536 62475 0.953293
2406 | 131072 123895 0.945244
2407 | 262144 243922 0.930489
2408 | 524288 481459 0.91831
2409 | 1048576 948545 0.904603
2410 | 2097152 1919680 0.915375
2411 | 4194304 3788359 0.903215
2412 | 8388608 7432615 0.886037
2413 | 16777216 15187624 0.905253
2414 | 33554432 29999188 0.894045
2415 | 67108864 58972116 0.878753
2416 | 134217728 115101695 0.857574
2417 | 268435456 230853462 0.859996
2418 |
2419 | 16 15 0.9375
2420 | 32 31 0.96875
2421 | 64 63 0.984375
2422 | 128 127 0.992188
2423 | 256 255 0.996094
2424 | 512 502 0.980469
2425 | 1024 980 0.957031
2426 | 2048 1972 0.962891
2427 | 4096 3932 0.959961
2428 | 8192 7833 0.956177
2429 | 16384 15540 0.948486
2430 | 32768 30963 0.944916
2431 | 65536 61475 0.938034
2432 | 131072 120908 0.922455
2433 | 262144 243442 0.928658
2434 | 524288 477184 0.910156
2435 | 1048576 948374 0.90444
2436 | 2097152 1889140 0.900812
2437 | 4194304 3743513 0.892523
2438 | 8388608 7540382 0.898884
2439 | 16777216 14979172 0.892828
2440 | 33554432 29943040 0.892372
2441 | 67108864 58042533 0.864901
2442 | 134217728 117092186 0.872405
2443 | 268435456 234056974 0.87193
2444 |
2445 | 16 15 0.9375
2446 | 32 31 0.96875
2447 | 64 63 0.984375
2448 | 128 126 0.984375
2449 | 256 255 0.996094
2450 | 512 495 0.966797
2451 | 1024 1000 0.976562
2452 | 2048 1988 0.970703
2453 | 4096 3991 0.974365
2454 | 8192 7890 0.963135
2455 | 16384 15641 0.954651
2456 | 32768 30857 0.941681
2457 | 65536 62133 0.948074
2458 | 131072 122726 0.936325
2459 | 262144 243221 0.927814
2460 | 524288 486903 0.928694
2461 | 1048576 953204 0.909046
2462 | 2097152 1928375 0.919521
2463 | 4194304 3755950 0.895488
2464 | 8388608 7535154 0.89826
2465 | 16777216 15076274 0.898616
2466 | 33554432 29659536 0.883923
2467 | 67108864 58792064 0.87607
2468 | 134217728 117396320 0.874671
2469 | 268435456 236670847 0.881668
2470 |
2471 | 16 15 0.9375
2472 | 32 31 0.96875
2473 | 64 63 0.984375
2474 | 128 125 0.976562
2475 | 256 253 0.988281
2476 | 512 501 0.978516
2477 | 1024 1013 0.989258
2478 | 2048 1959 0.956543
2479 | 4096 3954 0.965332
2480 | 8192 7813 0.953735
2481 | 16384 15398 0.939819
2482 | 32768 30637 0.934967
2483 | 65536 61123 0.932663
2484 | 131072 119639 0.912773
2485 | 262144 244200 0.931549
2486 | 524288 482994 0.921238
2487 | 1048576 949617 0.905625
2488 | 2097152 1903701 0.907755
2489 | 4194304 3846501 0.917077
2490 | 8388608 7457302 0.88898
2491 | 16777216 15100166 0.90004
2492 | 33554432 29826081 0.888886
2493 | 67108864 59024469 0.879533
2494 | 134217728 117479127 0.875288
2495 | 268435456 234959837 0.875294
2496 |
2497 | 16 15 0.9375
2498 | 32 31 0.96875
2499 | 64 63 0.984375
2500 | 128 126 0.984375
2501 | 256 253 0.988281
2502 | 512 511 0.998047
2503 | 1024 1012 0.988281
2504 | 2048 2007 0.97998
2505 | 4096 3978 0.971191
2506 | 8192 7875 0.961304
2507 | 16384 15817 0.965393
2508 | 32768 31193 0.951935
2509 | 65536 61537 0.93898
2510 | 131072 120248 0.917419
2511 | 262144 247985 0.945988
2512 | 524288 486814 0.928524
2513 | 1048576 962333 0.917752
2514 | 2097152 1891895 0.902126
2515 | 4194304 3824063 0.911728
2516 | 8388608 7587558 0.904507
2517 | 16777216 15101812 0.900138
2518 | 33554432 30109044 0.897319
2519 | 67108864 59296986 0.883594
2520 | 134217728 118305323 0.881443
2521 | 268435456 235550475 0.877494
2522 |
2523 | 16 15 0.9375
2524 | 32 31 0.96875
2525 | 64 63 0.984375
2526 | 128 126 0.984375
2527 | 256 254 0.992188
2528 | 512 507 0.990234
2529 | 1024 1005 0.981445
2530 | 2048 1989 0.971191
2531 | 4096 3923 0.957764
2532 | 8192 7864 0.959961
2533 | 16384 15658 0.955688
2534 | 32768 30940 0.944214
2535 | 65536 60986 0.930573
2536 | 131072 122645 0.935707
2537 | 262144 244913 0.934269
2538 | 524288 489801 0.934221
2539 | 1048576 939360 0.895844
2540 | 2097152 1855008 0.884537
2541 | 4194304 3764075 0.897425
2542 | 8388608 7628873 0.909433
2543 | 16777216 14702329 0.876327
2544 | 33554432 29897625 0.891019
2545 | 67108864 57953836 0.863579
2546 | 134217728 118805381 0.885169
2547 | 268435456 236275499 0.880195
2548 |
2549 | 16 15 0.9375
2550 | 32 31 0.96875
2551 | 64 63 0.984375
2552 | 128 127 0.992188
2553 | 256 249 0.972656
2554 | 512 503 0.982422
2555 | 1024 1013 0.989258
2556 | 2048 1968 0.960938
2557 | 4096 3993 0.974854
2558 | 8192 7855 0.958862
2559 | 16384 15600 0.952148
2560 | 32768 31034 0.947083
2561 | 65536 62469 0.953201
2562 | 131072 121954 0.930435
2563 | 262144 240374 0.916954
2564 | 524288 487837 0.930475
2565 | 1048576 939336 0.895821
2566 | 2097152 1893500 0.902891
2567 | 4194304 3669347 0.87484
2568 | 8388608 7527968 0.897404
2569 | 16777216 14932710 0.890059
2570 | 33554432 29845490 0.889465
2571 | 67108864 59304396 0.883704
2572 | 134217728 117523889 0.875621
2573 | 268435456 234359262 0.873056
2574 |
2575 | 16 15 0.9375
2576 | 32 31 0.96875
2577 | 64 63 0.984375
2578 | 128 127 0.992188
2579 | 256 255 0.996094
2580 | 512 495 0.966797
2581 | 1024 1010 0.986328
2582 | 2048 2001 0.977051
2583 | 4096 3722 0.908691
2584 | 8192 7705 0.940552
2585 | 16384 15675 0.956726
2586 | 32768 31275 0.954437
2587 | 65536 60611 0.92485
2588 | 131072 120947 0.922752
2589 | 262144 244932 0.934341
2590 | 524288 485495 0.926008
2591 | 1048576 967041 0.922242
2592 | 2097152 1928201 0.919438
2593 | 4194304 3793261 0.904384
2594 | 8388608 7538128 0.898615
2595 | 16777216 15032056 0.89598
2596 | 33554432 30153190 0.898635
2597 | 67108864 59274352 0.883257
2598 | 134217728 118620026 0.883788
2599 | 268435456 235407804 0.876962
2600 |
2601 |
--------------------------------------------------------------------------------
/sparseconfig.h:
--------------------------------------------------------------------------------
1 | // Copyright 2018 Google LLC
2 | //
3 | // Licensed under the Apache License, Version 2.0 (the "License");
4 | // you may not use this file except in compliance with the License.
5 | // You may obtain a copy of the License at
6 | //
7 | // http://www.apache.org/licenses/LICENSE-2.0
8 | //
9 | // Unless required by applicable law or agreed to in writing, software
10 | // distributed under the License is distributed on an "AS IS" BASIS,
11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 | // See the License for the specific language governing permissions and
13 | // limitations under the License.
14 |
15 | /*
16 | * NOTE: This file is for internal use only.
17 | * Do not use these #defines in your own program!
18 | */
19 |
20 | /* Namespace for Google classes */
21 | #define GOOGLE_NAMESPACE ::google
22 |
23 | /* the location of the header defining hash functions */
24 | #define HASH_FUN_H
25 |
26 | /* the namespace of the hash<> function */
27 | #define HASH_NAMESPACE std
28 |
29 | /* Define to 1 if you have the header file. */
30 | #define HAVE_INTTYPES_H 1
31 |
32 | /* Define to 1 if the system has the type `long long'. */
33 | #define HAVE_LONG_LONG 1
34 |
35 | /* Define to 1 if you have the `memcpy' function. */
36 | #define HAVE_MEMCPY 1
37 |
38 | /* Define to 1 if you have the header file. */
39 | #define HAVE_STDINT_H 1
40 |
41 | /* Define to 1 if you have the header file. */
42 | #define HAVE_SYS_TYPES_H 1
43 |
44 | /* Define to 1 if the system has the type `uint16_t'. */
45 | #define HAVE_UINT16_T 1
46 |
47 | /* Define to 1 if the system has the type `u_int16_t'. */
48 | #define HAVE_U_INT16_T 1
49 |
50 | /* Define to 1 if the system has the type `__uint16'. */
51 | /* #undef HAVE___UINT16 */
52 |
53 | /* The system-provided hash function including the namespace. */
54 | #define SPARSEHASH_HASH HASH_NAMESPACE::hash
55 |
56 | /* Stops putting the code inside the Google namespace */
57 | #define _END_GOOGLE_NAMESPACE_ }
58 |
59 | /* Puts following code inside the Google namespace */
60 | #define _START_GOOGLE_NAMESPACE_ namespace google {
61 |
--------------------------------------------------------------------------------
/tools/workspace_status.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 |
5 | REV=$(git rev-parse HEAD)
6 | SUFFIX=$(git diff-index --quiet HEAD -- || echo -dirty)
7 |
8 | echo "BUILD_SCM_REVISION ${REV}${SUFFIX}"
9 |
--------------------------------------------------------------------------------