[pypy-commit] benchmarks default: some quicksort changes
Raemi
noreply at buildbot.pypy.org
Mon Jul 21 17:48:53 CEST 2014
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch:
Changeset: r267:76d14fcfb50a
Date: 2014-07-21 17:48 +0200
http://bitbucket.org/pypy/benchmarks/changeset/76d14fcfb50a/
Log: some quicksort changes
diff --git a/multithread/quick_sort/quick_sort.py b/multithread/quick_sort/quick_sort.py
--- a/multithread/quick_sort/quick_sort.py
+++ b/multithread/quick_sort/quick_sort.py
@@ -41,6 +41,7 @@
qsort(xs, l, l0 + n - l)
+
def qsort_f(xs, l0, n, level):
if n < 2:
return []
@@ -50,25 +51,35 @@
r = l + n - 1
while l <= r:
with atomic:
- if xs[l] < pivot:
+ xl = xs[l]
+ if xl < pivot:
l += 1
continue
- if xs[r] > pivot:
+ xr = xs[r]
+ if xr > pivot:
r -= 1
continue
- xs[l], xs[r] = xs[r], xs[l]
- l += 1
- r -= 1
+ xs[l], xs[r] = xr, xl
+ l += 1
+ r -= 1
fs = []
#right_amount = 1000 > n // 2 > 505
- right_amount = level == 4
- if right_amount:
- fs.append(Future(qsort_f, xs, l0, r - l0 + 1, level+1))
- fs.append(Future(qsort_f, xs, l, l0 + n - l, level+1))
+ do_futures = level == 4
+ largs = (xs, l0, r - l0 + 1, level+1)
+ rargs = (xs, l, l0 + n - l, level+1)
+ if do_futures:
+ fs.append(Future(qsort_f, *largs))
+ fs.append(Future(qsort_f, *rargs))
else:
- fs.extend(qsort_f(xs, l0, r - l0 + 1, level+1))
- fs.extend(qsort_f(xs, l, l0 + n - l, level+1))
+ if level > 4 and n < 100:
+ with atomic:
+ fs.extend(qsort_f(*largs))
+ with atomic:
+ fs.extend(qsort_f(*rargs))
+ else:
+ fs.extend(qsort_f(*largs))
+ fs.extend(qsort_f(*rargs))
#print_abort_info(0.0000001)
return fs
@@ -79,26 +90,35 @@
f = fs.pop()
fs.extend(f())
-def run(threads=2, n=100000):
+def run(threads=2, n=20000):
threads = int(threads)
n = int(n)
set_thread_pool(ThreadPool(threads))
+ to_sort = range(n)
+ t = 0
+ for i in range(20):
+ with atomic:
+ random.seed(i)
+ random.shuffle(to_sort)
+ s = deque(to_sort)
+ # qsort(s, 0, len(s))
+ hint_commit_soon()
- to_sort = range(n)
- random.seed(121)
- random.shuffle(to_sort)
- s = deque(to_sort)
- # qsort(s, 0, len(s))
-
- fs = qsort_f(s, 0, len(s), 0)
- wait_for_futures(fs)
-
+ t -= time.time()
+ # start as future, otherwise we get more threads
+ # than we want (+1 for the main thread)
+ fs = Future(qsort_f, s, 0, len(s), 0)
+ wait_for_futures(fs())
+ #assert sorted(to_sort) == list(s)
+ t += time.time()
# shutdown current pool
set_thread_pool(None)
+ return t
+
if __name__ == "__main__":
More information about the pypy-commit
mailing list