From d47f72be0c00ffb18a202fe60b80d3a581df5211 Mon Sep 17 00:00:00 2001 From: Vladimir Volodko Date: Wed, 20 Nov 2013 14:02:20 +0700 Subject: [PATCH 1/2] Refactor define::msgpack_unpack() to use 'switch' instead of several if's. convert.benchmark test show some improvement. --- src/msgpack/type/define.hpp.erb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/msgpack/type/define.hpp.erb b/src/msgpack/type/define.hpp.erb index 0e0cea04..1fa2a240 100644 --- a/src/msgpack/type/define.hpp.erb +++ b/src/msgpack/type/define.hpp.erb @@ -107,8 +107,15 @@ struct define, A<%=j%><%}%>> { { if(o.type != type::ARRAY) { throw type_error(); } const size_t size = o.via.array.size; - <%0.upto(i) {|j|%> - if(size <= <%=j%>) { return; } o.via.array.ptr[<%=j%>].convert(&a<%=j%>);<%}%> + if(size > 0) { + msgpack::object *ptr = o.via.array.ptr; + switch(size) { + default: + <%(i).downto(0) {|j|%> + case <%=j+1%>: ptr[<%=j%>].convert(&a<%=j%>);<%}%> + ; + } + } } void msgpack_object(msgpack::object* o, msgpack::zone* z) const { From 862f04104da485c07f58d15fba31fac09af2eda2 Mon Sep 17 00:00:00 2001 From: Nobuyuki Kubota Date: Fri, 28 Feb 2014 16:12:36 +0900 Subject: [PATCH 2/2] Changed the format a little --- src/msgpack/type/define.hpp.erb | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/msgpack/type/define.hpp.erb b/src/msgpack/type/define.hpp.erb index 1fa2a240..9e9a49d5 100644 --- a/src/msgpack/type/define.hpp.erb +++ b/src/msgpack/type/define.hpp.erb @@ -110,10 +110,8 @@ struct define, A<%=j%><%}%>> { if(size > 0) { msgpack::object *ptr = o.via.array.ptr; switch(size) { - default: - <%(i).downto(0) {|j|%> + default:<%(i).downto(0) {|j|%> case <%=j+1%>: ptr[<%=j%>].convert(&a<%=j%>);<%}%> - ; } } }