[pypy-commit] benchmarks default: add another (bad) benchmark (qsort)
Raemi
noreply at buildbot.pypy.org
Tue Jul 15 18:12:24 CEST 2014
Author: Remi Meier <remi.meier at inf.ethz.ch>
Branch:
Changeset: r266:225bf81cf984
Date: 2014-07-15 18:14 +0200
http://bitbucket.org/pypy/benchmarks/changeset/225bf81cf984/
Log: add another (bad) benchmark (qsort)
diff --git a/multithread/quick_sort/quick_sort.py b/multithread/quick_sort/quick_sort.py
new file mode 100644
--- /dev/null
+++ b/multithread/quick_sort/quick_sort.py
@@ -0,0 +1,105 @@
+# -*- coding: utf-8 -*-
+
+
+
+import sys
+import time, random
+from common.abstract_threading import (
+ atomic, Future, set_thread_pool, ThreadPool,
+ hint_commit_soon, print_abort_info)
+
+import itertools
+from collections import deque
+
+
+def chunks(iterable, size):
+ it = iter(iterable)
+ item = list(itertools.islice(it, size))
+ while item:
+ yield item
+ item = list(itertools.islice(it, size))
+
+
+
+def qsort(xs, l0, n):
+ if n < 2:
+ return
+ pivot = xs[l0 + n // 2]
+ l = l0
+ r = l + n - 1
+ while l <= r:
+ if xs[l] < pivot:
+ l += 1
+ continue
+ if xs[r] > pivot:
+ r -= 1
+ continue
+ xs[l], xs[r] = xs[r], xs[l]
+ l += 1
+ r -= 1
+ qsort(xs, l0, r - l0 + 1)
+ qsort(xs, l, l0 + n - l)
+
+
+def qsort_f(xs, l0, n, level):
+ if n < 2:
+ return []
+
+ pivot = xs[l0 + n // 2]
+ l = l0
+ r = l + n - 1
+ while l <= r:
+ with atomic:
+ if xs[l] < pivot:
+ l += 1
+ continue
+ if xs[r] > pivot:
+ r -= 1
+ continue
+ xs[l], xs[r] = xs[r], xs[l]
+ 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))
+ else:
+ fs.extend(qsort_f(xs, l0, r - l0 + 1, level+1))
+ fs.extend(qsort_f(xs, l, l0 + n - l, level+1))
+ #print_abort_info(0.0000001)
+
+ return fs
+
+
+def wait_for_futures(fs):
+ while fs:
+ f = fs.pop()
+ fs.extend(f())
+
+def run(threads=2, n=100000):
+ threads = int(threads)
+ n = int(n)
+
+ set_thread_pool(ThreadPool(threads))
+
+
+ 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)
+
+
+ # shutdown current pool
+ set_thread_pool(None)
+
+
+
+if __name__ == "__main__":
+ run()
More information about the pypy-commit
mailing list