From 2db070884595760c63050694cb6ca022be6af24a Mon Sep 17 00:00:00 2001 From: Garrett Thornburg Date: Sun, 28 Feb 2016 01:21:44 -0700 Subject: [PATCH 1/5] Switch accessor creation from define_method to class_eval --- lib/protobuf/field/base_field.rb | 19 +++++++++++-------- protobuf.gemspec | 1 + 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/protobuf/field/base_field.rb b/lib/protobuf/field/base_field.rb index 7ad4802b..fa2f4410 100644 --- a/lib/protobuf/field/base_field.rb +++ b/lib/protobuf/field/base_field.rb @@ -177,16 +177,19 @@ def fully_qualified_name_only! # def define_accessor(simple_field_name, fully_qualified_field_name) - message_class.class_eval do - define_method("#{simple_field_name}!") do - @values[fully_qualified_field_name] + message_class.class_eval <<-ruby, __FILE__, __LINE__ + def #{simple_field_name}! + @values[:#{fully_qualified_field_name}] end - end - message_class.class_eval do - define_method(simple_field_name) { self[fully_qualified_field_name] } - define_method("#{simple_field_name}=") { |v| self[fully_qualified_field_name] = v } - end + def #{simple_field_name} + self[:#{fully_qualified_field_name}] + end + + def #{simple_field_name}=(value) + self[:#{fully_qualified_field_name}] = value + end + ruby return unless deprecated? diff --git a/protobuf.gemspec b/protobuf.gemspec index 1e84a09d..48527f35 100644 --- a/protobuf.gemspec +++ b/protobuf.gemspec @@ -31,6 +31,7 @@ require "protobuf/version" s.add_development_dependency 'simplecov' s.add_development_dependency 'timecop' s.add_development_dependency 'yard' + s.add_development_dependency 'benchmark-ips' # debuggers only work in MRI if RUBY_ENGINE.to_sym == :ruby From c6e62621197d820293092df7db834de54c88b049 Mon Sep 17 00:00:00 2001 From: Garrett Thornburg Date: Sun, 28 Feb 2016 08:42:39 -0700 Subject: [PATCH 2/5] Use a slighly more performant version of VarintPure decode --- lib/protobuf/varint_pure.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/protobuf/varint_pure.rb b/lib/protobuf/varint_pure.rb index eeffbecc..6fe38aad 100644 --- a/lib/protobuf/varint_pure.rb +++ b/lib/protobuf/varint_pure.rb @@ -1,12 +1,12 @@ module Protobuf module VarintPure def decode(stream) - value = index = 0 + value = shift = 0 begin byte = stream.readbyte - value |= (byte & 0x7f) << (7 * index) - index += 1 - end while (byte & 0x80).nonzero? + value |= (byte & 127) << shift + shift += 7 + end while byte > 127 value end end From 6f007d787c07db64b0e47b8887925b1b794331d1 Mon Sep 17 00:00:00 2001 From: Garrett Thornburg Date: Sun, 28 Feb 2016 08:47:07 -0700 Subject: [PATCH 3/5] Use != and == over nonzero? and zero? in hot code paths for better speed This optimization is slightly faster. --- lib/protobuf/field/integer_field.rb | 2 +- lib/protobuf/field/sfixed32_field.rb | 2 +- lib/protobuf/field/sfixed64_field.rb | 2 +- lib/protobuf/field/signed_integer_field.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/protobuf/field/integer_field.rb b/lib/protobuf/field/integer_field.rb index 5eb3b064..4f6e4759 100644 --- a/lib/protobuf/field/integer_field.rb +++ b/lib/protobuf/field/integer_field.rb @@ -9,7 +9,7 @@ class IntegerField < VarintField # def decode(value) - value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero? + value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000) != 0 value end diff --git a/lib/protobuf/field/sfixed32_field.rb b/lib/protobuf/field/sfixed32_field.rb index 9f9b64e9..c8ca1f3a 100644 --- a/lib/protobuf/field/sfixed32_field.rb +++ b/lib/protobuf/field/sfixed32_field.rb @@ -10,7 +10,7 @@ class Sfixed32Field < Int32Field def decode(bytes) value = bytes.unpack('V').first - value -= 0x1_0000_0000 if (value & 0x8000_0000).nonzero? + value -= 0x1_0000_0000 if (value & 0x8000_0000) != 0 value end diff --git a/lib/protobuf/field/sfixed64_field.rb b/lib/protobuf/field/sfixed64_field.rb index fc296483..d7ab755e 100644 --- a/lib/protobuf/field/sfixed64_field.rb +++ b/lib/protobuf/field/sfixed64_field.rb @@ -11,7 +11,7 @@ class Sfixed64Field < Int64Field def decode(bytes) values = bytes.unpack('VV') # 'Q' is machine-dependent, don't use value = values[0] + (values[1] << 32) - value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000).nonzero? + value -= 0x1_0000_0000_0000_0000 if (value & 0x8000_0000_0000_0000) != 0 value end diff --git a/lib/protobuf/field/signed_integer_field.rb b/lib/protobuf/field/signed_integer_field.rb index 8945f771..3317f0a7 100644 --- a/lib/protobuf/field/signed_integer_field.rb +++ b/lib/protobuf/field/signed_integer_field.rb @@ -9,7 +9,7 @@ class SignedIntegerField < VarintField # def decode(value) - if (value & 1).zero? + if (value & 1) == 0 value >> 1 # positive value else ~value >> 1 # negative value From 48e06f81a6d12c7db6d5ab0f33b517ea13d07bfd Mon Sep 17 00:00:00 2001 From: Garrett Thornburg Date: Sun, 28 Feb 2016 09:13:05 -0700 Subject: [PATCH 4/5] Alpha-order gemspec dependencies --- protobuf.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protobuf.gemspec b/protobuf.gemspec index 48527f35..b0f039d2 100644 --- a/protobuf.gemspec +++ b/protobuf.gemspec @@ -24,6 +24,7 @@ require "protobuf/version" s.add_dependency 'thor' s.add_dependency 'thread_safe' + s.add_development_dependency 'benchmark-ips' s.add_development_dependency 'ffi-rzmq' s.add_development_dependency 'rake' s.add_development_dependency 'rspec', '>= 3.0' @@ -31,7 +32,6 @@ require "protobuf/version" s.add_development_dependency 'simplecov' s.add_development_dependency 'timecop' s.add_development_dependency 'yard' - s.add_development_dependency 'benchmark-ips' # debuggers only work in MRI if RUBY_ENGINE.to_sym == :ruby From 6efe05254e091956a24e6796e6a690a954471b31 Mon Sep 17 00:00:00 2001 From: Garrett Thornburg Date: Thu, 17 Mar 2016 21:56:08 -0600 Subject: [PATCH 5/5] Fix define_accessors to work with full qualified field names Without this, specs won't even run. --- lib/protobuf/field/base_field.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/protobuf/field/base_field.rb b/lib/protobuf/field/base_field.rb index fa2f4410..05756bce 100644 --- a/lib/protobuf/field/base_field.rb +++ b/lib/protobuf/field/base_field.rb @@ -179,15 +179,15 @@ def fully_qualified_name_only! def define_accessor(simple_field_name, fully_qualified_field_name) message_class.class_eval <<-ruby, __FILE__, __LINE__ def #{simple_field_name}! - @values[:#{fully_qualified_field_name}] + @values[:"#{fully_qualified_field_name}"] end def #{simple_field_name} - self[:#{fully_qualified_field_name}] + self[:"#{fully_qualified_field_name}"] end def #{simple_field_name}=(value) - self[:#{fully_qualified_field_name}] = value + self[:"#{fully_qualified_field_name}"] = value end ruby