Author: Remi Meier <remi.me...@inf.ethz.ch> Branch: Changeset: r254:de389b63b99c Date: 2014-04-28 13:50 +0200 http://bitbucket.org/pypy/benchmarks/changeset/de389b63b99c/
Log: a few tweaks diff --git a/multithread/btree/btree.py b/multithread/btree/btree.py --- a/multithread/btree/btree.py +++ b/multithread/btree/btree.py @@ -5,8 +5,6 @@ import random -thread_local = threading.local() - import bisect @@ -195,6 +193,9 @@ def insert(self, item): ancestors = self._path_to(item) + if self._present(item, ancestors): + return False + node, index = ancestors[-1] while getattr(node, "children", None): node = node.children[index] @@ -202,6 +203,7 @@ ancestors.append((node, index)) node, index = ancestors.pop() node.insert(index, item, ancestors) + return True def remove(self, item): ancestors = self._path_to(item) @@ -301,18 +303,22 @@ self._root = self.BRANCH(self, contents=seps, children=levels[-1]) +###################################################################### +###################################################################### +###################################################################### + OPS = [BTree.__contains__] * 98 + [BTree.insert, BTree.remove] +ITEM_RANGE = 10000 def task(id, tree, ops): print "start task with %s ops" % ops r = random.Random() r.seed(id) - thread_local.rnd = r for _ in xrange(ops): op = r.choice(OPS) - elem = r.randint(1, 10000) + elem = r.randint(1, ITEM_RANGE) with atomic: op(tree, elem) @@ -331,11 +337,10 @@ operations = int(operations) set_thread_pool(ThreadPool(threads)) - thread_local.rnd = random tree = BTree(20) for _ in xrange(1000): - tree.insert(random.randint(1, 1000)) + tree.insert(random.randint(1, ITEM_RANGE)) c_len = operations // threads fs = [] diff --git a/multithread/common/abstract_threading.py b/multithread/common/abstract_threading.py --- a/multithread/common/abstract_threading.py +++ b/multithread/common/abstract_threading.py @@ -1,6 +1,6 @@ from Queue import Queue, Empty, Full -from threading import Thread, Condition, Lock -import thread, atexit, sys +from threading import Thread, Condition, Lock, local +import thread, atexit, sys, time try: from __pypy__.thread import atomic, getsegmentlimit @@ -10,6 +10,31 @@ return 1 +class TLQueue(object): + def __init__(self): + self.items = [] + self._new_items = Condition() + + def put(self, v): + self.items.append(v) + with self._new_items: + self._new_items.notify_all() + + def get(self): + items = self.items + with atomic: + if items: + return items.pop() + + while True: + with self._new_items: + with atomic: + if items: + return items.pop() + + self._new_items.wait() + + class Worker(Thread): """Thread executing tasks from a given tasks queue""" def __init__(self, queue): @@ -29,7 +54,7 @@ class ThreadPool(object): def __init__(self, n_workers=None): - self.input_queue = Queue() + self.input_queue = TLQueue() if n_workers is None: n_workers = getsegmentlimit() self.workers = [Worker(self.input_queue) for i in range(n_workers)] diff --git a/multithread/skiplist/skiplist.py b/multithread/skiplist/skiplist.py --- a/multithread/skiplist/skiplist.py +++ b/multithread/skiplist/skiplist.py @@ -86,6 +86,7 @@ OPS = [SkipList.find] * 98 + [SkipList.insert, SkipList.remove] +ITEM_RANGE = 10000 def task(id, slist, ops): print "start task with %s ops" % ops @@ -95,7 +96,7 @@ for _ in xrange(ops): op = r.choice(OPS) - elem = r.randint(1, 10000) + elem = r.randint(1, ITEM_RANGE) with atomic: op(slist, elem) @@ -118,7 +119,7 @@ slist = SkipList() for _ in xrange(1000): - slist.insert(random.randint(1, 1000)) + slist.insert(random.randint(1, ITEM_RANGE)) c_len = operations // threads fs = [] _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit