diff --git a/Lib/test/sortperf.py b/Lib/test/sortperf.py
new file mode 100644
index 0000000..5d9232a
--- /dev/null
+++ b/Lib/test/sortperf.py
@@ -0,0 +1,109 @@
+"""Sort performance test."""
+
+import sys
+import time
+import whrandom
+import marshal
+import tempfile
+import operator
+import os
+
+td = tempfile.gettempdir()
+
+def randrange(n):
+    """Return a random shuffle of range(n)."""
+    fn = os.path.join(td, "rr%06d" % n)
+    try:
+        fp = open(fn, "rb")
+    except IOError:
+        result = []
+        for i in range(n):
+            result.append(whrandom.random())
+        try:
+            try:
+                fp = open(fn, "wb")
+                marshal.dump(result, fp)
+                fp.close()
+                fp = None
+            finally:
+                if fp:
+                    try:
+                        os.unlink(fn)
+                    except os.error:
+                        pass
+        except IOError, msg:
+            print "can't write", fn, ":", msg
+    else:
+        result = marshal.load(fp)
+        fp.close()
+        ##assert len(result) == n
+        # Shuffle it a bit...
+        for i in range(10):
+            i = whrandom.randint(0, n-1)
+            temp = result[:i]
+            del result[:i]
+            temp.reverse()
+            result[len(result):] = temp
+            del temp
+    return result
+
+def fl():
+    sys.stdout.flush()
+
+def doit(L):
+    t0 = time.clock()
+    L.sort()
+    t1 = time.clock()
+    print "%6.2f" % (t1-t0),
+    fl()
+
+def tabulate(r):
+    fmt = ("%2s %6s" + " %6s"*5)
+    print fmt % ("i", "2**i", "*sort", "\\sort", "/sort", "~sort", "-sort")
+    for i in r:
+        n = 1<<i
+        L = randrange(n)
+        ##assert len(L) == n
+        print "%2d %6d" % (i, n),
+        fl()
+        doit(L) # *sort
+        L.reverse()
+        doit(L) # \sort
+        doit(L) # /sort
+        if n > 4:
+            L = map(operator.neg, map(operator.neg, L[:4]*(n/4)))
+        doit(L) # ~sort
+        L = map(abs, [-0.5]*n)
+        doit(L) # -sort
+        print
+
+def main():
+    import string
+    # default range (inclusive)
+    k1 = 15
+    k2 = 19
+    # one argument: single point
+    # two arguments: specify range
+    if sys.argv[1:]:
+        k1 = string.atoi(sys.argv[1])
+        k2 = k1
+        if sys.argv[2:]:
+            k2 = string.atoi(sys.argv[2])
+            if sys.argv[3:]:
+                # derive random seed from remaining arguments
+                x, y, z = 0, 0, 0
+                for a in sys.argv[3:]:
+                    h = hash(a)
+                    h, d = divmod(h, 256)
+                    h = h & 0xffffff
+                    x = (x^h^d) & 255
+                    h = h>>8
+                    y = (y^h^d) & 255
+                    h = h>>8
+                    z = (z^h^d) & 255
+                whrandom.seed(x, y, z)
+    r = range(k1, k2+1)
+    tabulate(r)
+
+if __name__ == '__main__':
+    main()
