[pypy-commit] extradoc extradoc: refactor sqrt lua benchmark. integer and Fix16 variants probably don't quite

cfbolz noreply at buildbot.pypy.org
Mon Aug 13 21:12:14 CEST 2012


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: extradoc
Changeset: r4550:5b523c603fdb
Date: 2012-08-13 21:10 +0200
http://bitbucket.org/pypy/extradoc/changeset/5b523c603fdb/

Log:	refactor sqrt lua benchmark. integer and Fix16 variants probably
	don't quite make sense.

diff --git a/talk/iwtc11/benchmarks/sqrt/sqrt.lua b/talk/iwtc11/benchmarks/sqrt/sqrt.lua
--- a/talk/iwtc11/benchmarks/sqrt/sqrt.lua
+++ b/talk/iwtc11/benchmarks/sqrt/sqrt.lua
@@ -1,89 +1,106 @@
+local bit = require("bit")
+local lshift, rshift, tobit = bit.lshift, bit.rshift, bit.tobit
+
+if true then
+    function rshift(a, b)
+        return a / (2 ^ b)
+    end
+
+    function lshift(a, b)
+        return a * (2 ^ b)
+    end
+
+    function tobit(a)
+        return a
+    end
+end
+
+---------------------------
+
 function sqrt(y, n)
-	n = n or 10000
-	x = y / 2
-	while n > 0 do
-		n = n - 1
-		x = (x + y/x) / 2
-	end
-	return x
+    n = n or 10000
+    local x = y / 2
+    while n > 0 do
+        n = n - 1
+        x = (x + y/x) / 2
+    end
+    return x
 end
 
 -----------------------
 -- begin class Fix16 --
 -----------------------
 
-Fix16 = {}
+Fix16 = {
+    new = function(self, val, scale)
+        if scale == nil then
+            scale = true
+        end
+
+        if type(val) == "table" then
+            val = val.val
+        else
+            if scale == true then
+                val = lshift(val, 16)
+            else
+                val = tobit(val)
+            end
+        end
+        return setmetatable({val=val}, self)
+    end,
+
+    __add = function(self, other)
+        return Fix16:new(self.val + Fix16:new(other).val, false)
+    end,
+
+    __mul = function(self, other)
+        local value = rshift(self.val, 8) * (rshift(Fix16:new(other).val, 8))
+        return Fix16:new(value, false)
+    end,
+
+    __div = function(self, other)
+        local value = lshift(self.val, 8) / (rshift(Fix16:new(other).val, 8))
+        return Fix16:new(value, false)
+    end,
+
+    to_float = function(self)
+        return self.val / (2 ^ 16)
+    end,
+
+    __tostring = function(self)
+        return tostring(self:to_float())
+    end,
+}
 Fix16.__index = Fix16
 
-function Fix16.init(val, scale)
-	if scale == nil then
-		scale = true
-	end
-
-	local fix16 = {}
-	setmetatable(fix16, Fix16)
-	if type(val) == "table" then
-		fix16.val = val.val
-	else
-		if scale == true then
-			fix16.val = math.floor(val * (2 ^ 16))
-		else
-			fix16.val = val
-		end
-	end
-	return fix16
-end
-
-function Fix16:__add(other)
-	return Fix16.init(self.val + Fix16.init(other).val, false)
-end
-
-function Fix16:__mul(other)
-	value = (self.val / 256) * (Fix16.init(other).val / 256)
-	return Fix16.init(value, false)
-end
-
-function Fix16:__div(other)
-	value = (self.val * 256) / (Fix16.init(other).val / 256)
-	return Fix16.init(value, false)
-end
-
-function Fix16:to_float()
-	return self.val / (2 ^ 16)
-end
-
-function Fix16:__tostring()
-	return tostring(self:to_float())
-end
-
 ---------------------
 -- end class Fix16 --
 ---------------------
 
 function test_sqrt()
-	t = {2, 3, 4, 5, 6, 7, 8, 9, 123}
-	for j = 1, #t do
-		i = t[j]
-		s = string.format("%d %f %4.2f %4.2f %4.2f", i, sqrt(i), sqrt(i), sqrt(Fix16.init(i)):to_float(), math.sqrt(i))
-		print(s)
-	end
+    t = {2, 3, 4, 5, 6, 7, 8, 9, 123}
+    for j = 1, #t do
+        i = t[j]
+        s = string.format("%d %f %f %f %f", i, sqrt(i), sqrt(tobit(i)), sqrt(Fix16:new(i)):to_float(), math.sqrt(i))
+        print(s)
+    end
 end
 
 -- entry point
 function main(args)
-	arg = args[1]
-	if arg == "int" then
-		sqrt(123, 100000000)
-	elseif arg == "float" then
-		sqrt(123, 100000000)
-	elseif arg == "Fix16" then
-		sqrt(Fix16.init(123), 100000000)
-	elseif arg == "test_sqrt" then
-		test_sqrt()
-	else
-		error('argument must be "int", "float" or "Fix16"')
-	end
-	return string.format("%s", arg)
+    arg = args[1]
+    if arg == "int" then
+        sqrt(123, 100000000)
+    elseif arg == "float" then
+        sqrt(123, 100000000)
+    elseif arg == "Fix16" then
+        sqrt(Fix16:new(123), 100000000)
+    elseif arg == "test_sqrt" then
+        test_sqrt()
+    else
+        error('argument must be "int", "float" or "Fix16"')
+    end
+    return string.format("%s", arg)
 end
 
---main(arg)
+main(arg)


More information about the pypy-commit mailing list