[tor-commits] [bridgedb/master] Add benchmark tests for b.p.descriptors.deduplicate().

isis at torproject.org isis at torproject.org
Fri May 1 07:10:59 UTC 2015


commit c9ad39af644d5d4ea7165203b4719ee25f187b29
Author: Isis Lovecruft <isis at torproject.org>
Date:   Sat Apr 18 00:03:23 2015 +0000

    Add benchmark tests for b.p.descriptors.deduplicate().
---
 lib/bridgedb/test/test_parse_descriptors.py |   77 +++++++++++++++++++++++++++
 1 file changed, 77 insertions(+)

diff --git a/lib/bridgedb/test/test_parse_descriptors.py b/lib/bridgedb/test/test_parse_descriptors.py
index aa3b662..5ef3f6a 100644
--- a/lib/bridgedb/test/test_parse_descriptors.py
+++ b/lib/bridgedb/test/test_parse_descriptors.py
@@ -13,11 +13,13 @@ from __future__ import print_function
 
 import datetime
 import glob
+import hashlib
 import io
 import os
 import textwrap
 
 from twisted.trial import unittest
+from twisted.trial.unittest import SkipTest
 
 HAS_STEM = False
 
@@ -31,6 +33,8 @@ except (ImportError, NameError), error:
 else:
     HAS_STEM = True
 
+from bridgedb.test.util import Benchmarker
+
 
 BRIDGE_NETWORKSTATUS_0 = '''\
 r MiserLandfalls 4IsyTSCtChPhFPAnq5rD8yymlqA /GMC4lz8RXT/62v6kZNdmzSmopk 2014-11-04 06:23:22 2.215.61.223 4056 0
@@ -441,6 +445,79 @@ class ParseDescriptorsTests(unittest.TestCase):
             datetime.datetime.strptime("2014-12-04 03:10:25", "%Y-%m-%d %H:%M:%S"),
             "We should have the newest available descriptor for this router.")
 
+    def createDuplicatesForBenchmark(self, b=1, n=1200):
+        """Create a bunch of duplicate extrainfos for benchmark tests.
+
+        :param int b: The number of fake "bridges" to create **n** duplicate
+            descriptors for.
+        :param int n: The number of duplicate descriptors for each bridge
+            **b**.
+        """
+        descFiles = []
+
+        # The timestamp and fingerprint from BRIDGE_EXTRA_INFO_DESCRIPTOR:
+        timestamp  = "2014-11-04 06:23:22"
+        Y, M, rest = timestamp.split("-")
+        fpr        = "E08B324D20AD0A13E114F027AB9AC3F32CA696A0"
+        newerFpr   = "E08B324D20AD0A13E114F027AB9AC3F32CA696A0"
+
+        total = 0
+        needed = b * n
+        for x in range(b):
+            if total >= needed:
+                break
+            # Re-digest the fingerprint to create a "new" bridge
+            newerFpr = hashlib.sha1(newerFpr).hexdigest().upper()
+            # Generate n extrainfos with different timestamps:
+            count = 0
+            for year in range(1, ((n + 1)/ 12) + 2):  # Start from the next year
+                if count >= n:
+                    break
+                for month in range(1, 13):
+                    if count < n:
+                        newerTimestamp = "-".join([str(int(Y) + year), "%02d" % month, rest])
+                        newerDuplicate = BRIDGE_EXTRA_INFO_DESCRIPTOR[:].replace(
+                            fpr, newerFpr).replace(
+                                timestamp, newerTimestamp)
+                        descFiles.append(io.BytesIO(newerDuplicate))
+                        count += 1
+                        total += 1
+                    else:
+                        break
+
+        print("Deduplicating %5d total descriptors (%4d per bridge; %3d bridges):"
+              % (len(descFiles), n, b), end='\t')
+        return descFiles
+
+    def test_parse_descriptors_parseExtraInfoFiles_benchmark_100_bridges(self):
+        """Benchmark test for ``b.p.descriptors.parseExtraInfoFiles``."""
+        print()
+        for i in range(1, 11):
+            descFiles = self.createDuplicatesForBenchmark(b=100, n=i)
+            with Benchmarker():
+                routers = descriptors.parseExtraInfoFiles(*descFiles)
+
+    def test_parse_descriptors_parseExtraInfoFiles_benchmark_1000_bridges(self):
+        """Benchmark test for ``b.p.descriptors.parseExtraInfoFiles``."""
+        print()
+        for i in range(1, 11):
+            descFiles = self.createDuplicatesForBenchmark(b=1000, n=i)
+            with Benchmarker():
+                routers = descriptors.parseExtraInfoFiles(*descFiles)
+
+    def test_parse_descriptors_parseExtraInfoFiles_benchmark_10000_bridges(self):
+        """Benchmark test for ``b.p.descriptors.parseExtraInfoFiles``.
+        The algorithm should grow linearly in the number of duplicates.
+        """
+        raise SkipTest(("This test takes ~7 minutes to complete. "
+                        "Run it on your own free time."))
+
+        print()
+        for i in range(1, 11):
+            descFiles = self.createDuplicatesForBenchmark(b=10000, n=i)
+            with Benchmarker():
+                routers = descriptors.parseExtraInfoFiles(*descFiles)
+
     def test_parse_descriptors_parseExtraInfoFiles_no_validate(self):
         """Test for ``b.p.descriptors.parseExtraInfoFiles`` with
         descriptor validation disabled.





More information about the tor-commits mailing list