Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Unified Diff: net/cert/ct_log_verifier_unittest.cc

Issue 2178153003: Cache hashes in CTLogVerifier tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/cert/ct_log_verifier_unittest.cc
diff --git a/net/cert/ct_log_verifier_unittest.cc b/net/cert/ct_log_verifier_unittest.cc
index 754d3e39073c50f89c3c83b1d3d623a7ef782659..a90ce08b912bca5d309073026193e61966d66356 100644
--- a/net/cert/ct_log_verifier_unittest.cc
+++ b/net/cert/ct_log_verifier_unittest.cc
@@ -6,8 +6,10 @@
#include <stdint.h>
+#include <map>
#include <memory>
#include <string>
+#include <utility>
#include "base/strings/string_number_conversions.h"
#include "base/time/time.h"
@@ -24,6 +26,11 @@ namespace net {
namespace {
+// Enables the node hash cache used to accelerate some of the tests.
+// The cache reduces the duration of some tests by at least 50%, in exchange for
+// significantly higher memory usage.
Eran Messeri 2016/07/26 15:45:37 Can you say how much or point to a calculation lat
+const bool kIsHashCacheEnabled = true;
+
// Calculate the power of two nearest to, but less than, |n|.
// |n| must be at least 2.
uint64_t CalculateNearestPowerOfTwo(uint64_t n) {
@@ -426,16 +433,34 @@ class TreeHasher {
// Recursively calculates the hash of the root given the leaf data
// specified in |inputs|.
std::string ReferenceMerkleTreeHash(std::string* inputs, uint64_t input_size) {
- if (!input_size)
- return TreeHasher::HashEmpty();
- if (input_size == 1)
- return TreeHasher::HashLeaf(inputs[0]);
+ // Memoize function - this requires 34 bytes of memory per unique pair of
+ // |inputs| and |input_size|, plus std::map and std::string overhead.
+ // This results in a ~50% reduction in time required to run the
+ // *FromReferenceGenerator tests.
+ static std::map<std::pair<std::string*, uint64_t>, std::string> cache;
Eran Messeri 2016/07/26 15:45:37 As discussed offline, there are two issues with us
+ if (kIsHashCacheEnabled) {
+ auto iter = cache.find(std::make_pair(inputs, input_size));
+ if (iter != cache.end())
+ return iter->second;
+ }
+
+ std::string hash;
+ if (input_size == 0) {
+ hash = TreeHasher::HashEmpty();
+ } else if (input_size == 1) {
+ hash = TreeHasher::HashLeaf(inputs[0]);
+ } else {
+ const uint64_t split = CalculateNearestPowerOfTwo(input_size);
+
+ hash = ct::internal::HashNodes(
+ ReferenceMerkleTreeHash(&inputs[0], split),
+ ReferenceMerkleTreeHash(&inputs[split], input_size - split));
+ }
- const uint64_t split = CalculateNearestPowerOfTwo(input_size);
+ if (kIsHashCacheEnabled)
+ cache[std::make_pair(inputs, input_size)] = hash;
- return ct::internal::HashNodes(
- ReferenceMerkleTreeHash(&inputs[0], split),
- ReferenceMerkleTreeHash(&inputs[split], input_size - split));
+ return hash;
}
// Reference implementation of snapshot consistency. Returns a
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698